Skip to content

TX goes through but FallbackProvider throws 'already known' or 'nonce too low' error #4186

@chicken-juju

Description

@chicken-juju

Ethers Version

6.6.2

Search Terms

provider

Describe the Problem

My provider is configured as follows

export const provider = new ethers.FallbackProvider([
  {
    provider: new ethers.JsonRpcProvider(process.env.NODE_URL_1),
    priority: 1,
    weight: 2
  },
  {
    provider: new ethers.JsonRpcProvider(process.env.NODE_URL_2),
    priority: 2,
    weight: 2
  },
  {
    provider: new ethers.JsonRpcProvider(process.env.NODE_URL_3),
    priority: 3,
    weight: 2
  }
])

When making a smart contract call await contractName.something() the TX succeeds on the explorer but ethers throws one of these errors-

Feed update failed Error: nonce has already been used (transaction="0x02f8b5820fa2830468d8843b9aca0084b2d05e0083030d409428e449afc8a04ed97ca840aa83b64c7c1f5f55ad80b84417835d1c000000000000000000000000000000000000000000000000000000000004809900000000000000000000000000000000000000000000000000000000649d5023c080a0b6c47a90cdae1b294a9349db737ab282ce77b9c201777efaa6b8c0446e0156c9a04d5a1d45dc73d4017e688797e583c232ca1382e1ecdfbf0377578282862cbf44", info={ "error": { "code": -32000, "message": "nonce too low" } }, code=NONCE_EXPIRED, version=6.6.2)
    at makeError (/home/hp/Documents/voodoo/voodoo-keeper-server/node_modules/ethers/src.ts/utils/errors.ts:677:21)
    at JsonRpcProvider.getRpcError (/home/hp/Documents/voodoo/voodoo-keeper-server/node_modules/ethers/src.ts/providers/provider-jsonrpc.ts:949:33)
    at /home/hp/Documents/voodoo/voodoo-keeper-server/node_modules/ethers/src.ts/providers/provider-jsonrpc.ts:524:45
    at processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 'NONCE_EXPIRED',
  transaction: '0x02f8b5820fa2830468d8843b9aca0084b2d05e0083030d409428e449afc8a04ed97ca840aa83b64c7c1f5f55ad80b84417835d1c000000000000000000000000000000000000000000000000000000000004809900000000000000000000000000000000000000000000000000000000649d5023c080a0b6c47a90cdae1b294a9349db737ab282ce77b9c201777efaa6b8c0446e0156c9a04d5a1d45dc73d4017e688797e583c232ca1382e1ecdfbf0377578282862cbf44',
  info: { error: { code: -32000, message: 'nonce too low' } }
}
Feed update failed Error: could not coalesce error (error={ "code": -32000, "message": "already known" }, payload={ "id": 37, "jsonrpc": "2.0", "method": "eth_sendRawTransaction", "params": [ "0x02f8b5820fa2830468db843b9aca0084b2d05e0083030d409428e449afc8a04ed97ca840aa83b64c7c1f5f55ad80b84417835d1c00000000000000000000000000000000000000000000000000000000000480ee00000000000000000000000000000000000000000000000000000000649d50a1c080a08d69aa7c4989adaf2ae58f5f44d08ce7adb4a614b9fd02e26c4dde547a925d57a06f99a70f002bf589df028b26ccf6abf3f554da8feaa8e594b5f72e52a31ff7d8" ] }, code=UNKNOWN_ERROR, version=6.6.2)
    at makeError (/home/hp/Documents/voodoo/voodoo-keeper-server/node_modules/ethers/src.ts/utils/errors.ts:677:21)
    at JsonRpcProvider.getRpcError (/home/hp/Documents/voodoo/voodoo-keeper-server/node_modules/ethers/src.ts/providers/provider-jsonrpc.ts:977:25)
    at /home/hp/Documents/voodoo/voodoo-keeper-server/node_modules/ethers/src.ts/providers/provider-jsonrpc.ts:524:45
    at processTicksAndRejections (node:internal/process/task_queues:95:5) {
  code: 'UNKNOWN_ERROR',
  error: { code: -32000, message: 'already known' },
  payload: {
    method: 'eth_sendRawTransaction',
    params: [
      '0x02f8b5820fa2830468db843b9aca0084b2d05e0083030d409428e449afc8a04ed97ca840aa83b64c7c1f5f55ad80b84417835d1c00000000000000000000000000000000000000000000000000000000000480ee00000000000000000000000000000000000000000000000000000000649d50a1c080a08d69aa7c4989adaf2ae58f5f44d08ce7adb4a614b9fd02e26c4dde547a925d57a06f99a70f002bf589df028b26ccf6abf3f554da8feaa8e594b5f72e52a31ff7d8'
    ],
    id: 37,
    jsonrpc: '2.0'
  }
}

One reason could be that Ethers calls eth_sendRawTransaction on multiple RPC servers. The first TX succeeds and the duplicates fail. Some context about our setup. We want to run one JsonRpcProvider at a time. The others are for redundancy and are therefore have different priorities. The errors are not thrown if we leave a single RPC and comment out the rest.

Code Snippet

No response

Contract ABI

No response

Errors

No response

Environment

Ethereum (mainnet/ropsten/rinkeby/goerli), Altcoin - Please specify (e.g. Polygon), node.js (v12 or newer)

Environment (Other)

Fantom testnet

Metadata

Metadata

Assignees

Labels

enhancementNew feature or improvement.fixed/completeThis Bug is fixed or Enhancement is complete and published.v6Issues regarding v6

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions