ERC20 transfer reports "Transferred" when the transaction reverts (receipt status ignored)

Abierto Apto para principiantes
#1,558 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

@AgenticFinanceGraph ya está trabajando en esto.

Desde el 12/10/2026.

  • #1556 de @AgenticFinanceGraph — abierto
  • #1610 de @ninglinLiu — abierto

Evaluación

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

Línea de trabajo

Empieza en ERC20ActionProvider.transfer e inspecciona cómo se gestiona el recibo devuelto por waitForTransactionReceipt; el issue indica que la ruta estándar de transferencia lo descarta, y que approve y gasless transfer podrían hacer lo mismo. Añade pruebas para un recibo revertido y verifica que la action indique un fallo en lugar de afirmar que la transferencia se realizó correctamente. El issue ofrece un archivo de reproducción, pero no menciona archivos de prueba.

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

Descripción

Version: @coinbase/agentkit 0.10.4 (latest on npm); same code on main at 2e6dbaf.

What happens. ERC20ActionProvider.transfer sends the transaction, awaits the receipt and then always returns a success message:

const hash = await walletProvider.sendTransaction({ ... functionName: "transfer" ... });
await walletProvider.waitForTransactionReceipt(hash); // receipt discarded
return Transferred ${args.amount} of ${tokenDetails?.name} ...;
With ViemWalletProvider, waitForTransactionReceipt resolves with status: "reverted" for a mined, failed transaction; it does not throw. So a transfer that reverts after AgentKit's pre-checks pass is reported to the agent as "Transferred …", with the hash. No tokens moved.

This happens whenever the token's state changes between gas estimation and inclusion: an issuer pause or blacklist (as USDC supports), a balance or allowance used by a concurrent transaction, or a token with conditional transfer logic.

Reproduction. Attached agentkit-reverted-transfer-poc.zip: npm install && node poc.mjs. It runs on a local Ganache chain with throwaway keys, using the unmodified AgentKit, ViemWalletProvider and erc20ActionProvider; the only test hook pauses the token immediately before the signed transfer is broadcast.

== Control: normal transfer
AgentKit output : Transferred 100 of PoC Token (0x…) to 0x….
Receipt status : success
Transfer events : 1
Payee received : 100 POC
== Bug: token paused after signing, before inclusion
AgentKit output : Transferred 100 of PoC Token (0x…) to 0x….
Receipt status : reverted
Transfer events : 0
Payee received : 0 POC
The same behaviour on public Base Sepolia with our own test token and wallet: https://sepolia.basescan.org/tx/0x844bfcd961a4422ce050bef365f1274b480db60504b55311c1a97287ae839a82 (reverted, no Transfer event; AgentKit returned "Transferred 200 … Transaction hash for the transfer: 0x844bfcd9…").

Why it matters. An agent is told a payment succeeded, with a valid hash, when nothing moved. It then marks the invoice paid or confirms the order. No funds are taken from the wallet; the problem is a false payment confirmation.

Suggested fix.

const receipt = await walletProvider.waitForTransactionReceipt(hash);
if (receipt.status !== "success") {
return Error: transfer transaction ${hash} was mined but reverted; no tokens were transferred.;
}
By code inspection (not separately reproduced), approve and the gasless-transfer path of transfer in the published 0.10.4 build follow the same pattern.

Related: #1547 is the opposite case (a sent transfer reported as failed because the receipt lookup throws). A fix for both could wait for the receipt in its own try, return the hash with "sent, not confirmed" when the wait throws, and return an explicit revert error when status is "reverted".

Happy to open a PR with the fix and tests.

Found with EmberTail (https://embertail.xyz/), which tests payment correctness of AI agents.

agentkit-reverted-transfer-poc.zip

Lenguaje dominante
TypeScript
Estrellas
1.4k
Forks
900
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.