Skip to content

bug: eth_estimateGas unreliable on Arc Testnet — all CCTP/USDC write transactions require explicit gasLimit override #80

@osr21

Description

@osr21

Summary

When building a CCTP V2 bridge dapp against Arc Testnet, eth_estimateGas consistently fails or returns incorrect values for all USDC write transactions. The same transactions succeed fine when an explicit gasLimit override is provided.

Affected Calls

All EVM write transactions on Arc Testnet, including:

  • ERC-20 approve
  • ERC-20 transfer
  • CCTP V2 depositForBurn on TokenMessenger (0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA)
  • CCTP V2 receiveMessage on MessageTransmitter (0xE737e5cEBEEBa77EFE34D4aa090756590b1CE275)

Observed Errors

Sending transactions without a manual gas limit via ethers.js v6 BrowserProvider (MetaMask) throws one of:

Error: missing revert data
Error: could not estimate gas; transaction may fail or may require manual gas limit
Error: execution reverted (no reason string)

The same calls succeed immediately when submitted with:

{ gasLimit: 600_000n }

Environment

  • Arc Testnet (Chain ID 5042002)
  • RPC: https://rpc.drpc.testnet.arc.network
  • ethers.js v6 via MetaMask BrowserProvider
  • USDC native gas token (this may be the root cause — eth_estimateGas may not correctly simulate gas cost when the gas token is an ERC-20 rather than a native coin)

Root Cause Hypothesis

Arc's USDC-as-gas model means gas cost is paid in an ERC-20 token. Standard eth_estimateGas may not correctly account for the ERC-20 balance check when simulating transactions, causing it to incorrectly predict that transactions will revert. The transaction itself succeeds on-chain when submitted with a fixed gas limit.

Workaround

Always provide an explicit gasLimit for all Arc write transactions:

const tx = await contract.someMethod(args, { gasLimit: 600_000n });

600,000 is more than sufficient for CCTP operations; typical actual gas used is 50,000–150,000.

Impact

This breaks all standard EVM tooling that relies on gas estimation (Hardhat, ethers.js without overrides, wagmi, etc.) unless the developer knows to add explicit gas limits. It should be documented prominently in the Arc developer docs and ideally fixed at the RPC/node level.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions