foundry-rs / foundry

Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.
https://getfoundry.sh
Apache License 2.0
8.22k stars 1.71k forks source link

bug(`anvil`): `nonce too low` after anvil restarts with state #9053

Open 0xbok opened 1 week ago

0xbok commented 1 week ago

Component

Anvil

Have you ensured that all of these are up to date?

What version of Foundry are you on?

forge 0.2.0 (8905af3 2024-10-07T03:18:50.978938000Z)

What command(s) is the bug in?

No response

Operating System

macOS (Apple Silicon)

Describe the bug

Steps to reproduce the bug:

  1. anvil -f https://eth.llamarpc.com --chain-id 31337 --state anvil-state where anvil-state is an empty directory.
  2. cast send 0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0 --value "1 ether" --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --rpc-url http://127.0.0.1:8545
  3. cast balance 0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0 --rpc-url http://127.0.0.1:8545 shows corect balance

Now restart anvil with the same command.

  1. cast balance 0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0 --rpc-url http://127.0.0.1:8545 shows 0 balance. This should show the same balance as before since it loads the dumped state.
  2. cast send 0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0 --value "1 ether" --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --rpc-url http://127.0.0.1:8545 says:

server returned an error response: error code -32003: nonce too low

zerosnacks commented 1 week ago

cc @yash-atreya

Similar to https://github.com/foundry-rs/foundry/pull/9021 I think

zerosnacks commented 1 week ago

Able to reproduce, state looks like this:

Where sender is 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 to 0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0

When reloading the state it attempts to send with nonce 784 instead of 785

{
   "block":{
      "number":"0x13f2216",
      "coinbase":"0x0000000000000000000000000000000000000000",
      "timestamp":"0x67040449",
      "gas_limit":"0x1c9c380",
      "basefee":"0x8668a9b0c",
      "difficulty":"0x0",
      "prevrandao":"0xc94440a55c39aa8130b5f1300a748c3f00641c2835b34aa8681a1bfa3015fec9",
      "blob_excess_gas_and_price":{
         "excess_blob_gas":0,
         "blob_gasprice":1
      }
   },
   "accounts":{
      "0x0000000000000000000000000000000000000000":{
         "nonce":0,
         "balance":"0x2d62361ec22a83b4bb5",
         "code":"0x",
         "storage":{

         }
      },
      "0x14dC79964da2C08b23698B3D3cc7Ca32193d9955":{
         "nonce":0,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65":{
         "nonce":18,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0x23618e81E3f5cdF7f54C3d65f7FBc0aBf5B21E8f":{
         "nonce":11,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC":{
         "nonce":47,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0x70997970C51812dc3A010C7d01b50e0d17dc79C8":{
         "nonce":157,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0x90F79bf6EB2c4f870365E785982E1f101E93b906":{
         "nonce":41,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0":{
         "nonce":0,
         "balance":"0xde0b6b3a7640000",
         "code":"0x",
         "storage":{

         }
      },
      "0x976EA74026E726554dB657fA54763abd0C3a0aa9":{
         "nonce":12,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc":{
         "nonce":30,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0xa0Ee7A142d267C1f36714E4a8F75612F20a79720":{
         "nonce":9,
         "balance":"0x21e19e0c9bab2400000",
         "code":"0x",
         "storage":{

         }
      },
      "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266":{
         "nonce":785,
         "balance":"0x21e0bfd4ed1ff52ffa0",
         "code":"0x",
         "storage":{

         }
      }
   },
   "best_block_number":"0x13f2216",
   "blocks":[
      {
         "header":{
            "parentHash":"0x766f342443de603109f02e2a5911db3c8e563bb3de8608aaf70a36d5f7d6b188",
            "ommersHash":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
            "beneficiary":"0x0000000000000000000000000000000000000000",
            "stateRoot":"0x0000000000000000000000000000000000000000000000000000000000000000",
            "transactionsRoot":"0xab23a7c791e63f60aa204f11b8a60a8719d1fe823a87947a5aa628b5478bb228",
            "receiptsRoot":"0xf78dfb743fbd92ade140711c8bbc542b5e307f0ab7984eff35d751969fe57efa",
            "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
            "difficulty":"0xed697dd933971e0e7f46b64c2e31a11285f0450c9ed0ed902c9ccd7d87fad712",
            "number":"0x13f2216",
            "gasLimit":"0x1c9c380",
            "gasUsed":"0x5208",
            "timestamp":"0x67040449",
            "mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
            "nonce":"0x0000000000000000",
            "baseFeePerGas":"0x8668a9b0c",
            "blobGasUsed":"0x0",
            "excessBlobGas":"0x0",
            "extraData":"0x"
         },
         "transactions":[
            {
               "transaction":{
                  "EIP1559":{
                     "chainId":"0x7a69",
                     "nonce":"0x310",
                     "gasLimit":"0x5209",
                     "maxFeePerGas":"0x1278ddf460",
                     "maxPriorityFeePerGas":"0x3b9aca00",
                     "to":"0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0",
                     "value":"0xde0b6b3a7640000",
                     "accessList":[

                     ],
                     "input":"0x",
                     "r":"0x2a31feee2256f0f6925343771cd2dc0e5f7f7b79178728c6b9c1e1c53c7c4c60",
                     "s":"0x67da3f72f6f17013f3698b10c8f207ff1551b101299acc16afc22acdb4297534",
                     "yParity":"0x0",
                     "hash":"0x0ddd17c639262bd7fa98bfcde685e0b50a1828c3a2f2935c07b54fdacc3df216"
                  }
               },
               "impersonated_sender":null
            }
         ],
         "ommers":[

         ]
      }
   ],
   "transactions":[
      {
         "info":{
            "transaction_hash":"0x0ddd17c639262bd7fa98bfcde685e0b50a1828c3a2f2935c07b54fdacc3df216",
            "transaction_index":0,
            "from":"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
            "to":"0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0",
            "contract_address":null,
            "traces":[
               {
                  "parent":null,
                  "children":[

                  ],
                  "idx":0,
                  "trace":{
                     "depth":0,
                     "success":true,
                     "caller":"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
                     "address":"0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0",
                     "maybe_precompile":null,
                     "selfdestruct_address":null,
                     "selfdestruct_refund_target":null,
                     "selfdestruct_transferred_value":null,
                     "kind":"CALL",
                     "value":"0xde0b6b3a7640000",
                     "data":"0x",
                     "output":"0x",
                     "gas_used":0,
                     "gas_limit":1,
                     "status":"Stop",
                     "steps":[

                     ],
                     "decoded":{
                        "label":null,
                        "return_data":null,
                        "call_data":null
                     }
                  },
                  "logs":[

                  ],
                  "ordering":[

                  ]
               }
            ],
            "exit":"Stop",
            "out":"0x",
            "nonce":784,
            "gas_used":21000
         },
         "receipt":{
            "type":"0x2",
            "status":"0x1",
            "cumulativeGasUsed":"0x5208",
            "logs":[

            ],
            "logsBloom":"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
         },
         "block_hash":"0x01940dd7c1f991657b92de0783d6e781e5b7eef67024604ec02240d1f3851fa1",
         "block_number":20914710
      }
   ],
   "historical_states":null
}
0xbok commented 1 week ago

also notice the other bug where the balance is reset to 0 (so the state is ignored).

yash-atreya commented 1 week ago

Able to reproduce, state looks like this:

Where sender is 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 to 0x9276449EaC5b4f7Bc17cFC6700f7BeeB86F9bCd0

When reloading the state it attempts to send with nonce 784 instead of 785

Looking into it

zerosnacks commented 1 week ago

I think one aspect that it key is that the bug only (?) occurs when you wait some time between launching the forks

I think that if the block on mainnet has advanced beyond the forked state it rejects (~15 secs) and this happens mostly when you apply only a single transaction

If you launch and tear down the described setup multiple times rapidly the balance is correct and the nonce is OK