SPL transfer and Jupiter swap fail for fractional amounts like 2.01
Maintainers usually reply within 1 day
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 35/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Stale
- Tech stack
- typescript
Research direction
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.
Written by the indexing model from the issue text.
Description
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.
- Dominant language
- TypeScript
- Stars
- 1.3k
- Forks
- 871
- PR merge metrics
- No merged PRs in 30d
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from coinbase/agentkit
-
Moonwell redeem fails on Base Sepolia and uses 18 decimals for cbBTCPossibly taken @sebxt claimed this 3 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
coinbase/agentkit#1578 · 1 comment ·
Maintainers usually reply within 1 day
-
ERC20 transfer reports "Transferred" when the transaction reverts (receipt status ignored)Possibly taken @AgenticFinanceGraph claimed this 11 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
coinbase/agentkit#1558 · 1 comment ·
Maintainers usually reply within 1 day
-
[TypeScript] `ViemWalletProvider` rejects a wallet client from a newer viem than the exactly pinned one (TS2345, `tokens` missing on `Client`)Possibly taken @PrabalParihar claimed this 2 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
coinbase/agentkit#1532 · 3 comments ·
Maintainers usually reply within 1 day
-
coinbase-agentkit 0.7.x fails on fresh install: imports solana.rpc.api, which solana>=0.37 removedPossibly taken @JulienKervarrec claimed this 30 days ago. Open
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Maintainers usually reply within 1 day
-
[Proposal] External spend authority for AgentKit wallets (fail-closed, signed verdicts + receipts)Open
Difficulty 5/5 Over a week Newbie friendliness 28/100
Maintainers usually reply within 1 day
All issues in coinbase/agentkit
Similar issues
-
level/task type/bug
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
wazuh/wazuh-dashboard-plugins#9508 ·
Maintainers usually reply within 1 day
-
Testnet EOL page links Zonescan mainnetPossibly taken @napelvs claimed this today. Open
Difficulty 1/5 Under an hour Newbie friendliness 76/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Azure-Samples/azure-search-openai-demo#3249 ·
Maintainers usually reply within 1 day
-
[Docs] docs/architecture.mermaid leaves out 21 of the 51 src/ directoriesPossibly taken @uyg7x claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
Maintainers usually reply within 1 day
-
enhancement status:needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
dongdongbh/Mindwtr#1438 ·
Maintainers usually reply within 1 day