Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

SPL transfer and Jupiter swap fail for fractional amounts like 2.01

Abierto
#1,574 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@sebxt ya está trabajando en esto.

Desde el 18/10/2026.

  • #1575 de @sebxt — abierto

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Estancado
Stack tecnológico
typescript
Área
api, backend

Línea de trabajo

Start with typescript/agentkit/src/action-providers/spl/splActionProvider.ts and typescript/agentkit/src/action-providers/jupiter/jupiterActionProvider.ts, where both actions scale the amount by the mint decimals. Check the tests around SPL transfers and Jupiter quote requests, then verify that 2.01 USDC becomes the integer base unit amount 2010000 for both actions. An open linked pull request already addresses this issue.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

What happens

SplActionProvider.transfer converts the whole unit amount to base units with plain floating point math and then calls BigInt on the result:

const adjustedAmount = args.amount * Math.pow(10, mintInfo.decimals);
...
if (sourceAccount.amount < BigInt(adjustedAmount)) {

For many ordinary amounts the product is not an integer. With a 6 decimal mint (USDC), 2.01 * 10 ** 6 is 2009999.9999999998, so BigInt throws and the action returns:

Error transferring SPL tokens: RangeError: The number 2009999.9999999998 cannot be converted to a BigInt because it is not an integer

Other examples with 6 decimals: 2.03, 2.05, 4.02. With 9 decimals: 1.07, 2.01.

JupiterActionProvider.swap uses the same conversion (args.amount * 10 ** mintInfo.decimals) and passes the fractional value straight to quoteGet as amount, so the quote request carries amount=2009999.9999999998 instead of the integer base unit amount the Jupiter API expects.

What should happen

Both actions should convert the amount to an integer number of base units (2.01 USDC is 2010000) and proceed.

Minimal repro

const provider = new SplActionProvider();
// mint with 6 decimals, sender holds enough balance
await provider.transfer(wallet, { recipient, mintAddress, amount: 2.01 });
// => "Error transferring SPL tokens: RangeError: The number 2009999.9999999998 cannot be converted to a BigInt because it is not an integer"

Or directly: BigInt(2.01 * Math.pow(10, 6)) throws.

Root cause

typescript/agentkit/src/action-providers/spl/splActionProvider.ts and typescript/agentkit/src/action-providers/jupiter/jupiterActionProvider.ts scale a JS number by 10 ** decimals without rounding. Binary floating point cannot represent most decimal fractions exactly, so the product is often a hair above or below the intended integer.

Lenguaje dominante
TypeScript
Estrellas
1.3k
Forks
871
Métricas de merge de PR
Sin PR fusionados en 30 d

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de coinbase/agentkit

Todos los issues de coinbase/agentkit

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.