From 4e6f4f11c401478d1c2d59a6e98949f1e3a2f16d Mon Sep 17 00:00:00 2001 From: Legion's Date: Sat, 1 Jun 2024 17:12:50 +0700 Subject: [PATCH] update deploy vitest + vite browser update all packages rebuild use deploy vitest+vite update client --- .github/workflows/browser.yml | 8 +- .github/workflows/codeql.yml | 76 +- .github/workflows/static.yml | 4 +- azure-pipelines.yml | 21 - codeql.yml | 91 - false | 6 + package-lock.json | 3456 +++++++++++++++-- package.json | 21 +- packages/block/CHANGELOG.md | 40 + packages/block/README.md | 7 +- packages/block/docs/README.md | 37 +- packages/block/docs/classes/Block.md | 112 +- packages/block/docs/classes/BlockHeader.md | 113 +- packages/block/docs/interfaces/BlockData.md | 21 +- packages/block/docs/interfaces/HeaderData.md | 40 +- packages/block/docs/interfaces/JsonBlock.md | 19 +- packages/block/docs/interfaces/JsonHeader.md | 40 +- .../block/docs/interfaces/JsonRpcBlock.md | 63 +- .../docs/interfaces/VerkleExecutionWitness.md | 40 + packages/block/docs/interfaces/VerkleProof.md | 71 + .../block/docs/interfaces/VerkleStateDiff.md | 30 + packages/block/examples/4844.ts | 8 +- packages/block/package.json | 14 +- packages/block/src/block.ts | 72 +- packages/block/src/from-beacon-payload.ts | 106 +- packages/block/src/helpers.ts | 5 +- packages/block/src/index.ts | 2 +- packages/block/src/types.ts | 96 +- packages/block/test/block.spec.ts | 49 +- packages/block/test/eip4844block.spec.ts | 17 +- packages/block/test/eip4895block.spec.ts | 19 +- .../block/test/from-beacon-payload.spec.ts | 13 +- packages/blockchain/CHANGELOG.md | 41 + packages/blockchain/README.md | 2 + .../blockchain/docs/classes/Blockchain.md | 64 +- packages/blockchain/package.json | 16 +- packages/blockchain/src/blockchain.ts | 152 +- .../blockchain/test/customConsensus.spec.ts | 8 +- packages/client/CHANGELOG.md | 17 + packages/client/README.md | 15 + packages/client/bin/cli.ts | 166 +- .../devnets/4844-interop/tools/txGenerator.ts | 8 +- packages/client/docs/README.md | 3 - packages/client/docs/classes/Config.md | 664 +++- packages/client/docs/enums/SyncMode.md | 15 +- .../client/docs/interfaces/ConfigOptions.md | 427 +- packages/client/package.json | 31 +- packages/client/src/blockchain/chain.ts | 10 +- packages/client/src/config.ts | 19 +- packages/client/src/execution/vmexecution.ts | 107 +- packages/client/src/miner/pendingBlock.ts | 2 +- packages/client/src/net/server/rlpxserver.ts | 10 +- .../rpc/modules/engine/CLConnectionManager.ts | 1 - .../client/src/rpc/modules/engine/engine.ts | 15 + .../client/src/rpc/modules/engine/types.ts | 13 +- .../src/rpc/modules/engine/util/generic.ts | 3 +- packages/client/src/rpc/modules/eth.ts | 4 +- packages/client/src/rpc/modules/web3.ts | 7 +- packages/client/src/rpc/types.ts | 40 +- packages/client/src/service/txpool.ts | 39 +- packages/client/src/types.ts | 13 + packages/client/src/util/metrics.ts | 22 + packages/client/test/miner/miner.spec.ts | 17 +- .../client/test/miner/pendingBlock.spec.ts | 21 +- packages/client/test/net/peer/peer.spec.ts | 7 +- packages/client/test/net/peerpool.spec.ts | 2 +- .../test/net/protocol/ethprotocol.spec.ts | 18 +- .../client/test/net/server/rlpxserver.spec.ts | 6 +- .../rpc/engine/CLConnectionManager.spec.ts | 59 +- .../test/rpc/engine/getPayloadV3.spec.ts | 10 +- .../client/test/rpc/engine/kaustinen6.spec.ts | 231 ++ .../newPayloadV3VersionedHashes.spec.ts | 6 +- .../client/test/rpc/eth/getBalance.spec.ts | 2 +- .../test/rpc/eth/getBlockByNumber.spec.ts | 7 +- .../client/test/rpc/eth/getFeeHistory.spec.ts | 11 +- .../test/rpc/eth/getTransactionCount.spec.ts | 4 +- .../rpc/eth/getTransactionReceipt.spec.ts | 8 +- .../test/rpc/eth/sendRawTransaction.spec.ts | 8 +- packages/client/test/rpc/helpers.ts | 12 +- .../test/service/fullethereumservice.spec.ts | 2 +- .../test/service/lightethereumservice.spec.ts | 2 +- packages/client/test/sim/4844-devnet.spec.ts | 2 +- packages/client/test/sim/simutils.ts | 11 +- packages/client/test/sim/snapsync.spec.ts | 27 +- packages/client/test/sim/txGenerator.ts | 5 +- packages/client/test/sync/beaconsync.spec.ts | 16 +- .../test/sync/fetcher/accountfetcher.spec.ts | 4 +- .../test/sync/fetcher/bytecodefetcher.spec.ts | 7 - .../client/test/sync/fetcher/fetcher.spec.ts | 68 +- .../test/sync/fetcher/headerfetcher.spec.ts | 7 +- .../test/sync/fetcher/storagefetcher.spec.ts | 30 +- packages/client/test/sync/lightsync.spec.ts | 83 +- packages/client/test/sync/skeleton.spec.ts | 82 +- packages/client/test/sync/snapsync.spec.ts | 6 +- packages/client/test/sync/txpool.spec.ts | 91 +- .../test/testdata/blocks/kaustinen4.json | 1932 +++++++++ .../testdata/geth-genesis/kaustinen6.json | 901 +++++ .../test/testdata/gethk5vecs/block0.rlp.hex | 1 + .../test/testdata/gethk5vecs/block1.rlp.hex | 1 + .../test/testdata/gethk5vecs/block2.rlp.hex | 1 + .../test/testdata/gethk5vecs/statediffs.json | 457 +++ .../test/testdata/gethk5vecs/traces.jsonl | 529 +++ packages/common/CHANGELOG.md | 41 + packages/common/README.md | 22 +- packages/common/docs/README.md | 21 +- packages/common/docs/classes/Common.md | 101 +- .../docs/interfaces/BootstrapNodeConfig.md | 14 +- .../common/docs/interfaces/ChainConfig.md | 17 +- packages/common/docs/interfaces/CommonOpts.md | 10 +- .../docs/interfaces/CustomCommonOpts.md | 8 +- .../common/docs/interfaces/CustomCrypto.md | 23 +- .../interfaces/EVMStateManagerInterface.md | 37 +- .../docs/interfaces/GenesisBlockConfig.md | 14 +- .../common/docs/interfaces/GethConfigOpts.md | 12 +- .../common/docs/interfaces/HardforkByOpts.md | 6 +- .../interfaces/HardforkTransitionConfig.md | 10 +- .../docs/interfaces/StateManagerInterface.md | 21 + packages/common/examples/initKzg.ts | 8 +- packages/common/package.json | 6 +- packages/common/src/chains.ts | 10 +- packages/common/src/common.ts | 5 +- packages/common/src/eips.ts | 85 +- packages/common/src/enums.ts | 8 +- packages/common/src/hardforks.ts | 2 +- packages/common/src/interfaces.ts | 1 + packages/common/src/types.ts | 24 +- packages/common/src/utils.ts | 58 +- packages/common/test/customChains.spec.ts | 5 +- packages/common/test/customCrypto.spec.ts | 3 +- packages/common/test/eips.spec.ts | 14 +- packages/common/test/params.spec.ts | 22 +- packages/devp2p/CHANGELOG.md | 5 + .../devp2p/examples/peer-communication-les.ts | 13 +- .../devp2p/examples/peer-communication.ts | 9 +- packages/devp2p/package.json | 10 +- packages/devp2p/src/protocol/eth.ts | 31 +- packages/devp2p/src/protocol/les.ts | 31 +- packages/devp2p/src/protocol/protocol.ts | 10 +- packages/devp2p/src/protocol/snap.ts | 15 +- packages/devp2p/src/rlpx/peer.ts | 19 +- packages/devp2p/src/rlpx/rlpx.ts | 6 +- .../test/integration/dpt-simulator.spec.ts | 6 +- .../test/integration/eth-simulator.spec.ts | 38 +- packages/devp2p/test/integration/util.ts | 3 +- packages/ethash/CHANGELOG.md | 4 + packages/ethash/docs/README.md | 2 +- packages/ethash/docs/classes/Ethash.md | 34 +- packages/ethash/docs/classes/Miner.md | 10 +- packages/ethash/package.json | 8 +- packages/evm/CHANGELOG.md | 62 + packages/evm/README.md | 19 +- packages/evm/docs/README.md | 30 +- packages/evm/docs/interfaces/EVMInterface.md | 12 +- packages/evm/docs/interfaces/EVMOpts.md | 164 + packages/evm/docs/interfaces/EVMResult.md | 4 +- packages/evm/docs/interfaces/ExecResult.md | 20 +- packages/evm/docs/interfaces/bn128.md | 85 + packages/evm/examples/simple.ts | 2 +- packages/evm/package.json | 15 +- packages/evm/src/evm.ts | 207 +- packages/evm/src/exceptions.ts | 2 - packages/evm/src/index.ts | 21 +- packages/evm/src/interpreter.ts | 22 +- packages/evm/src/journal.ts | 4 +- packages/evm/src/opcodes/EIP2929.ts | 12 +- packages/evm/src/opcodes/codes.ts | 8 - packages/evm/src/opcodes/functions.ts | 187 +- packages/evm/src/opcodes/gas.ts | 327 +- packages/evm/src/opcodes/util.ts | 7 - packages/evm/src/precompiles/06-ecadd.ts | 2 +- packages/evm/src/precompiles/07-ecmul.ts | 2 +- packages/evm/src/precompiles/08-ecpairing.ts | 2 +- .../evm/src/precompiles/0b-bls12-g1add.ts | 84 + .../evm/src/precompiles/0c-bls12-g1mul.ts | 87 + .../evm/src/precompiles/0d-bls12-g1msm.ts | 122 + .../evm/src/precompiles/0e-bls12-g2add.ts | 88 + .../evm/src/precompiles/0f-bls12-g2mul.ts | 90 + .../evm/src/precompiles/10-bls12-g2msm.ts | 123 + .../evm/src/precompiles/11-bls12-pairing.ts | 142 + .../src/precompiles/12-bls12-map-fp-to-g1.ts | 74 + .../src/precompiles/13-bls12-map-fp2-to-g2.ts | 81 + packages/evm/src/precompiles/index.ts | 99 + .../evm/src/precompiles/util/bls12_381.ts | 344 ++ packages/evm/src/types.ts | 10 +- packages/evm/test/customOpcodes.spec.ts | 2 +- packages/evm/test/customPrecompiles.spec.ts | 4 +- packages/evm/test/eips/eip-5656.spec.ts | 3 +- packages/evm/test/opcodes.spec.ts | 19 - .../evm/test/precompiles/05-modexp.spec.ts | 29 +- .../precompiles/0a-pointevaluation.spec.ts | 6 +- .../test/precompiles/0b-bls12-g1add.spec.ts | 106 + .../test/precompiles/0c-bls12-g1mul.spec.ts | 97 + .../test/precompiles/0d-bls12-g1msm.spec.ts | 133 + .../test/precompiles/0e-bls12-g2add.spec.ts | 106 + .../test/precompiles/0f-bls12-g2mul.spec.ts | 97 + .../test/precompiles/10-bls12-g2msm.spec.ts | 124 + .../test/precompiles/11-bls12-pairing.spec.ts | 837 ++++ .../test/precompiles/12-bls12-g1map.spec.ts | 81 + .../test/precompiles/13-bls12-g2map.spec.ts | 81 + .../evm/test/precompiles/eip-2537-BLS.spec.ts | 112 + packages/evm/test/runCode.spec.ts | 8 +- packages/evm/test/stack.spec.ts | 2 +- packages/genesis/CHANGELOG.md | 6 +- packages/genesis/docs/README.md | 34 + packages/genesis/package.json | 10 +- packages/genesis/test/index.spec.ts | 2 +- packages/rlp/package.json | 2 +- packages/rlp/test/integration.spec.ts | 25 +- packages/rlp/vitest.browser.config.mts | 12 + packages/statemanager/CHANGELOG.md | 44 + .../docs/classes/AccessWitness.md | 6 +- .../docs/classes/DefaultStateManager.md | 86 +- .../docs/classes/RPCBlockChain.md | 8 +- .../docs/classes/RPCStateManager.md | 46 +- .../classes/StatelessVerkleStateManager.md | 25 + packages/statemanager/package.json | 19 +- packages/statemanager/src/accessWitness.ts | 41 +- packages/statemanager/src/cache/account.ts | 13 +- packages/statemanager/src/rpcStateManager.ts | 29 +- packages/statemanager/src/stateManager.ts | 4 + .../src/statelessVerkleStateManager.ts | 312 +- .../test/proofStateManager.spec.ts | 21 +- .../statemanager/test/rpcStateManager.spec.ts | 16 + .../test/stateManager.code.spec.ts | 4 +- .../test/statelessVerkleStateManager.spec.ts | 76 +- .../testdata/providerData/mockProvider.ts | 4 +- .../test/testdata/verkleKaustinenBlock.json | 2863 +++++++++++--- .../statemanager/vitest.browser.config.mts | 18 + packages/trie/CHANGELOG.md | 13 + packages/trie/docs/README.md | 46 +- packages/trie/docs/classes/Trie.md | 222 +- packages/trie/docs/classes/TrieReadStream.md | 4 +- .../trie/docs/interfaces/CheckpointDBOpts.md | 6 +- packages/trie/docs/interfaces/Path.md | 41 + packages/trie/docs/interfaces/TrieOpts.md | 20 +- .../docs/interfaces/TrieShallowCopyOpts.md | 4 +- packages/trie/package.json | 8 +- packages/trie/src/db/checkpoint.ts | 1 - packages/trie/src/util/genesisState.ts | 11 +- packages/trie/test/index.spec.ts | 3 +- packages/trie/test/proof/range.spec.ts | 14 +- packages/trie/test/trie/checkpoint.spec.ts | 14 +- packages/trie/test/trie/secure.spec.ts | 4 +- packages/trie/test/trie/trie.spec.ts | 36 +- packages/tx/CHANGELOG.md | 36 + packages/tx/README.md | 105 +- .../classes/AccessListEIP2930Transaction.md | 59 +- .../tx/docs/classes/BlobEIP4844Transaction.md | 99 +- .../classes/FeeMarketEIP1559Transaction.md | 59 +- packages/tx/docs/classes/LegacyTransaction.md | 59 +- packages/tx/examples/blobTx.ts | 7 +- packages/tx/examples/initKzg.ts | 6 +- packages/tx/package.json | 10 +- packages/tx/src/baseTransaction.ts | 14 +- packages/tx/src/eip1559Transaction.ts | 6 +- packages/tx/src/eip2930Transaction.ts | 4 +- packages/tx/src/eip4844Transaction.ts | 31 +- packages/tx/src/legacyTransaction.ts | 2 +- packages/tx/src/types.ts | 2 +- packages/tx/src/util.ts | 4 +- packages/tx/test/base.spec.ts | 29 +- packages/tx/test/eip4844.spec.ts | 41 +- packages/tx/test/fromRpc.spec.ts | 6 +- packages/tx/test/legacy.spec.ts | 28 +- packages/tx/vitest.browser.config.mts | 17 + packages/util/CHANGELOG.md | 4 + packages/util/docs/README.md | 68 +- packages/util/docs/interfaces/Kzg.md | 4 +- packages/util/package.json | 6 +- packages/util/src/account.ts | 311 +- packages/util/src/address.ts | 15 +- packages/util/src/blobs.ts | 7 +- packages/util/src/bytes.ts | 29 +- packages/util/src/genesis.ts | 6 +- packages/util/src/internal.ts | 8 +- packages/util/src/kzg.ts | 30 +- packages/util/src/provider.ts | 3 +- packages/util/src/signature.ts | 4 +- packages/util/src/types.ts | 2 +- packages/util/src/withdrawal.ts | 10 +- packages/util/test/signature.spec.ts | 2 +- packages/util/test/types.spec.ts | 139 +- packages/verkle/CHANGELOG.md | 7 +- packages/verkle/docs/README.md | 372 ++ .../verkle/docs/classes/BaseVerkleNode.md | 174 + packages/verkle/docs/classes/CheckpointDB.md | 376 ++ packages/verkle/docs/classes/InternalNode.md | 339 ++ packages/verkle/docs/classes/LeafNode.md | 362 ++ .../docs/classes/PrioritizedTaskExecutor.md | 3 + packages/verkle/docs/classes/VerkleTree.md | 585 +++ .../verkle/docs/classes/WalkController.md | 147 + packages/verkle/docs/enums/VerkleNodeType.md | 30 + .../docs/interfaces/CheckpointDBOpts.md | 34 + packages/verkle/docs/interfaces/Fr.md | 3 + packages/verkle/docs/interfaces/Point.md | 300 ++ .../verkle/docs/interfaces/TypedVerkleNode.md | 30 + .../docs/interfaces/VerkleNodeInterface.md | 57 + .../docs/interfaces/VerkleNodeOptions.md | 30 + .../verkle/docs/interfaces/VerkleTreeOpts.md | 62 + packages/verkle/package.json | 9 +- packages/verkle/src/node/baseVerkleNode.ts | 6 +- packages/verkle/src/node/internalNode.ts | 7 +- packages/verkle/src/node/leafNode.ts | 6 +- packages/verkle/src/node/types.ts | 6 +- packages/verkle/src/types.ts | 7 + packages/verkle/src/util/crypto.ts | 47 +- packages/verkle/src/verkleTree.ts | 17 + packages/verkle/test/crypto.spec.ts | 20 +- packages/vm/CHANGELOG.md | 61 + packages/vm/README.md | 10 +- packages/vm/benchmarks/util.ts | 37 +- packages/vm/docs/README.md | 3 +- packages/vm/docs/classes/BlockBuilder.md | 26 +- packages/vm/docs/classes/VM.md | 32 +- packages/vm/docs/enums/BuildStatus.md | 6 +- .../vm/docs/interfaces/AfterBlockEvent.md | 31 +- packages/vm/docs/interfaces/AfterTxEvent.md | 39 +- .../vm/docs/interfaces/ApplyBlockResult.md | 88 + packages/vm/docs/interfaces/RunBlockOpts.md | 14 + packages/vm/docs/interfaces/RunBlockResult.md | 51 +- packages/vm/docs/interfaces/RunTxOpts.md | 30 +- packages/vm/docs/interfaces/RunTxResult.md | 33 +- packages/vm/package.json | 22 +- packages/vm/src/runBlock.ts | 74 +- packages/vm/src/runTx.ts | 35 +- packages/vm/src/types.ts | 4 +- packages/vm/src/vm.ts | 151 +- .../eip-2935-historical-block-hashes.spec.ts | 9 +- .../test/api/EIPs/eip-3074-authcall.spec.ts | 143 +- .../vm/test/api/EIPs/eip-4844-blobs.spec.ts | 19 +- .../vm/test/api/EIPs/eip-6800-verkle.spec.ts | 13 +- packages/vm/test/api/index.spec.ts | 2 +- packages/vm/test/api/runBlock.spec.ts | 33 +- packages/vm/test/api/runTx.spec.ts | 8 +- .../vm/test/api/state/accountExists.spec.ts | 10 +- .../vm/test/api/tester/tester.config.spec.ts | 8 +- packages/vm/test/api/utils.ts | 4 +- packages/vm/test/tester/config.ts | 2 +- packages/vm/test/tester/index.ts | 6 +- .../tester/runners/BlockchainTestsRunner.ts | 1 - .../tester/runners/GeneralStateTestsRunner.ts | 3 +- packages/vm/vitest.browser.config.mts | 18 + packages/wallet/CHANGELOG.md | 4 + packages/wallet/package.json | 6 +- packages/wallet/test/index.spec.ts | 80 +- settings.json | 7 - static.yml | 43 - testTZbBr5/customChain.json | 44 + ...2518de1108a98ceba360bc2e1856af2-audit.json | 15 + testTZbBr5/customChain/chain/CURRENT | 1 + testTZbBr5/customChain/chain/LOCK | 0 testTZbBr5/customChain/chain/LOG | 1 + testTZbBr5/customChain/chain/MANIFEST-000002 | Bin 0 -> 50 bytes testTZbBr5/customChain/config/CURRENT | 1 + testTZbBr5/customChain/config/LOCK | 0 testTZbBr5/customChain/config/LOG | 1 + testTZbBr5/customChain/config/MANIFEST-000002 | Bin 0 -> 50 bytes testTZbBr5/customChain/meta/CURRENT | 1 + testTZbBr5/customChain/meta/LOCK | 0 testTZbBr5/customChain/meta/LOG | 1 + testTZbBr5/customChain/meta/MANIFEST-000002 | Bin 0 -> 50 bytes testTZbBr5/customChain/state/CURRENT | 1 + testTZbBr5/customChain/state/LOCK | 0 testTZbBr5/customChain/state/LOG | 1 + testTZbBr5/customChain/state/MANIFEST-000002 | Bin 0 -> 50 bytes testTZbBr5/customGenesis.json | 17 + vitest.workspace.js | 19 + 367 files changed, 22293 insertions(+), 4071 deletions(-) delete mode 100644 azure-pipelines.yml delete mode 100644 codeql.yml create mode 100644 false create mode 100644 packages/block/docs/interfaces/VerkleExecutionWitness.md create mode 100644 packages/block/docs/interfaces/VerkleProof.md create mode 100644 packages/block/docs/interfaces/VerkleStateDiff.md create mode 100644 packages/client/src/util/metrics.ts create mode 100644 packages/client/test/rpc/engine/kaustinen6.spec.ts create mode 100644 packages/client/test/testdata/blocks/kaustinen4.json create mode 100644 packages/client/test/testdata/geth-genesis/kaustinen6.json create mode 100644 packages/client/test/testdata/gethk5vecs/block0.rlp.hex create mode 100644 packages/client/test/testdata/gethk5vecs/block1.rlp.hex create mode 100644 packages/client/test/testdata/gethk5vecs/block2.rlp.hex create mode 100644 packages/client/test/testdata/gethk5vecs/statediffs.json create mode 100644 packages/client/test/testdata/gethk5vecs/traces.jsonl create mode 100644 packages/evm/docs/interfaces/EVMOpts.md create mode 100644 packages/evm/docs/interfaces/bn128.md create mode 100644 packages/evm/src/precompiles/0b-bls12-g1add.ts create mode 100644 packages/evm/src/precompiles/0c-bls12-g1mul.ts create mode 100644 packages/evm/src/precompiles/0d-bls12-g1msm.ts create mode 100644 packages/evm/src/precompiles/0e-bls12-g2add.ts create mode 100644 packages/evm/src/precompiles/0f-bls12-g2mul.ts create mode 100644 packages/evm/src/precompiles/10-bls12-g2msm.ts create mode 100644 packages/evm/src/precompiles/11-bls12-pairing.ts create mode 100644 packages/evm/src/precompiles/12-bls12-map-fp-to-g1.ts create mode 100644 packages/evm/src/precompiles/13-bls12-map-fp2-to-g2.ts create mode 100644 packages/evm/src/precompiles/util/bls12_381.ts create mode 100644 packages/evm/test/precompiles/0b-bls12-g1add.spec.ts create mode 100644 packages/evm/test/precompiles/0c-bls12-g1mul.spec.ts create mode 100644 packages/evm/test/precompiles/0d-bls12-g1msm.spec.ts create mode 100644 packages/evm/test/precompiles/0e-bls12-g2add.spec.ts create mode 100644 packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts create mode 100644 packages/evm/test/precompiles/10-bls12-g2msm.spec.ts create mode 100644 packages/evm/test/precompiles/11-bls12-pairing.spec.ts create mode 100644 packages/evm/test/precompiles/12-bls12-g1map.spec.ts create mode 100644 packages/evm/test/precompiles/13-bls12-g2map.spec.ts create mode 100644 packages/evm/test/precompiles/eip-2537-BLS.spec.ts create mode 100644 packages/genesis/docs/README.md create mode 100644 packages/rlp/vitest.browser.config.mts create mode 100644 packages/statemanager/vitest.browser.config.mts create mode 100644 packages/trie/docs/interfaces/Path.md create mode 100644 packages/tx/vitest.browser.config.mts create mode 100644 packages/verkle/docs/README.md create mode 100644 packages/verkle/docs/classes/BaseVerkleNode.md create mode 100644 packages/verkle/docs/classes/CheckpointDB.md create mode 100644 packages/verkle/docs/classes/InternalNode.md create mode 100644 packages/verkle/docs/classes/LeafNode.md create mode 100644 packages/verkle/docs/classes/PrioritizedTaskExecutor.md create mode 100644 packages/verkle/docs/classes/VerkleTree.md create mode 100644 packages/verkle/docs/classes/WalkController.md create mode 100644 packages/verkle/docs/enums/VerkleNodeType.md create mode 100644 packages/verkle/docs/interfaces/CheckpointDBOpts.md create mode 100644 packages/verkle/docs/interfaces/Fr.md create mode 100644 packages/verkle/docs/interfaces/Point.md create mode 100644 packages/verkle/docs/interfaces/TypedVerkleNode.md create mode 100644 packages/verkle/docs/interfaces/VerkleNodeInterface.md create mode 100644 packages/verkle/docs/interfaces/VerkleNodeOptions.md create mode 100644 packages/verkle/docs/interfaces/VerkleTreeOpts.md create mode 100644 packages/vm/docs/interfaces/ApplyBlockResult.md create mode 100644 packages/vm/vitest.browser.config.mts delete mode 100644 settings.json delete mode 100644 static.yml create mode 100644 testTZbBr5/customChain.json create mode 100644 testTZbBr5/customChain/.f812457e42518de1108a98ceba360bc2e1856af2-audit.json create mode 100644 testTZbBr5/customChain/chain/CURRENT create mode 100644 testTZbBr5/customChain/chain/LOCK create mode 100644 testTZbBr5/customChain/chain/LOG create mode 100644 testTZbBr5/customChain/chain/MANIFEST-000002 create mode 100644 testTZbBr5/customChain/config/CURRENT create mode 100644 testTZbBr5/customChain/config/LOCK create mode 100644 testTZbBr5/customChain/config/LOG create mode 100644 testTZbBr5/customChain/config/MANIFEST-000002 create mode 100644 testTZbBr5/customChain/meta/CURRENT create mode 100644 testTZbBr5/customChain/meta/LOCK create mode 100644 testTZbBr5/customChain/meta/LOG create mode 100644 testTZbBr5/customChain/meta/MANIFEST-000002 create mode 100644 testTZbBr5/customChain/state/CURRENT create mode 100644 testTZbBr5/customChain/state/LOCK create mode 100644 testTZbBr5/customChain/state/LOG create mode 100644 testTZbBr5/customChain/state/MANIFEST-000002 create mode 100644 testTZbBr5/customGenesis.json create mode 100644 vitest.workspace.js diff --git a/.github/workflows/browser.yml b/.github/workflows/browser.yml index 7a5d11bf8..0498205be 100644 --- a/.github/workflows/browser.yml +++ b/.github/workflows/browser.yml @@ -34,9 +34,6 @@ jobs: - run: npm ci - run: npm run install-browser-deps - # Install playwright dependencies - - run: npx playwright install-deps - - run: npm run test:browser -w=@ethereumjs/rlp - run: npm run test:browser -w=@ethereumjs/util - run: npm run test:browser -w=@ethereumjs/common @@ -49,6 +46,7 @@ jobs: - run: npm run test:browser -w=@ethereumjs/wallet - run: npm run test:browser -w=@ethereumjs/statemanager - run: npm run test:browser -w=@ethereumjs/evm -# VM: several tests not passing yet -# - run: npm run test:browser -w=@ethereumjs/vm + - run: npm run test:browser -w=@ethereumjs/vm + - run: npm run test:browser -w=@ethereumjs/verkle + diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 5c5c05b23..120dcafe3 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -9,13 +9,13 @@ # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # -name: "CodeQL" +name: 'CodeQL' on: push: - branches: [ "master" ] + branches: ['master'] pull_request: - branches: [ "master" ] + branches: ['master'] schedule: - cron: '24 18 * * 0' @@ -41,10 +41,10 @@ jobs: fail-fast: false matrix: include: - - language: javascript-typescript - build-mode: none - - language: python - build-mode: none + - language: javascript-typescript + build-mode: none + - language: python + build-mode: none # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' # Use `c-cpp` to analyze code written in C, C++ or both # Use 'java-kotlin' to analyze code written in Java, Kotlin or both @@ -54,38 +54,38 @@ jobs: # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages steps: - - name: Checkout repository - uses: actions/checkout@v4 + - name: Checkout repository + uses: actions/checkout@v4 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + build-mode: ${{ matrix.build-mode }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality + # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - if: matrix.build-mode == 'manual' - run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 + # If the analyze step fails for one of the languages you are analyzing with + # "We were unable to automatically build your code", modify the matrix above + # to set the build mode to "manual" for that language. Then modify this step + # to build your code. + # ℹī¸ Command-line programs to run using the OS shell. + # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + - if: matrix.build-mode == 'manual' + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 - with: - category: "/language:${{matrix.language}}" + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 + with: + category: '/language:${{matrix.language}}' diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index 0ba82305f..a6628603d 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -4,7 +4,7 @@ name: Deploy static content to Pages on: # Runs on pushes targeting the default branch push: - branches: ["master"] + branches: ['master'] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -18,7 +18,7 @@ permissions: # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. concurrency: - group: "pages" + group: 'pages' cancel-in-progress: false jobs: diff --git a/azure-pipelines.yml b/azure-pipelines.yml deleted file mode 100644 index 676233afa..000000000 --- a/azure-pipelines.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Node.js -# Build a general Node.js project with npm. -# Add steps that analyze code, save build artifacts, deploy, and more: -# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript - -trigger: -- master - -pool: - vmImage: ubuntu-latest - -steps: -- task: NodeTool@0 - inputs: - versionSpec: '10.x' - displayName: 'Install Node.js' - -- script: | - npm install - npm run build - displayName: 'npm install and build' diff --git a/codeql.yml b/codeql.yml deleted file mode 100644 index 120dcafe3..000000000 --- a/codeql.yml +++ /dev/null @@ -1,91 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: 'CodeQL' - -on: - push: - branches: ['master'] - pull_request: - branches: ['master'] - schedule: - - cron: '24 18 * * 0' - -jobs: - analyze: - name: Analyze (${{ matrix.language }}) - # Runner size impacts CodeQL analysis time. To learn more, please see: - # - https://gh.io/recommended-hardware-resources-for-running-codeql - # - https://gh.io/supported-runners-and-hardware-resources - # - https://gh.io/using-larger-runners - # Consider using larger runners for possible analysis time improvements. - runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} - timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} - permissions: - # required for all workflows - security-events: write - - # only required for workflows in private repositories - actions: read - contents: read - - strategy: - fail-fast: false - matrix: - include: - - language: javascript-typescript - build-mode: none - - language: python - build-mode: none - # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' - # Use `c-cpp` to analyze code written in C, C++ or both - # Use 'java-kotlin' to analyze code written in Java, Kotlin or both - # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both - # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, - # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. - # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how - # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - build-mode: ${{ matrix.build-mode }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - # If the analyze step fails for one of the languages you are analyzing with - # "We were unable to automatically build your code", modify the matrix above - # to set the build mode to "manual" for that language. Then modify this step - # to build your code. - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - if: matrix.build-mode == 'manual' - run: | - echo 'If you are using a "manual" build mode for one or more of the' \ - 'languages you are analyzing, replace this with the commands to build' \ - 'your code, for example:' - echo ' make bootstrap' - echo ' make release' - exit 1 - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 - with: - category: '/language:${{matrix.language}}' diff --git a/false b/false new file mode 100644 index 000000000..15390e698 --- /dev/null +++ b/false @@ -0,0 +1,6 @@ +[06-01|15:43:37] INFO Sync Mode full +[06-01|15:43:37] INFO Reading custom genesis state accounts=1 +[06-01|15:43:37] INFO Data directory: /home/reconfigure/Library/Ethereum/ethereumjs +[06-01|15:43:38] INFO Full sync mode +[06-01|15:43:38] INFO Initializing Ethereumjs client version=v0.10.1 network=devnet chainId=123456 +[06-01|15:43:38] INFO Preparing for sync using FullEthereumService with FullSynchronizer. diff --git a/package-lock.json b/package-lock.json index f2b70a930..d4c9f19ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,9 @@ "workspaces": [ "packages/*" ], + "dependencies": { + "web-streams-polyfill": "^4.0.0" + }, "devDependencies": { "@types/estree": "^1.0.1", "@types/node": "18.11.9", @@ -31,7 +34,7 @@ "eslint-plugin-simple-import-sort": "7.0.0", "eslint-plugin-sonarjs": "0.19.0", "lint-staged": "13.0.3", - "lockfile-lint-api": "^5.5.1", + "lockfile-lint-api": "^5.9.1", "prettier": "2.7.1", "sort-package-json": "1.57.0", "tape": "5.6.0", @@ -42,7 +45,7 @@ "vite-plugin-node-polyfills": "^0.21.0", "vite-plugin-top-level-await": "^1.4.1", "vite-plugin-wasm": "^3.3.0", - "vitest": "^1.2.2" + "vitest": "^1.6.0" }, "engines": { "node": ">=18", @@ -50,7 +53,7 @@ }, "peerDependencies": { "@vitest/browser": "^1.5.0", - "webdriverio": "^8.36.0" + "webdriverio": "^8.38.0" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -1525,6 +1528,84 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "optional": true, + "peer": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "optional": true, + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -1637,7 +1718,7 @@ "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, + "devOptional": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -1681,7 +1762,7 @@ "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", @@ -1875,7 +1956,7 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, + "devOptional": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -1888,7 +1969,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 8" } @@ -1897,7 +1978,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, + "devOptional": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -1914,6 +1995,16 @@ "node": ">=8.0.0" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -1930,7 +2021,7 @@ "version": "1.0.0-next.25", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", - "dev": true + "devOptional": true }, "node_modules/@polkadot/util": { "version": "12.6.2", @@ -2111,6 +2202,142 @@ "node": ">=18" } }, + "node_modules/@promptbook/utils": { + "version": "0.50.0-10", + "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.50.0-10.tgz", + "integrity": "sha512-Z94YoY/wcZb5m1QoXgmIC1rVeDguGK5bWmUTYdWCqh/LHVifRdJ1C+tBzS0h+HMOD0XzMjZhBQ/mBgTZ/QNW/g==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "moment": "2.30.1", + "prettier": "2.8.1", + "spacetrim": "0.11.25" + } + }, + "node_modules/@promptbook/utils/node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "optional": true, + "peer": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", + "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.1", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/@puppeteer/browsers/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "optional": true, + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true, + "peer": true + }, + "node_modules/@puppeteer/browsers/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "optional": true, + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@rollup/plugin-inject": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", @@ -2191,7 +2418,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -2204,7 +2430,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -2217,7 +2442,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -2230,7 +2454,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -2243,7 +2466,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2256,7 +2478,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2269,7 +2490,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2282,7 +2502,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2295,7 +2514,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2308,7 +2526,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2321,7 +2538,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2334,7 +2550,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2347,7 +2562,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -2360,7 +2574,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2373,7 +2586,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2386,7 +2598,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -2429,7 +2640,20 @@ "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "devOptional": true + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } }, "node_modules/@swc/core": { "version": "1.4.14", @@ -2644,6 +2868,26 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "optional": true, + "peer": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "optional": true, + "peer": true + }, "node_modules/@types/benchmark": { "version": "1.0.33", "resolved": "https://registry.npmjs.org/@types/benchmark/-/benchmark-1.0.33.tgz", @@ -2694,7 +2938,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "devOptional": true }, "node_modules/@types/fs-extra": { "version": "11.0.4", @@ -2716,6 +2960,13 @@ "@types/node": "*" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "optional": true, + "peer": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -2850,11 +3101,18 @@ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", "dev": true }, + "node_modules/@types/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz", + "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==", + "optional": true, + "peer": true + }, "node_modules/@types/ws": { "version": "8.5.10", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dev": true, + "devOptional": true, "dependencies": { "@types/node": "*" } @@ -2874,6 +3132,16 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.33.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.33.1.tgz", @@ -3058,6 +3326,37 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitest/browser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-1.6.0.tgz", + "integrity": "sha512-3Wpp9h1hf++rRVPvoXevkdHybLhJVn7MwIMKMIh08tVaoDMmT6fnNhbP222Z48V9PptpYeA5zvH9Ct/ZcaAzmQ==", + "optional": true, + "peer": true, + "dependencies": { + "@vitest/utils": "1.6.0", + "magic-string": "^0.30.5", + "sirv": "^2.0.4" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "1.6.0", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, "node_modules/@vitest/coverage-v8": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-1.5.0.tgz", @@ -3086,13 +3385,13 @@ } }, "node_modules/@vitest/expect": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.5.0.tgz", - "integrity": "sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", + "devOptional": true, "dependencies": { - "@vitest/spy": "1.5.0", - "@vitest/utils": "1.5.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" }, "funding": { @@ -3100,12 +3399,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.5.0.tgz", - "integrity": "sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.6.0.tgz", + "integrity": "sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==", + "devOptional": true, "dependencies": { - "@vitest/utils": "1.5.0", + "@vitest/utils": "1.6.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -3117,7 +3416,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-5.0.0.tgz", "integrity": "sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==", - "dev": true, + "devOptional": true, "dependencies": { "yocto-queue": "^1.0.0" }, @@ -3132,7 +3431,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12.20" }, @@ -3141,10 +3440,10 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.5.0.tgz", - "integrity": "sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.6.0.tgz", + "integrity": "sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==", + "devOptional": true, "dependencies": { "magic-string": "^0.30.5", "pathe": "^1.1.1", @@ -3155,10 +3454,10 @@ } }, "node_modules/@vitest/spy": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.5.0.tgz", - "integrity": "sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", + "devOptional": true, "dependencies": { "tinyspy": "^2.2.0" }, @@ -3167,12 +3466,12 @@ } }, "node_modules/@vitest/ui": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.5.0.tgz", - "integrity": "sha512-ETcToK2TzICf/Oartvt19IH7yR4oCs8GrQk5hRhZ5oZFaSdDHTh6o3EdzyxOaY24NZ20cXYYNGjj1se/5vHfFg==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-1.6.0.tgz", + "integrity": "sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==", + "devOptional": true, "dependencies": { - "@vitest/utils": "1.5.0", + "@vitest/utils": "1.6.0", "fast-glob": "^3.3.2", "fflate": "^0.8.1", "flatted": "^3.2.9", @@ -3184,14 +3483,14 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "1.5.0" + "vitest": "1.6.0" } }, "node_modules/@vitest/utils": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.5.0.tgz", - "integrity": "sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", + "devOptional": true, "dependencies": { "diff-sequences": "^29.6.3", "estree-walker": "^3.0.3", @@ -3202,6 +3501,266 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@wdio/config": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.38.0.tgz", + "integrity": "sha512-9eMmHYkXw/0htj8Nok2vBa8Q+IS/wj7HXbLczKb5rEmDb57SW5iPMpZutFywGki1D/GIDLvejWaZvlxmS/yfBA==", + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "8.38.0", + "@wdio/types": "8.37.0", + "@wdio/utils": "8.38.0", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^4.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/config/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@wdio/config/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wdio/config/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "optional": true, + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/config/node_modules/glob": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "optional": true, + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/config/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/config/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@wdio/logger": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.38.0.tgz", + "integrity": "sha512-kcHL86RmNbcQP+Gq/vQUGlArfU6IIcbbnNp32rRIraitomZow+iEoc519rdQmSVusDozMS5DZthkgDdxK+vz6Q==", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/logger/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wdio/logger/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "optional": true, + "peer": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@wdio/protocols": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.38.0.tgz", + "integrity": "sha512-7BPi7aXwUtnXZPeWJRmnCNFjyDvGrXlBmN9D4Pi58nILkyjVRQKEY9/qv/pcdyB0cvmIvw++Kl/1Lg+RxG++UA==", + "optional": true, + "peer": true + }, + "node_modules/@wdio/repl": { + "version": "8.24.12", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.24.12.tgz", + "integrity": "sha512-321F3sWafnlw93uRTSjEBVuvWCxTkWNDs7ektQS15drrroL3TMeFOynu4rDrIz0jXD9Vas0HCD2Tq/P0uxFLdw==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/repl/node_modules/@types/node": { + "version": "20.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.13.0.tgz", + "integrity": "sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@wdio/types": { + "version": "8.37.0", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.37.0.tgz", + "integrity": "sha512-36kmSlZcVhsMlbhaSCQUfL51iG81FlbzW4Dfkz4903cDkxmh64bgxydZbRB5aPLnJzzR7tI3chIME8zSVZFR8w==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/types/node_modules/@types/node": { + "version": "20.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.13.0.tgz", + "integrity": "sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@wdio/utils": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.38.0.tgz", + "integrity": "sha512-ios7MpyJk4kGW9ZOYxbPpdwVZBI7SzccIgiirqSf8rvJi62VpDA2nfa7i7BY1rs9p7lnenF8phwnuVFGMCoL0w==", + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.38.0", + "@wdio/types": "8.37.0", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.5.0", + "geckodriver": "^4.3.1", + "get-port": "^7.0.0", + "import-meta-resolve": "^4.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "split2": "^4.2.0", + "wait-port": "^1.0.4" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/utils/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@yarnpkg/parsers": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0.tgz", @@ -3237,6 +3796,31 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@zip.js/zip.js": { + "version": "2.7.45", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.45.tgz", + "integrity": "sha512-Mm2EXF33DJQ/3GWWEWeP1UCqzpQ5+fiMvT3QWspsXY05DyqqxWu7a9awSzU4/spHMHVFrTjani1PR0vprgZpow==", + "optional": true, + "peer": true, + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" + } + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "optional": true, + "peer": true, + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, "node_modules/abstract-level": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.4.tgz", @@ -3284,7 +3868,7 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -3305,7 +3889,7 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.4.0" } @@ -3316,6 +3900,19 @@ "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "dev": true }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3406,6 +4003,170 @@ "node": ">=8" } }, + "node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", + "optional": true, + "peer": true, + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/archiver-utils/node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "optional": true, + "peer": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/glob": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "optional": true, + "peer": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver-utils/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "optional": true, + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/archiver-utils/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/archiver/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "optional": true, + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -3422,7 +4183,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, + "devOptional": true, "dependencies": { "dequal": "^2.0.3" } @@ -3583,11 +4344,24 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, + "devOptional": true, "engines": { "node": "*" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "optional": true, + "peer": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ast-types-flow": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", @@ -3641,11 +4415,64 @@ "dequal": "^2.0.3" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "optional": true, + "peer": true + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "devOptional": true + }, + "node_modules/bare-events": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.3.1.tgz", + "integrity": "sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==", + "optional": true, + "peer": true + }, + "node_modules/bare-fs": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.0.tgz", + "integrity": "sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==", + "optional": true, + "peer": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^1.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz", + "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==", + "optional": true, + "peer": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "optional": true, + "peer": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-1.0.0.tgz", + "integrity": "sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==", + "optional": true, + "peer": true, + "dependencies": { + "streamx": "^2.16.1" + } }, "node_modules/base64-js": { "version": "1.5.1", @@ -3666,6 +4493,16 @@ } ] }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", @@ -3676,6 +4513,16 @@ "platform": "^1.3.3" } }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/bigint-crypto-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", @@ -3689,6 +4536,13 @@ "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "optional": true, + "peer": true + }, "node_modules/bn.js": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", @@ -3734,7 +4588,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3744,7 +4598,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, + "devOptional": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3952,6 +4806,16 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8.0.0" + } + }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -4004,16 +4868,45 @@ "c8": "bin/c8.js" }, "engines": { - "node": ">=10.12.0" + "node": ">=10.12.0" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "optional": true, + "peer": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/caching-transform": { @@ -4123,7 +5016,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dev": true, + "devOptional": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -4156,7 +5049,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dev": true, + "devOptional": true, "dependencies": { "get-func-name": "^2.0.2" }, @@ -4164,6 +5057,19 @@ "node": "*" } }, + "node_modules/chromium-bidi": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", + "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "optional": true, + "peer": true, + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -4359,11 +5265,58 @@ "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, + "node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", + "optional": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/compress-commons/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compress-commons/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "optional": true, + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "devOptional": true }, "node_modules/connect": { "version": "3.7.0", @@ -4422,7 +5375,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "devOptional": true }, "node_modules/cors": { "version": "2.8.5", @@ -4436,6 +5389,50 @@ "node": ">= 0.10" } }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "optional": true, + "peer": true, + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", + "optional": true, + "peer": true, + "dependencies": { + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/crc32-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "optional": true, + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -4485,11 +5482,42 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "optional": true, + "peer": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "optional": true, + "peer": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, + "devOptional": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -4521,6 +5549,20 @@ "node": "*" } }, + "node_modules/css-shorthand-properties": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz", + "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==", + "optional": true, + "peer": true + }, + "node_modules/css-value": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz", + "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==", + "optional": true, + "peer": true + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -4612,11 +5654,40 @@ "node": ">=0.10.0" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "optional": true, + "peer": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, + "devOptional": true, "dependencies": { "type-detect": "^4.0.0" }, @@ -4662,6 +5733,16 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deepmerge-ts": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-5.1.0.tgz", + "integrity": "sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/default-require-extensions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", @@ -4686,6 +5767,16 @@ "node": ">=8" } }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + } + }, "node_modules/deferred-leveldown": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-7.0.0.tgz", @@ -4741,6 +5832,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "optional": true, + "peer": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/delay": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", @@ -4764,7 +5870,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -4815,11 +5921,18 @@ "node": ">=8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1302984", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1302984.tgz", + "integrity": "sha512-Rgh2Sk5fUSCtEx4QGH9iwTyECdFPySG2nlz5J8guGh2Wlha6uzSOCq/DCEC8faHlLaMPZJMuZ4ovgcX4LvOkKA==", + "optional": true, + "peer": true + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, + "devOptional": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -4872,39 +5985,164 @@ "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.0.0" + } + }, + "node_modules/domain-browser": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", + "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, + "node_modules/dotignore": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", + "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "bin": { + "ignored": "bin/ignored" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "optional": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "optional": true, + "peer": true + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "optional": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexer2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true, + "peer": true + }, + "node_modules/duplexer2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "devOptional": true + }, + "node_modules/edge-paths": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz", + "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==", + "optional": true, + "peer": true, + "dependencies": { + "@types/which": "^2.0.1", + "which": "^2.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/shirshak55" + } + }, + "node_modules/edgedriver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-5.5.0.tgz", + "integrity": "sha512-qQIjDQ62cbDcoZ8AcN6PxQekOwGDZcTkdZj5qr6Ew1i4mMi3R0d1Y6DKlyUnkBs5GXUYua5wKB0XHMLj6FAChQ==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "^8.28.0", + "decamelize": "^6.0.0", + "edge-paths": "^3.0.5", + "node-fetch": "^3.3.2", + "unzipper": "^0.11.6", + "which": "^4.0.0" + }, + "bin": { + "edgedriver": "bin/edgedriver.js" + } + }, + "node_modules/edgedriver/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/domain-browser": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", - "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", - "dev": true, + "node_modules/edgedriver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "optional": true, + "peer": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" + "node": ">=16" } }, - "node_modules/dotignore": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", - "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", - "dev": true, + "node_modules/edgedriver/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "optional": true, + "peer": true, "dependencies": { - "minimatch": "^3.0.4" + "isexe": "^3.1.1" }, "bin": { - "ignored": "bin/ignored" + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -4969,7 +6207,7 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true + "devOptional": true }, "node_modules/enabled": { "version": "2.0.0", @@ -4999,6 +6237,16 @@ "node": ">=10" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "optional": true, + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/err-code": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", @@ -5262,6 +6510,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "optional": true, + "peer": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "8.45.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", @@ -6007,7 +7287,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, + "devOptional": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -6071,7 +7351,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, + "devOptional": true, "dependencies": { "@types/estree": "^1.0.0" } @@ -6080,7 +7360,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -6181,11 +7461,21 @@ } } }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.8.x" } @@ -6232,6 +7522,43 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "optional": true, + "peer": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eyes": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", @@ -6256,13 +7583,13 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", - "dev": true + "devOptional": true }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, + "devOptional": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6278,7 +7605,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, + "devOptional": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6302,11 +7629,21 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, + "devOptional": true, "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "optional": true, + "peer": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", @@ -6335,11 +7672,20 @@ "node": "^12.20 || >= 14.13" } }, + "node_modules/fetch-blob/node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "peer": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/fflate": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", - "dev": true + "devOptional": true }, "node_modules/file-entry-cache": { "version": "6.0.1", @@ -6365,7 +7711,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, + "devOptional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6578,7 +7924,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "devOptional": true }, "node_modules/fn.name": { "version": "1.1.0", @@ -6627,6 +7973,16 @@ "node": ">=8.0.0" } }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14.17" + } + }, "node_modules/formdata-polyfill": { "version": "4.0.10", "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", @@ -6676,13 +8032,12 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6692,6 +8047,37 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "optional": true, + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6732,6 +8118,84 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/geckodriver": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-4.4.1.tgz", + "integrity": "sha512-nnAdIrwLkMcDu4BitWXF23pEMeZZ0Cj7HaWWFdSpeedBP9z6ft150JYiGO2mwzw6UiR823Znk1JeIf07RyzloA==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "@wdio/logger": "^8.28.0", + "@zip.js/zip.js": "^2.7.44", + "decamelize": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.4", + "node-fetch": "^3.3.2", + "tar-fs": "^3.0.6", + "which": "^4.0.0" + }, + "bin": { + "geckodriver": "bin/geckodriver.js" + }, + "engines": { + "node": "^16.13 || >=18 || >=20" + } + }, + "node_modules/geckodriver/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/geckodriver/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/geckodriver/node_modules/tar-fs": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "optional": true, + "peer": true, + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/geckodriver/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "optional": true, + "peer": true, + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6753,7 +8217,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, + "devOptional": true, "engines": { "node": "*" } @@ -6791,11 +8255,24 @@ "node": ">=8.0.0" } }, + "node_modules/get-port": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", + "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" }, @@ -6832,6 +8309,32 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "optional": true, + "peer": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/git-hooks-list": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-1.0.3.tgz", @@ -6854,7 +8357,7 @@ "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6943,11 +8446,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "optional": true, + "peer": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "optional": true, + "peer": true + }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -7153,6 +8689,13 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "optional": true, + "peer": true + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -7168,12 +8711,40 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "optional": true, + "peer": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, "engines": { - "node": ">= 0.8" + "node": ">=10.19.0" } }, "node_modules/https-browserify": { @@ -7182,6 +8753,20 @@ "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", "dev": true }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/human-signals": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz", @@ -7230,6 +8815,13 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "optional": true, + "peer": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -7246,6 +8838,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "optional": true, + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -7268,7 +8871,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7293,6 +8896,27 @@ "node": ">= 0.4" } }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "optional": true, + "peer": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "optional": true, + "peer": true + }, "node_modules/ip-regex": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", @@ -7461,7 +9085,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -7509,7 +9133,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -7572,7 +9196,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.12.0" } @@ -7666,7 +9290,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, + "devOptional": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7784,7 +9408,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "devOptional": true }, "node_modules/isomorphic-timers-promises": { "version": "1.0.1", @@ -7955,6 +9579,25 @@ "set-function-name": "^2.0.1" } }, + "node_modules/jackspeak": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "optional": true, + "peer": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jayson": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.0.tgz", @@ -8064,6 +9707,13 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "optional": true, + "peer": true + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -8080,7 +9730,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "devOptional": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -8115,7 +9765,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.1.tgz", "integrity": "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==", - "dev": true + "devOptional": true }, "node_modules/jsonfile": { "version": "6.1.0", @@ -8166,6 +9816,59 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "optional": true, + "peer": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "optional": true, + "peer": true + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "optional": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true, + "peer": true + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/jwt-simple": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/jwt-simple/-/jwt-simple-0.5.6.tgz", @@ -8178,7 +9881,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, + "devOptional": true, "dependencies": { "json-buffer": "3.0.1" } @@ -8188,6 +9891,19 @@ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" }, + "node_modules/ky": { + "version": "0.33.3", + "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", + "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/ky?sponsor=1" + } + }, "node_modules/kzg-wasm": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/kzg-wasm/-/kzg-wasm-0.4.0.tgz", @@ -8211,6 +9927,59 @@ "node": ">=0.10" } }, + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", + "optional": true, + "peer": true, + "dependencies": { + "readable-stream": "^2.0.5" + }, + "engines": { + "node": ">= 0.6.3" + } + }, + "node_modules/lazystream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "optional": true, + "peer": true + }, + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "optional": true, + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/lazystream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "optional": true, + "peer": true + }, + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "peer": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/level": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/level/-/level-8.0.1.tgz", @@ -8412,6 +10181,16 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "optional": true, + "peer": true, + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz", @@ -8575,7 +10354,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", "integrity": "sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==", - "dev": true, + "devOptional": true, "dependencies": { "mlly": "^1.4.2", "pkg-types": "^1.0.3" @@ -8587,6 +10366,41 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/locate-app": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.4.15.tgz", + "integrity": "sha512-oAGHATXPUHSQ74Om+3dXBRNYtCzU7Wzuhlj/WIZchqHb/5/TGJRzLEtHipMDOak0UZG9U365RMXyBzgV/fhOww==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "@promptbook/utils": "0.50.0-10", + "type-fest": "2.13.0", + "userhome": "1.0.0" + } + }, + "node_modules/locate-app/node_modules/type-fest": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.13.0.tgz", + "integrity": "sha512-lPfAm42MxE4/456+QyIaaVBAwgpJb6xZ8PRu09utnhPdWwcyj9vgy6Sq0Z5yNbJ21EdxB5dRU/Qg8bsyAMtlcw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8620,7 +10434,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "devOptional": true }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -8628,6 +10442,13 @@ "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", + "optional": true, + "peer": true + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -8662,7 +10483,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz", "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==", - "dev": true + "devOptional": true }, "node_modules/log-update": { "version": "4.0.0", @@ -8758,6 +10579,27 @@ "node": ">= 12.0.0" } }, + "node_modules/loglevel": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.1.tgz", + "integrity": "sha512-hP3I3kCrDIMuRwAwHltphhDM1r8i55H33GgqjXbrisuJhF4kRhW1dNuxsRklp4bXl8DSdLaNLuiL4A/LWRfxvg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loglevel-plugin-prefix": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz", + "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==", + "optional": true, + "peer": true + }, "node_modules/lolex": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", @@ -8768,11 +10610,24 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dev": true, + "devOptional": true, "dependencies": { "get-func-name": "^2.0.1" } }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/lru-cache": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", @@ -8797,7 +10652,7 @@ "version": "0.30.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" }, @@ -8844,9 +10699,9 @@ } }, "node_modules/mcl-wasm": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-1.4.0.tgz", - "integrity": "sha512-90Tvmg2NXwnKMgTafA01PRELsYNNRb/F2bj3nzdByTLLMUmgkgL8H/oeWcjZtVVffnBJyNjDcYxY7cdOE/WoHg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-1.5.0.tgz", + "integrity": "sha512-+Bnefweg0PWhQ//pVAawNkZAC+TH/mMZVsxmEyHvw8Ujhwu3cxUe9WITFK74dfgPRB09Zkmf6aUFXnW23OnVUw==", "dependencies": { "@types/node": "^20.2.5" }, @@ -8855,9 +10710,9 @@ } }, "node_modules/mcl-wasm/node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.13.0.tgz", + "integrity": "sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==", "dependencies": { "undici-types": "~5.26.4" } @@ -8923,13 +10778,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "devOptional": true }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 8" } @@ -8944,7 +10799,7 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, + "devOptional": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -8995,7 +10850,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -9003,6 +10858,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -9019,7 +10887,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, + "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9031,16 +10899,53 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, + "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "optional": true, + "peer": true + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "optional": true, + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "optional": true, + "peer": true + }, "node_modules/mlly": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", - "dev": true, + "devOptional": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", @@ -9068,7 +10973,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" } @@ -9144,7 +11049,7 @@ "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -9183,6 +11088,16 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", @@ -9352,16 +11267,29 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "optional": true, + "peer": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/npm-run-path": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, + "devOptional": true, "dependencies": { "path-key": "^4.0.0" }, @@ -9376,7 +11304,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -9769,7 +11697,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -9786,7 +11714,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, + "devOptional": true, "dependencies": { "mimic-fn": "^4.0.0" }, @@ -9835,6 +11763,16 @@ "node": ">=0.10.0" } }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -9889,6 +11827,40 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "optional": true, + "peer": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "optional": true, + "peer": true, + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/package-hash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", @@ -9908,7 +11880,7 @@ "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true + "devOptional": true }, "node_modules/parent-module": { "version": "1.0.1", @@ -9966,7 +11938,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -9975,7 +11947,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -9986,6 +11958,33 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "optional": true, + "peer": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "optional": true, + "peer": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -9999,13 +11998,13 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true + "devOptional": true }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, + "devOptional": true, "engines": { "node": "*" } @@ -10026,17 +12025,24 @@ "node": ">=0.12" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "optional": true, + "peer": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "devOptional": true }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8.6" }, @@ -10072,7 +12078,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", - "dev": true, + "devOptional": true, "dependencies": { "jsonc-parser": "^3.2.0", "mlly": "^1.2.0", @@ -10098,7 +12104,7 @@ "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, + "devOptional": true, "funding": [ { "type": "opencollective", @@ -10162,7 +12168,7 @@ "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", @@ -10176,7 +12182,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10" }, @@ -10188,7 +12194,7 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, + "devOptional": true, "engines": { "node": ">= 0.6.0" } @@ -10197,7 +12203,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "devOptional": true }, "node_modules/process-on-spawn": { "version": "1.0.0", @@ -10211,6 +12217,16 @@ "node": ">=8" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/prom-client": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-15.1.2.tgz", @@ -10220,36 +12236,275 @@ "tdigest": "^0.1.1" }, "engines": { - "node": "^16 || ^18 || >=20" - } - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "node": "^16 || ^18 || >=20" + } + }, + "node_modules/proxy-agent": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "optional": true, + "peer": true + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "optional": true, + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", + "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", + "optional": true, + "peer": true, + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", + "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "optional": true, + "peer": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "optional": true, + "peer": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", + "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", + "optional": true, + "peer": true + }, + "node_modules/puppeteer-core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true, + "peer": true + }, + "node_modules/puppeteer-core/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer-core/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/puppeteer-core/node_modules/proxy-agent": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/puppeteer-core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/puppeteer-core/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "optional": true, + "peer": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" } }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, + "node_modules/puppeteer-core/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "optional": true, + "peer": true, "engines": { - "node": ">=6" + "node": ">=12" } }, "node_modules/qheap": { @@ -10274,6 +12529,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/query-selector-shadow-dom": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/query-selector-shadow-dom/-/query-selector-shadow-dom-1.0.1.tgz", + "integrity": "sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==", + "optional": true, + "peer": true + }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -10302,6 +12564,13 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "optional": true, + "peer": true + }, "node_modules/quibble": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/quibble/-/quibble-0.9.2.tgz", @@ -10315,6 +12584,19 @@ "node": ">= 0.14.0" } }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10349,10 +12631,10 @@ } }, "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "devOptional": true }, "node_modules/readable-stream": { "version": "3.6.2", @@ -10367,6 +12649,39 @@ "node": ">= 6" } }, + "node_modules/readdir-glob": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", + "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", + "optional": true, + "peer": true, + "dependencies": { + "minimatch": "^5.1.0" + } + }, + "node_modules/readdir-glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/readdir-glob/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/receptacle": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/receptacle/-/receptacle-1.3.2.tgz", @@ -10475,6 +12790,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "optional": true, + "peer": true + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -10493,6 +12815,39 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "optional": true, + "peer": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/resq": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz", + "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==", + "optional": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^2.0.1" + } + }, + "node_modules/resq/node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==", + "optional": true, + "peer": true + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -10543,7 +12898,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, + "devOptional": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -10555,6 +12910,13 @@ "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dev": true }, + "node_modules/rgb2hex": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.5.tgz", + "integrity": "sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==", + "optional": true, + "peer": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -10584,7 +12946,7 @@ "version": "4.14.3", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", - "dev": true, + "devOptional": true, "dependencies": { "@types/estree": "1.0.5" }, @@ -10619,7 +12981,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, + "devOptional": true, "funding": [ { "type": "github", @@ -10677,6 +13039,13 @@ "tslib": "^2.1.0" } }, + "node_modules/safaridriver": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-0.1.2.tgz", + "integrity": "sha512-4R309+gWflJktzPXBQCobbWEHlzC4aK3a+Ov3tz2Ib2aBxiwd11phkdIBH1l0EO22x24CJMUQkpKFumRriCSRg==", + "optional": true, + "peer": true + }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -10779,6 +13148,35 @@ "node": ">=10" } }, + "node_modules/serialize-error": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-11.0.3.tgz", + "integrity": "sha512-2G2y++21dhj2R7iHAdd0FIzjGwuKZld+7Pl/bTU6YIkrC2ZMbVUjm+luj6A6V34Rv9XfKJDKpTWu9W4Gse1D9g==", + "optional": true, + "peer": true, + "dependencies": { + "type-fest": "^2.12.2" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -10820,7 +13218,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", - "dev": true + "devOptional": true }, "node_modules/setprototypeof": { "version": "1.2.0", @@ -10844,7 +13242,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, + "devOptional": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10856,7 +13254,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=8" } @@ -10893,7 +13291,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "devOptional": true }, "node_modules/signal-exit": { "version": "3.0.7", @@ -10913,7 +13311,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, + "devOptional": true, "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -10960,11 +13358,52 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/snappyjs": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==" }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "optional": true, + "peer": true, + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "optional": true, + "peer": true, + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/solc": { "version": "0.8.25", "resolved": "https://registry.npmjs.org/solc/-/solc-0.8.25.tgz", @@ -11050,7 +13489,7 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -11059,11 +13498,28 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/spacetrim": { + "version": "0.11.25", + "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.25.tgz", + "integrity": "sha512-SWxXDROciuJs9YEYXUBjot5k/cqNGPPbT3QmkInFne4AGc1y+76It+jqU8rfsXKt57RRiunzZn1m9+KfuuNklw==", + "funding": [ + { + "type": "individual", + "url": "https://buymeacoffee.com/hejny" + }, + { + "type": "github", + "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing" + } + ], + "optional": true, + "peer": true + }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -11105,6 +13561,16 @@ "semver": "bin/semver.js" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -11123,7 +13589,7 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "devOptional": true }, "node_modules/statuses": { "version": "1.5.0", @@ -11137,7 +13603,7 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "devOptional": true }, "node_modules/stop-iteration-iterator": { "version": "1.0.0", @@ -11173,6 +13639,21 @@ "xtend": "^4.0.2" } }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "optional": true, + "peer": true, + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -11194,7 +13675,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, + "devOptional": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -11207,11 +13688,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true, + "peer": true + }, + "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string-width/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -11223,7 +13737,7 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dev": true, + "devOptional": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -11316,6 +13830,20 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "optional": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -11329,7 +13857,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=12" }, @@ -11353,7 +13881,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", - "dev": true, + "devOptional": true, "dependencies": { "js-tokens": "^9.0.0" }, @@ -11365,7 +13893,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", - "dev": true + "devOptional": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -11485,6 +14013,30 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "optional": true, + "peer": true, + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "optional": true, + "peer": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/tdigest": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", @@ -11534,6 +14086,16 @@ "testdouble": "^3.0.0" } }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "optional": true, + "peer": true, + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -11572,13 +14134,13 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.7.0.tgz", "integrity": "sha512-Qgayeb106x2o4hNzNjsZEfFziw8IbKqtbXBjVh7VIZfBxfD5M4gWtpyx5+YTae2gJ6Y6Dz/KLepiv16RFeQWNA==", - "dev": true + "devOptional": true }, "node_modules/tinypool": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.4.tgz", "integrity": "sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=14.0.0" } @@ -11587,7 +14149,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=14.0.0" } @@ -11617,7 +14179,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, + "devOptional": true, "dependencies": { "is-number": "^7.0.0" }, @@ -11637,11 +14199,18 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "optional": true, + "peer": true + }, "node_modules/triple-beam": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", @@ -11741,7 +14310,7 @@ "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, + "devOptional": true, "engines": { "node": ">=4" } @@ -11910,7 +14479,7 @@ "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11923,7 +14492,7 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", - "dev": true + "devOptional": true }, "node_modules/uglify-js": { "version": "3.17.4", @@ -11961,6 +14530,42 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "optional": true, + "peer": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unbzip2-stream/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "optional": true, + "peer": true, + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", @@ -11982,6 +14587,20 @@ "node": ">= 0.8" } }, + "node_modules/unzipper": { + "version": "0.11.6", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.11.6.tgz", + "integrity": "sha512-anERl79akvqLbAxfjIFe4hK0wsi0fH4uGLwNEl4QEnG+KKs3QQeApYgOS/f6vH2EdACUlZg35psmd/3xL2duFQ==", + "optional": true, + "peer": true, + "dependencies": { + "big-integer": "^1.6.17", + "bluebird": "~3.4.1", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -12052,6 +14671,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/userhome": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.0.tgz", + "integrity": "sha512-ayFKY3H+Pwfy4W98yPdtH1VqH4psDeyW8lYYFzfecR9d6hqLpqhecktvYR3SEEXt7vG0S1JEpciI3g94pMErig==", + "optional": true, + "peer": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -12114,9 +14743,9 @@ } }, "node_modules/verkle-cryptography-wasm": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/verkle-cryptography-wasm/-/verkle-cryptography-wasm-0.4.0.tgz", - "integrity": "sha512-g0gvXqUvdOxqKhyE6qiMLIWqmyP9rnQIb9VDc+GS8SOIPFGx12WhVB7IMkPcfBXUTZmcMT2JXiNMrK7iR2ofBA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/verkle-cryptography-wasm/-/verkle-cryptography-wasm-0.4.2.tgz", + "integrity": "sha512-Mji9ibiCBS0ObveKuIC6XY009zLJTVBwwPaLnOI3yoj26MbZjAI8ByhWSmoQCJkWj/j/hNjcq9Jbx39Fguh92w==", "dependencies": { "@scure/base": "^1.1.5" }, @@ -12129,7 +14758,7 @@ "version": "5.2.9", "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz", "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==", - "dev": true, + "devOptional": true, "dependencies": { "esbuild": "^0.20.1", "postcss": "^8.4.38", @@ -12181,10 +14810,10 @@ } }, "node_modules/vite-node": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.5.0.tgz", - "integrity": "sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==", - "dev": true, + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.6.0.tgz", + "integrity": "sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==", + "devOptional": true, "dependencies": { "cac": "^6.7.14", "debug": "^4.3.4", @@ -12261,7 +14890,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "aix" @@ -12277,7 +14905,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -12293,7 +14920,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -12309,7 +14935,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "android" @@ -12325,7 +14950,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -12341,7 +14965,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -12357,7 +14980,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -12373,7 +14995,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -12389,7 +15010,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12405,7 +15025,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12421,7 +15040,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12437,7 +15055,6 @@ "cpu": [ "loong64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12453,7 +15070,6 @@ "cpu": [ "mips64el" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12469,7 +15085,6 @@ "cpu": [ "ppc64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12485,7 +15100,6 @@ "cpu": [ "riscv64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12501,7 +15115,6 @@ "cpu": [ "s390x" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12517,7 +15130,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -12533,7 +15145,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "netbsd" @@ -12549,7 +15160,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "openbsd" @@ -12565,7 +15175,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "sunos" @@ -12581,7 +15190,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -12597,7 +15205,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -12613,7 +15220,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -12626,7 +15232,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", - "dev": true, + "devOptional": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -12661,16 +15267,16 @@ } }, "node_modules/vitest": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.5.0.tgz", - "integrity": "sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==", - "dev": true, - "dependencies": { - "@vitest/expect": "1.5.0", - "@vitest/runner": "1.5.0", - "@vitest/snapshot": "1.5.0", - "@vitest/spy": "1.5.0", - "@vitest/utils": "1.5.0", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.6.0.tgz", + "integrity": "sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==", + "devOptional": true, + "dependencies": { + "@vitest/expect": "1.6.0", + "@vitest/runner": "1.6.0", + "@vitest/snapshot": "1.6.0", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -12684,7 +15290,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.3", "vite": "^5.0.0", - "vite-node": "1.5.0", + "vite-node": "1.6.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -12699,8 +15305,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.5.0", - "@vitest/ui": "1.5.0", + "@vitest/browser": "1.6.0", + "@vitest/ui": "1.6.0", "happy-dom": "*", "jsdom": "*" }, @@ -12729,7 +15335,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dev": true, + "devOptional": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", @@ -12752,7 +15358,7 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=16" }, @@ -12764,7 +15370,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=16.17.0" } @@ -12773,7 +15379,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, + "devOptional": true, "engines": { "node": ">=14" }, @@ -12799,6 +15405,34 @@ "integrity": "sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==", "dev": true }, + "node_modules/wait-port": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz", + "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==", + "optional": true, + "peer": true, + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.3.0", + "debug": "^4.3.4" + }, + "bin": { + "wait-port": "bin/wait-port.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wait-port/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/weak-lru-cache": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", @@ -12806,19 +15440,163 @@ "dev": true }, "node_modules/web-streams-polyfill": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", - "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", - "peer": true, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0.tgz", + "integrity": "sha512-0zJXHRAYEjM2tUfZ2DiSOHAa2aw1tisnnhU3ufD57R8iefL+DcdJyRBRyJpG+NUimDgbTI/lH+gAE1PAvV3Cgw==", "engines": { "node": ">= 8" } }, + "node_modules/webdriver": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.38.0.tgz", + "integrity": "sha512-BT3sd667AqcZ1lzaOd7lphjnc7MNG3WgduAq4vUUDYlJAbs6SyjYd0EZPIPv9KUUYr0BoSJTDa0Xuyl/6PPW0Q==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0", + "@types/ws": "^8.5.3", + "@wdio/config": "8.38.0", + "@wdio/logger": "8.38.0", + "@wdio/protocols": "8.38.0", + "@wdio/types": "8.37.0", + "@wdio/utils": "8.38.0", + "deepmerge-ts": "^5.1.0", + "got": "^12.6.1", + "ky": "^0.33.0", + "ws": "^8.8.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/webdriver/node_modules/@types/node": { + "version": "20.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.13.0.tgz", + "integrity": "sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/webdriverio": { + "version": "8.38.0", + "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.38.0.tgz", + "integrity": "sha512-PxLtJPK8Aa+f/G/P8YGUwGH80uHowMA8cDHshhog6sKbp1BXEVB8x6PyC1AIswRlTWVijoes7cD0cUoVs6C87A==", + "optional": true, + "peer": true, + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/config": "8.38.0", + "@wdio/logger": "8.38.0", + "@wdio/protocols": "8.38.0", + "@wdio/repl": "8.24.12", + "@wdio/types": "8.37.0", + "@wdio/utils": "8.38.0", + "archiver": "^7.0.0", + "aria-query": "^5.0.0", + "css-shorthand-properties": "^1.1.1", + "css-value": "^0.0.1", + "devtools-protocol": "^0.0.1302984", + "grapheme-splitter": "^1.0.2", + "import-meta-resolve": "^4.0.0", + "is-plain-obj": "^4.1.0", + "jszip": "^3.10.1", + "lodash.clonedeep": "^4.5.0", + "lodash.zip": "^4.2.0", + "minimatch": "^9.0.0", + "puppeteer-core": "^20.9.0", + "query-selector-shadow-dom": "^1.0.0", + "resq": "^1.9.1", + "rgb2hex": "0.2.5", + "serialize-error": "^11.0.1", + "webdriver": "8.38.0" + }, + "engines": { + "node": "^16.13 || >=18" + }, + "peerDependencies": { + "devtools": "^8.14.0" + }, + "peerDependenciesMeta": { + "devtools": { + "optional": true + } + } + }, + "node_modules/webdriverio/node_modules/@types/node": { + "version": "20.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.13.0.tgz", + "integrity": "sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==", + "optional": true, + "peer": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/webdriverio/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "optional": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/webdriverio/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webdriverio/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "optional": true, + "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "optional": true, + "peer": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "optional": true, + "peer": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "devOptional": true, "dependencies": { "isexe": "^2.0.0" }, @@ -12918,7 +15696,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", - "dev": true, + "devOptional": true, "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -13022,6 +15800,57 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "optional": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "optional": true, + "peer": true + }, + "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "optional": true, + "peer": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrap-ansi/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -13052,7 +15881,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "devOptional": true }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -13070,7 +15899,7 @@ "version": "8.16.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "dev": true, + "devOptional": true, "engines": { "node": ">=10.0.0" }, @@ -13178,6 +16007,27 @@ "node": ">=8" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "optional": true, + "peer": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yauzl/node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "optional": true, + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -13190,6 +16040,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "optional": true, + "peer": true, + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/zip-stream/node_modules/readable-stream": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", + "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", + "optional": true, + "peer": true, + "dependencies": { + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "packages/block": { "name": "@ethereumjs/block", "version": "5.2.0", diff --git a/package.json b/package.json index 2b5938fb2..34c90a1a1 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,13 @@ "examples": "npm run examples --workspaces --if-present", "preinstall": "npm run checkNpmVersion", "postinstall": "npm run build --workspaces", + "install-browser-deps": "npm install webdriverio @vitest/browser web-streams-polyfill", "prepare": "git config --local core.hooksPath .githooks", "prettier": "prettier --write \"./**/*.{js,json,md,ts,yml}\"", - "sort-package-json": "sort-package-json \"package.json\" \"packages/*/package.json\"", - "install-browser-deps": "npm install webdriverio @vitest/browser web-streams-polyfill" + "sort-package-json": "sort-package-json \"package.json\" \"packages/*/package.json\"" + }, + "dependencies": { + "web-streams-polyfill": "^4.0.0" }, "devDependencies": { "@types/estree": "^1.0.1", @@ -41,7 +44,7 @@ "eslint-plugin-simple-import-sort": "7.0.0", "eslint-plugin-sonarjs": "0.19.0", "lint-staged": "13.0.3", - "lockfile-lint-api": "^5.5.1", + "lockfile-lint-api": "^5.9.1", "prettier": "2.7.1", "sort-package-json": "1.57.0", "tape": "5.6.0", @@ -52,23 +55,23 @@ "vite-plugin-node-polyfills": "^0.21.0", "vite-plugin-top-level-await": "^1.4.1", "vite-plugin-wasm": "^3.3.0", - "vitest": "^1.2.2" + "vitest": "^1.6.0" }, "peerDependencies": { "@vitest/browser": "^1.5.0", - "webdriverio": "^8.36.0" + "webdriverio": "^8.38.0" }, "peerDependenciesMeta": { - "playwright": { + "@vitest/browser": { "optional": true }, - "webdriverio": { + "kzg-wasm": { "optional": true }, - "@vitest/browser": { + "playwright": { "optional": true }, - "kzg-wasm": { + "webdriverio": { "optional": true } }, diff --git a/packages/block/CHANGELOG.md b/packages/block/CHANGELOG.md index 8f75575f9..24392469b 100644 --- a/packages/block/CHANGELOG.md +++ b/packages/block/CHANGELOG.md @@ -6,6 +6,46 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 5.2.0 - 2024-03-05 + +### Full 4844 Browser Readiness + +#### WASM KZG + +Shortly following the "Dencun Hardfork Support" release round from last month, this is now the first round of releases where the EthereumJS libraries are now fully browser compatible regarding the new 4844 functionality, see PRs [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) and [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296)! 🎉 + +Our WASM wizard @acolytec3 has spent the last two weeks and created a WASM build of the [c-kzg](https://github.com/benjaminion/c-kzg) library which we have released under the `kzg-wasm` name on npm (and you can also use independently for other projects). See the newly created [GitHub repository](https://github.com/ethereumjs/kzg-wasm) for some library-specific documentation. + +This WASM KZG library can now be used for KZG initialization (replacing the old recommended `c-kzg` initialization), see the respective [README section](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/README.md#kzg-initialization) from the tx library for usage instructions (which is also accurate for the other using upstream libraries like block or EVM). + +Note that `kzg-wasm` needs to be added manually to your own dependencies and the KZG initialization code needs to be adopted like the following (which you will likely want to do in most cases, so if you deal with post Dencun EVM bytecode and/or 4844 blob txs in any way): + +```typescript +import { loadKZG } from 'kzg-wasm' +import { Chain, Common, Hardfork } from '@ethereumjs/common' + +const kzg = await loadKZG() + +// Instantiate `common` +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, +}) +``` + +Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. + +Note that passing in the KZG setup file is not necessary anymore, since this is now defaulting to the setup file from the official [KZG ceremony](https://ceremony.ethereum.org/) (which is now bundled with the KZG library). + +#### Trie Node.js Import Bug + +Since this fits well also to be placed here relatively prominently for awareness: we had a relatively nasty bug in the `@ethereumjs/trie` library with a `Node.js` web stream import also affecting browser compatibility, see PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). This bug has been fixed along with these releases and this library now references the updated trie library version. + +### Other Changes + +- Fixed a bug in the `Block.fromRPC()` and `BlockHeader.fromRPC()` constructors to not parse the `parentBeaconBlockRoot` correctly, PR [#3283](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3283) + ## 5.1.1 - 2024-02-08 - Hotfix release adding a missing `debug` dependency to the `@ethereumjs/trie` package (dependency), PR [#3271](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3271) diff --git a/packages/block/README.md b/packages/block/README.md index 561690e6b..9d0597868 100644 --- a/packages/block/README.md +++ b/packages/block/README.md @@ -168,12 +168,13 @@ To create blocks which include blob transactions you have to active EIP-4844 in import { Common, Chain, Hardfork } from '@ethereumjs/common' import { Block } from '@ethereumjs/block' import { BlobEIP4844Transaction } from '@ethereumjs/tx' -import { Address, initKZG } from '@ethereumjs/util' -import * as kzg from 'c-kzg' +import { Address } from '@ethereumjs/util' +import { loadKZG } from 'kzg-wasm' import { randomBytes } from 'crypto' const main = async () => { - initKZG(kzg, __dirname + '/../../client/src/trustedSetups/official.txt') + const kzg = await loadKZG() + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Cancun, diff --git a/packages/block/docs/README.md b/packages/block/docs/README.md index 91db86da8..f2067e66e 100644 --- a/packages/block/docs/README.md +++ b/packages/block/docs/README.md @@ -17,6 +17,9 @@ - [JsonBlock](interfaces/JsonBlock.md) - [JsonHeader](interfaces/JsonHeader.md) - [JsonRpcBlock](interfaces/JsonRpcBlock.md) +- [VerkleExecutionWitness](interfaces/VerkleExecutionWitness.md) +- [VerkleProof](interfaces/VerkleProof.md) +- [VerkleStateDiff](interfaces/VerkleStateDiff.md) ### Type Aliases @@ -24,6 +27,7 @@ - [BlockBytes](README.md#blockbytes) - [BlockHeaderBytes](README.md#blockheaderbytes) - [ExecutionPayload](README.md#executionpayload) +- [ExecutionWitnessBytes](README.md#executionwitnessbytes) - [TransactionsBytes](README.md#transactionsbytes) - [UncleHeadersBytes](README.md#uncleheadersbytes) - [WithdrawalV1](README.md#withdrawalv1) @@ -41,17 +45,17 @@ #### Defined in -[types.ts:119](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L119) +[types.ts:174](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L174) ___ ### BlockBytes -ÆŦ **BlockBytes**: [[`BlockHeaderBytes`](README.md#blockheaderbytes), [`TransactionsBytes`](README.md#transactionsbytes), [`UncleHeadersBytes`](README.md#uncleheadersbytes)] \| [[`BlockHeaderBytes`](README.md#blockheaderbytes), [`TransactionsBytes`](README.md#transactionsbytes), [`UncleHeadersBytes`](README.md#uncleheadersbytes), [`WithdrawalsBytes`](README.md#withdrawalsbytes)] +ÆŦ **BlockBytes**: [[`BlockHeaderBytes`](README.md#blockheaderbytes), [`TransactionsBytes`](README.md#transactionsbytes), [`UncleHeadersBytes`](README.md#uncleheadersbytes)] \| [[`BlockHeaderBytes`](README.md#blockheaderbytes), [`TransactionsBytes`](README.md#transactionsbytes), [`UncleHeadersBytes`](README.md#uncleheadersbytes), [`WithdrawalsBytes`](README.md#withdrawalsbytes)] \| [[`BlockHeaderBytes`](README.md#blockheaderbytes), [`TransactionsBytes`](README.md#transactionsbytes), [`UncleHeadersBytes`](README.md#uncleheadersbytes), [`WithdrawalsBytes`](README.md#withdrawalsbytes), [`ExecutionWitnessBytes`](README.md#executionwitnessbytes)] #### Defined in -[types.ts:115](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L115) +[types.ts:159](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L159) ___ @@ -59,9 +63,11 @@ ___ ÆŦ **BlockHeaderBytes**: `Uint8Array`[] +BlockHeaderBuffer is a Buffer array, except for the Verkle PreState which is an array of prestate arrays. + #### Defined in -[types.ts:118](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L118) +[types.ts:173](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L173) ___ @@ -78,6 +84,7 @@ ___ | `blockHash` | `PrefixedHexString` | | `blockNumber` | `PrefixedHexString` | | `excessBlobGas?` | `PrefixedHexString` | +| `executionWitness?` | [`VerkleExecutionWitness`](interfaces/VerkleExecutionWitness.md) \| ``null`` | | `extraData` | `PrefixedHexString` | | `feeRecipient` | `PrefixedHexString` | | `gasLimit` | `PrefixedHexString` | @@ -94,7 +101,17 @@ ___ #### Defined in -[types.ts:206](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L206) +[types.ts:263](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L263) + +___ + +### ExecutionWitnessBytes + +ÆŦ **ExecutionWitnessBytes**: `Uint8Array` + +#### Defined in + +[types.ts:157](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L157) ___ @@ -106,7 +123,7 @@ TransactionsBytes can be an array of serialized txs for Typed Transactions or an #### Defined in -[types.ts:123](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L123) +[types.ts:178](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L178) ___ @@ -116,7 +133,7 @@ ___ #### Defined in -[types.ts:124](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L124) +[types.ts:179](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L179) ___ @@ -135,7 +152,7 @@ ___ #### Defined in -[types.ts:198](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L198) +[types.ts:255](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L255) ___ @@ -145,7 +162,7 @@ ___ #### Defined in -[types.ts:113](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L113) +[types.ts:156](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L156) ## Functions @@ -168,4 +185,4 @@ The JSON data can be retrieved from a consensus layer (CL) client on this Beacon #### Defined in -[from-beacon-payload.ts:39](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/from-beacon-payload.ts#L39) +[from-beacon-payload.ts:41](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/from-beacon-payload.ts#L41) diff --git a/packages/block/docs/classes/Block.md b/packages/block/docs/classes/Block.md index 6a6754cba..6cab4981e 100644 --- a/packages/block/docs/classes/Block.md +++ b/packages/block/docs/classes/Block.md @@ -13,9 +13,9 @@ An object that represents the block. ### Properties - [common](Block.md#common) +- [executionWitness](Block.md#executionwitness) - [header](Block.md#header) - [transactions](Block.md#transactions) -- [txTrie](Block.md#txtrie) - [uncleHeaders](Block.md#uncleheaders) - [withdrawals](Block.md#withdrawals) @@ -52,7 +52,7 @@ An object that represents the block. ### constructor -â€ĸ **new Block**(`header?`, `transactions?`, `uncleHeaders?`, `withdrawals?`, `opts?`) +â€ĸ **new Block**(`header?`, `transactions?`, `uncleHeaders?`, `withdrawals?`, `opts?`, `executionWitness?`) This constructor takes the values, validates them, assigns them and freezes the object. Use the static factory methods to assist in creating a Block object from varying data types and options. @@ -66,10 +66,11 @@ Use the static factory methods to assist in creating a Block object from varying | `uncleHeaders` | [`BlockHeader`](BlockHeader.md)[] | `[]` | | `withdrawals?` | `Withdrawal`[] | `undefined` | | `opts` | [`BlockOptions`](../interfaces/BlockOptions.md) | `{}` | +| `executionWitness?` | ``null`` \| [`VerkleExecutionWitness`](../interfaces/VerkleExecutionWitness.md) | `undefined` | #### Defined in -[block.ts:361](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L361) +[block.ts:405](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L405) ## Properties @@ -79,37 +80,41 @@ Use the static factory methods to assist in creating a Block object from varying #### Defined in -[block.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L52) +[block.ts:53](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L53) ___ -### header +### executionWitness -â€ĸ `Readonly` **header**: [`BlockHeader`](BlockHeader.md) +â€ĸ `Optional` `Readonly` **executionWitness**: ``null`` \| [`VerkleExecutionWitness`](../interfaces/VerkleExecutionWitness.md) + +EIP-6800: Verkle Proof Data (experimental) +null implies that the non default executionWitness might exist but not available +and will not lead to execution of the block via vm with verkle stateless manager #### Defined in -[block.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L47) +[block.ts:61](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L61) ___ -### transactions +### header -â€ĸ `Readonly` **transactions**: `TypedTransaction`[] = `[]` +â€ĸ `Readonly` **header**: [`BlockHeader`](BlockHeader.md) #### Defined in -[block.ts:48](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L48) +[block.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L49) ___ -### txTrie +### transactions -â€ĸ `Readonly` **txTrie**: `Trie` +â€ĸ `Readonly` **transactions**: `TypedTransaction`[] = `[]` #### Defined in -[block.ts:51](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L51) +[block.ts:50](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L50) ___ @@ -119,7 +124,7 @@ ___ #### Defined in -[block.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L49) +[block.ts:51](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L51) ___ @@ -129,7 +134,7 @@ ___ #### Defined in -[block.ts:50](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L50) +[block.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L52) ## Methods @@ -145,7 +150,7 @@ Return a compact error string representation of the object #### Defined in -[block.ts:701](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L701) +[block.ts:806](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L806) ___ @@ -167,23 +172,23 @@ Returns the canonical difficulty for this block. #### Defined in -[block.ts:667](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L667) +[block.ts:772](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L772) ___ ### genTxTrie -▸ **genTxTrie**(): `Promise`<`void`\> +▸ **genTxTrie**(): `Promise`<`Uint8Array`\> Generates transaction trie for validation. #### Returns -`Promise`<`void`\> +`Promise`<`Uint8Array`\> #### Defined in -[block.ts:442](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L442) +[block.ts:520](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L520) ___ @@ -201,7 +206,7 @@ an array of error strings #### Defined in -[block.ts:470](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L470) +[block.ts:547](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L547) ___ @@ -217,7 +222,7 @@ Returns the hash of the block. #### Defined in -[block.ts:421](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L421) +[block.ts:499](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L499) ___ @@ -233,7 +238,7 @@ Determines if this block is the genesis block. #### Defined in -[block.ts:428](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L428) +[block.ts:506](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L506) ___ @@ -241,7 +246,7 @@ ___ ▸ **raw**(): [`BlockBytes`](../README.md#blockbytes) -Returns a Array of the raw Bytes Arays of this block, in order. +Returns a Array of the raw Bytes Arrays of this block, in order. #### Returns @@ -249,7 +254,7 @@ Returns a Array of the raw Bytes Arays of this block, in order. #### Defined in -[block.ts:403](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L403) +[block.ts:477](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L477) ___ @@ -265,7 +270,7 @@ Returns the rlp encoding of the block. #### Defined in -[block.ts:435](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L435) +[block.ts:513](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L513) ___ @@ -281,7 +286,7 @@ Returns the block in JSON format. #### Defined in -[block.ts:684](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L684) +[block.ts:789](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L789) ___ @@ -299,7 +304,7 @@ True if all transactions are valid, false otherwise #### Defined in -[block.ts:520](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L520) +[block.ts:597](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L597) ___ @@ -318,7 +323,7 @@ True if the transaction trie is valid, false otherwise #### Defined in -[block.ts:452](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L452) +[block.ts:529](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L529) ___ @@ -336,7 +341,7 @@ true if the uncle's hash is valid, false otherwise. #### Defined in -[block.ts:616](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L616) +[block.ts:718](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L718) ___ @@ -360,13 +365,13 @@ blob gas per block #### Defined in -[block.ts:568](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L568) +[block.ts:670](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L670) ___ ### validateData -▸ **validateData**(`onlyHeader?`): `Promise`<`void`\> +▸ **validateData**(`onlyHeader?`, `verifyTxs?`): `Promise`<`void`\> Validates the block data, throwing if invalid. This can be checked on the Block itself without needing access to any parent block @@ -380,6 +385,7 @@ It checks: | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | | `onlyHeader` | `boolean` | `false` | if only passed the header, skip validating txTrie and unclesHash (default: false) | +| `verifyTxs` | `boolean` | `true` | if set to `false`, will not check for transaction validation errors (default: true) | #### Returns @@ -387,7 +393,7 @@ It checks: #### Defined in -[block.ts:535](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L535) +[block.ts:613](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L613) ___ @@ -410,7 +416,7 @@ Throws if invalid #### Defined in -[block.ts:677](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L677) +[block.ts:782](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L782) ___ @@ -432,7 +438,7 @@ Header does not count an uncle twice. #### Defined in -[block.ts:643](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L643) +[block.ts:748](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L748) ___ @@ -450,13 +456,13 @@ true if the withdrawals trie root is valid, false otherwise #### Defined in -[block.ts:626](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L626) +[block.ts:728](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L728) ___ ### fromBeaconPayloadJson -▸ `Static` **fromBeaconPayloadJson**(`payload`, `options?`): `Promise`<[`Block`](Block.md)\> +▸ `Static` **fromBeaconPayloadJson**(`payload`, `opts?`): `Promise`<[`Block`](Block.md)\> Method to retrieve a block from a beacon payload json @@ -465,7 +471,7 @@ Method to retrieve a block from a beacon payload json | Name | Type | Description | | :------ | :------ | :------ | | `payload` | `BeaconPayloadJson` | json of a beacon beacon fetched from beacon apis | -| `options?` | [`BlockOptions`](../interfaces/BlockOptions.md) | - | +| `opts?` | [`BlockOptions`](../interfaces/BlockOptions.md) | [BlockOptions](../interfaces/BlockOptions.md) | #### Returns @@ -475,7 +481,7 @@ the block constructed block #### Defined in -[block.ts:349](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L349) +[block.ts:393](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L393) ___ @@ -498,22 +504,22 @@ Static constructor to create a block from a block data dictionary #### Defined in -[block.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L86) +[block.ts:99](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L99) ___ ### fromExecutionPayload -▸ `Static` **fromExecutionPayload**(`payload`, `options?`): `Promise`<[`Block`](Block.md)\> +▸ `Static` **fromExecutionPayload**(`payload`, `opts?`): `Promise`<[`Block`](Block.md)\> Method to retrieve a block from an execution payload #### Parameters -| Name | Type | -| :------ | :------ | -| `payload` | [`ExecutionPayload`](../README.md#executionpayload) | -| `options?` | [`BlockOptions`](../interfaces/BlockOptions.md) | +| Name | Type | Description | +| :------ | :------ | :------ | +| `payload` | [`ExecutionPayload`](../README.md#executionpayload) | - | +| `opts?` | [`BlockOptions`](../interfaces/BlockOptions.md) | [BlockOptions](../interfaces/BlockOptions.md) | #### Returns @@ -523,7 +529,7 @@ the block constructed block #### Defined in -[block.ts:289](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L289) +[block.ts:320](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L320) ___ @@ -549,7 +555,7 @@ the block specified by `blockTag` #### Defined in -[block.ts:229](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L229) +[block.ts:260](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L260) ___ @@ -572,7 +578,7 @@ Static constructor to create a block from a RLP-serialized block #### Defined in -[block.ts:135](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L135) +[block.ts:153](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L153) ___ @@ -588,7 +594,7 @@ Creates a new block object from Ethereum JSON RPC. | :------ | :------ | :------ | | `blockData` | [`JsonRpcBlock`](../interfaces/JsonRpcBlock.md) | - | | `uncles?` | `any`[] | Optional list of Ethereum JSON RPC of uncles (eth_getUncleByBlockHashAndIndex) | -| `opts?` | [`BlockOptions`](../interfaces/BlockOptions.md) | - | +| `opts?` | [`BlockOptions`](../interfaces/BlockOptions.md) | An object describing the blockchain | #### Returns @@ -596,7 +602,7 @@ Creates a new block object from Ethereum JSON RPC. #### Defined in -[block.ts:218](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L218) +[block.ts:249](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L249) ___ @@ -619,7 +625,7 @@ Static constructor to create a block from an array of Bytes values #### Defined in -[block.ts:151](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L151) +[block.ts:169](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L169) ___ @@ -642,7 +648,7 @@ Returns the txs trie root for array of TypedTransaction #### Defined in -[block.ts:72](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L72) +[block.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L85) ___ @@ -665,4 +671,4 @@ Returns the withdrawals trie root for array of Withdrawal. #### Defined in -[block.ts:59](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L59) +[block.ts:72](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/block.ts#L72) diff --git a/packages/block/docs/classes/BlockHeader.md b/packages/block/docs/classes/BlockHeader.md index 8702dba17..1fa40afe7 100644 --- a/packages/block/docs/classes/BlockHeader.md +++ b/packages/block/docs/classes/BlockHeader.md @@ -42,6 +42,7 @@ An object that represents the block header. - [calcDataFee](BlockHeader.md#calcdatafee) - [calcNextBaseFee](BlockHeader.md#calcnextbasefee) +- [calcNextBlobGasPrice](BlockHeader.md#calcnextblobgasprice) - [calcNextExcessBlobGas](BlockHeader.md#calcnextexcessblobgas) - [cliqueEpochTransitionSigners](BlockHeader.md#cliqueepochtransitionsigners) - [cliqueExtraSeal](BlockHeader.md#cliqueextraseal) @@ -67,7 +68,7 @@ An object that represents the block header. ### constructor -â€ĸ **new BlockHeader**(`headerData`, `options?`) +â€ĸ **new BlockHeader**(`headerData`, `opts?`) This constructor takes the values, validates them, assigns them and freezes the object. @@ -81,11 +82,11 @@ varying data types. For a default empty header, use [fromHeaderData](BlockHeader | Name | Type | | :------ | :------ | | `headerData` | [`HeaderData`](../interfaces/HeaderData.md) | -| `options` | [`BlockOptions`](../interfaces/BlockOptions.md) | +| `opts` | [`BlockOptions`](../interfaces/BlockOptions.md) | #### Defined in -[header.ts:147](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L147) +[header.ts:150](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L150) ## Properties @@ -95,7 +96,7 @@ varying data types. For a default empty header, use [fromHeaderData](BlockHeader #### Defined in -[header.ts:60](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L60) +[header.ts:61](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L61) ___ @@ -105,7 +106,7 @@ ___ #### Defined in -[header.ts:62](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L62) +[header.ts:63](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L63) ___ @@ -115,7 +116,7 @@ ___ #### Defined in -[header.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L47) +[header.ts:48](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L48) ___ @@ -125,7 +126,7 @@ ___ #### Defined in -[header.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L66) +[header.ts:67](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L67) ___ @@ -135,7 +136,7 @@ ___ #### Defined in -[header.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L52) +[header.ts:53](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L53) ___ @@ -145,7 +146,7 @@ ___ #### Defined in -[header.ts:63](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L63) +[header.ts:64](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L64) ___ @@ -155,7 +156,7 @@ ___ #### Defined in -[header.ts:57](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L57) +[header.ts:58](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L58) ___ @@ -165,7 +166,7 @@ ___ #### Defined in -[header.ts:54](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L54) +[header.ts:55](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L55) ___ @@ -175,7 +176,7 @@ ___ #### Defined in -[header.ts:55](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L55) +[header.ts:56](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L56) ___ @@ -185,7 +186,7 @@ ___ #### Defined in -[header.ts:51](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L51) +[header.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L52) ___ @@ -195,7 +196,7 @@ ___ #### Defined in -[header.ts:58](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L58) +[header.ts:59](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L59) ___ @@ -205,7 +206,7 @@ ___ #### Defined in -[header.ts:59](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L59) +[header.ts:60](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L60) ___ @@ -215,7 +216,7 @@ ___ #### Defined in -[header.ts:53](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L53) +[header.ts:54](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L54) ___ @@ -225,7 +226,7 @@ ___ #### Defined in -[header.ts:64](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L64) +[header.ts:65](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L65) ___ @@ -235,7 +236,7 @@ ___ #### Defined in -[header.ts:45](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L45) +[header.ts:46](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L46) ___ @@ -245,7 +246,7 @@ ___ #### Defined in -[header.ts:50](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L50) +[header.ts:51](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L51) ___ @@ -255,7 +256,7 @@ ___ #### Defined in -[header.ts:48](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L48) +[header.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L49) ___ @@ -265,7 +266,7 @@ ___ #### Defined in -[header.ts:56](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L56) +[header.ts:57](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L57) ___ @@ -275,7 +276,7 @@ ___ #### Defined in -[header.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L49) +[header.ts:50](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L50) ___ @@ -285,7 +286,7 @@ ___ #### Defined in -[header.ts:46](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L46) +[header.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L47) ___ @@ -295,7 +296,7 @@ ___ #### Defined in -[header.ts:61](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L61) +[header.ts:62](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L62) ## Accessors @@ -311,7 +312,7 @@ EIP-4399: After merge to PoS, `mixHash` supplanted as `prevRandao` #### Defined in -[header.ts:75](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L75) +[header.ts:78](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L78) ## Methods @@ -335,7 +336,7 @@ the total blob gas fee for numBlobs blobs #### Defined in -[header.ts:598](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L598) +[header.ts:621](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L621) ___ @@ -351,7 +352,25 @@ Calculates the base fee for a potential next block #### Defined in -[header.ts:537](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L537) +[header.ts:552](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L552) + +___ + +### calcNextBlobGasPrice + +▸ **calcNextBlobGasPrice**(): `bigint` + +Calculate the blob gas price of the block built on top of this one + +#### Returns + +`bigint` + +The blob gas price + +#### Defined in + +[header.ts:648](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L648) ___ @@ -367,7 +386,7 @@ Calculates the excess blob gas for next (hopefully) post EIP 4844 block. #### Defined in -[header.ts:609](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L609) +[header.ts:632](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L632) ___ @@ -388,7 +407,7 @@ in conjunction with [cliqueIsEpochTransition](BlockHeader.md#cliqueisepochtransi #### Defined in -[header.ts:830](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L830) +[header.ts:870](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L870) ___ @@ -405,7 +424,7 @@ Returns extra seal data #### Defined in -[header.ts:798](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L798) +[header.ts:837](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L837) ___ @@ -422,7 +441,7 @@ Returns extra vanity data #### Defined in -[header.ts:789](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L789) +[header.ts:828](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L828) ___ @@ -439,7 +458,7 @@ header (only clique PoA, throws otherwise) #### Defined in -[header.ts:777](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L777) +[header.ts:816](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L816) ___ @@ -455,7 +474,7 @@ PoA clique signature hash without the seal. #### Defined in -[header.ts:766](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L766) +[header.ts:805](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L805) ___ @@ -471,7 +490,7 @@ Returns the signer address #### Defined in -[header.ts:867](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L867) +[header.ts:907](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L907) ___ @@ -496,7 +515,7 @@ Verifies the signature of the block (last 65 bytes of extraData field) #### Defined in -[header.ts:855](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L855) +[header.ts:895](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L895) ___ @@ -512,7 +531,7 @@ Return a compact error string representation of the object #### Defined in -[header.ts:950](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L950) +[header.ts:994](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L994) ___ @@ -534,7 +553,7 @@ Returns the canonical difficulty for this block. #### Defined in -[header.ts:695](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L695) +[header.ts:734](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L734) ___ @@ -552,7 +571,7 @@ the price in gwei per unit of blob gas spent #### Defined in -[header.ts:581](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L581) +[header.ts:596](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L596) ___ @@ -568,7 +587,7 @@ Returns the hash of the block header. #### Defined in -[header.ts:664](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L664) +[header.ts:703](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L703) ___ @@ -584,7 +603,7 @@ Checks if the block header is a genesis header. #### Defined in -[header.ts:677](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L677) +[header.ts:716](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L716) ___ @@ -600,7 +619,7 @@ Returns a Uint8Array Array of the raw Bytes in this header, in order. #### Defined in -[header.ts:624](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L624) +[header.ts:655](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L655) ___ @@ -616,7 +635,7 @@ Returns the rlp encoding of the block header. #### Defined in -[header.ts:884](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L884) +[header.ts:924](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L924) ___ @@ -632,7 +651,7 @@ Returns the block header in JSON format. #### Defined in -[header.ts:891](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L891) +[header.ts:931](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L931) ___ @@ -655,7 +674,7 @@ Throws if out of bounds. #### Defined in -[header.ts:499](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L499) +[header.ts:505](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L505) ___ @@ -678,7 +697,7 @@ Static constructor to create a block header from a header data dictionary #### Defined in -[header.ts:91](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L91) +[header.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L94) ___ @@ -701,7 +720,7 @@ Static constructor to create a block header from a RLP-serialized header #### Defined in -[header.ts:101](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L101) +[header.ts:104](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L104) ___ @@ -724,4 +743,4 @@ Static constructor to create a block header from an array of Bytes values #### Defined in -[header.ts:115](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L115) +[header.ts:118](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/header.ts#L118) diff --git a/packages/block/docs/interfaces/BlockData.md b/packages/block/docs/interfaces/BlockData.md index 07ae48e1b..7ab271c68 100644 --- a/packages/block/docs/interfaces/BlockData.md +++ b/packages/block/docs/interfaces/BlockData.md @@ -8,6 +8,7 @@ A block's data. ### Properties +- [executionWitness](BlockData.md#executionwitness) - [header](BlockData.md#header) - [transactions](BlockData.md#transactions) - [uncleHeaders](BlockData.md#uncleheaders) @@ -15,6 +16,18 @@ A block's data. ## Properties +### executionWitness + +â€ĸ `Optional` **executionWitness**: ``null`` \| [`VerkleExecutionWitness`](VerkleExecutionWitness.md) + +EIP-6800: Verkle Proof Data (experimental) + +#### Defined in + +[types.ts:153](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L153) + +___ + ### header â€ĸ `Optional` **header**: [`HeaderData`](HeaderData.md) @@ -23,7 +36,7 @@ Header data for the block #### Defined in -[types.ts:107](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L107) +[types.ts:146](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L146) ___ @@ -33,7 +46,7 @@ ___ #### Defined in -[types.ts:108](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L108) +[types.ts:147](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L147) ___ @@ -43,7 +56,7 @@ ___ #### Defined in -[types.ts:109](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L109) +[types.ts:148](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L148) ___ @@ -53,4 +66,4 @@ ___ #### Defined in -[types.ts:110](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L110) +[types.ts:149](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L149) diff --git a/packages/block/docs/interfaces/HeaderData.md b/packages/block/docs/interfaces/HeaderData.md index 2468291a2..70f584aa2 100644 --- a/packages/block/docs/interfaces/HeaderData.md +++ b/packages/block/docs/interfaces/HeaderData.md @@ -37,7 +37,7 @@ A block header's data. #### Defined in -[types.ts:93](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L93) +[types.ts:132](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L132) ___ @@ -47,7 +47,7 @@ ___ #### Defined in -[types.ts:95](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L95) +[types.ts:134](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L134) ___ @@ -57,7 +57,7 @@ ___ #### Defined in -[types.ts:80](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L80) +[types.ts:119](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L119) ___ @@ -67,7 +67,7 @@ ___ #### Defined in -[types.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L85) +[types.ts:124](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L124) ___ @@ -77,7 +77,7 @@ ___ #### Defined in -[types.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L96) +[types.ts:135](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L135) ___ @@ -87,7 +87,7 @@ ___ #### Defined in -[types.ts:90](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L90) +[types.ts:129](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L129) ___ @@ -97,7 +97,7 @@ ___ #### Defined in -[types.ts:87](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L87) +[types.ts:126](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L126) ___ @@ -107,7 +107,7 @@ ___ #### Defined in -[types.ts:88](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L88) +[types.ts:127](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L127) ___ @@ -117,7 +117,7 @@ ___ #### Defined in -[types.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L84) +[types.ts:123](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L123) ___ @@ -127,7 +127,7 @@ ___ #### Defined in -[types.ts:91](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L91) +[types.ts:130](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L130) ___ @@ -137,7 +137,7 @@ ___ #### Defined in -[types.ts:92](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L92) +[types.ts:131](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L131) ___ @@ -147,7 +147,7 @@ ___ #### Defined in -[types.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L86) +[types.ts:125](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L125) ___ @@ -157,7 +157,7 @@ ___ #### Defined in -[types.ts:97](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L97) +[types.ts:136](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L136) ___ @@ -167,7 +167,7 @@ ___ #### Defined in -[types.ts:78](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L78) +[types.ts:117](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L117) ___ @@ -177,7 +177,7 @@ ___ #### Defined in -[types.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L83) +[types.ts:122](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L122) ___ @@ -187,7 +187,7 @@ ___ #### Defined in -[types.ts:81](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L81) +[types.ts:120](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L120) ___ @@ -197,7 +197,7 @@ ___ #### Defined in -[types.ts:89](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L89) +[types.ts:128](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L128) ___ @@ -207,7 +207,7 @@ ___ #### Defined in -[types.ts:82](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L82) +[types.ts:121](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L121) ___ @@ -217,7 +217,7 @@ ___ #### Defined in -[types.ts:79](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L79) +[types.ts:118](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L118) ___ @@ -227,4 +227,4 @@ ___ #### Defined in -[types.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L94) +[types.ts:133](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L133) diff --git a/packages/block/docs/interfaces/JsonBlock.md b/packages/block/docs/interfaces/JsonBlock.md index 618991eda..efdd041e9 100644 --- a/packages/block/docs/interfaces/JsonBlock.md +++ b/packages/block/docs/interfaces/JsonBlock.md @@ -8,6 +8,7 @@ An object with the block's data represented as strings. ### Properties +- [executionWitness](JsonBlock.md#executionwitness) - [header](JsonBlock.md#header) - [transactions](JsonBlock.md#transactions) - [uncleHeaders](JsonBlock.md#uncleheaders) @@ -15,6 +16,16 @@ An object with the block's data represented as strings. ## Properties +### executionWitness + +â€ĸ `Optional` **executionWitness**: ``null`` \| [`VerkleExecutionWitness`](VerkleExecutionWitness.md) + +#### Defined in + +[types.ts:192](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L192) + +___ + ### header â€ĸ `Optional` **header**: [`JsonHeader`](JsonHeader.md) @@ -23,7 +34,7 @@ Header data for the block #### Defined in -[types.ts:133](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L133) +[types.ts:188](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L188) ___ @@ -33,7 +44,7 @@ ___ #### Defined in -[types.ts:134](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L134) +[types.ts:189](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L189) ___ @@ -43,7 +54,7 @@ ___ #### Defined in -[types.ts:135](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L135) +[types.ts:190](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L190) ___ @@ -53,4 +64,4 @@ ___ #### Defined in -[types.ts:136](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L136) +[types.ts:191](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L191) diff --git a/packages/block/docs/interfaces/JsonHeader.md b/packages/block/docs/interfaces/JsonHeader.md index 1d7a00253..8b402b01a 100644 --- a/packages/block/docs/interfaces/JsonHeader.md +++ b/packages/block/docs/interfaces/JsonHeader.md @@ -37,7 +37,7 @@ An object with the block header's data represented as strings. #### Defined in -[types.ts:158](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L158) +[types.ts:214](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L214) ___ @@ -47,7 +47,7 @@ ___ #### Defined in -[types.ts:160](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L160) +[types.ts:216](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L216) ___ @@ -57,7 +57,7 @@ ___ #### Defined in -[types.ts:145](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L145) +[types.ts:201](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L201) ___ @@ -67,7 +67,7 @@ ___ #### Defined in -[types.ts:150](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L150) +[types.ts:206](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L206) ___ @@ -77,7 +77,7 @@ ___ #### Defined in -[types.ts:161](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L161) +[types.ts:217](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L217) ___ @@ -87,7 +87,7 @@ ___ #### Defined in -[types.ts:155](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L155) +[types.ts:211](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L211) ___ @@ -97,7 +97,7 @@ ___ #### Defined in -[types.ts:152](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L152) +[types.ts:208](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L208) ___ @@ -107,7 +107,7 @@ ___ #### Defined in -[types.ts:153](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L153) +[types.ts:209](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L209) ___ @@ -117,7 +117,7 @@ ___ #### Defined in -[types.ts:149](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L149) +[types.ts:205](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L205) ___ @@ -127,7 +127,7 @@ ___ #### Defined in -[types.ts:156](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L156) +[types.ts:212](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L212) ___ @@ -137,7 +137,7 @@ ___ #### Defined in -[types.ts:157](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L157) +[types.ts:213](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L213) ___ @@ -147,7 +147,7 @@ ___ #### Defined in -[types.ts:151](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L151) +[types.ts:207](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L207) ___ @@ -157,7 +157,7 @@ ___ #### Defined in -[types.ts:162](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L162) +[types.ts:218](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L218) ___ @@ -167,7 +167,7 @@ ___ #### Defined in -[types.ts:143](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L143) +[types.ts:199](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L199) ___ @@ -177,7 +177,7 @@ ___ #### Defined in -[types.ts:148](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L148) +[types.ts:204](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L204) ___ @@ -187,7 +187,7 @@ ___ #### Defined in -[types.ts:146](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L146) +[types.ts:202](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L202) ___ @@ -197,7 +197,7 @@ ___ #### Defined in -[types.ts:154](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L154) +[types.ts:210](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L210) ___ @@ -207,7 +207,7 @@ ___ #### Defined in -[types.ts:147](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L147) +[types.ts:203](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L203) ___ @@ -217,7 +217,7 @@ ___ #### Defined in -[types.ts:144](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L144) +[types.ts:200](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L200) ___ @@ -227,4 +227,4 @@ ___ #### Defined in -[types.ts:159](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L159) +[types.ts:215](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L215) diff --git a/packages/block/docs/interfaces/JsonRpcBlock.md b/packages/block/docs/interfaces/JsonRpcBlock.md index bfbe6e2f1..a5f9b612f 100644 --- a/packages/block/docs/interfaces/JsonRpcBlock.md +++ b/packages/block/docs/interfaces/JsonRpcBlock.md @@ -10,6 +10,7 @@ - [blobGasUsed](JsonRpcBlock.md#blobgasused) - [difficulty](JsonRpcBlock.md#difficulty) - [excessBlobGas](JsonRpcBlock.md#excessblobgas) +- [executionWitness](JsonRpcBlock.md#executionwitness) - [extraData](JsonRpcBlock.md#extradata) - [gasLimit](JsonRpcBlock.md#gaslimit) - [gasUsed](JsonRpcBlock.md#gasused) @@ -41,7 +42,7 @@ #### Defined in -[types.ts:189](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L189) +[types.ts:245](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L245) ___ @@ -51,7 +52,7 @@ ___ #### Defined in -[types.ts:192](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L192) +[types.ts:248](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L248) ___ @@ -61,7 +62,7 @@ ___ #### Defined in -[types.ts:180](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L180) +[types.ts:236](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L236) ___ @@ -71,7 +72,17 @@ ___ #### Defined in -[types.ts:193](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L193) +[types.ts:249](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L249) + +___ + +### executionWitness + +â€ĸ `Optional` **executionWitness**: ``null`` \| [`VerkleExecutionWitness`](VerkleExecutionWitness.md) + +#### Defined in + +[types.ts:251](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L251) ___ @@ -81,7 +92,7 @@ ___ #### Defined in -[types.ts:182](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L182) +[types.ts:238](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L238) ___ @@ -91,7 +102,7 @@ ___ #### Defined in -[types.ts:184](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L184) +[types.ts:240](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L240) ___ @@ -101,7 +112,7 @@ ___ #### Defined in -[types.ts:185](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L185) +[types.ts:241](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L241) ___ @@ -111,7 +122,7 @@ ___ #### Defined in -[types.ts:170](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L170) +[types.ts:226](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L226) ___ @@ -121,7 +132,7 @@ ___ #### Defined in -[types.ts:175](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L175) +[types.ts:231](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L231) ___ @@ -131,7 +142,7 @@ ___ #### Defined in -[types.ts:179](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L179) +[types.ts:235](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L235) ___ @@ -141,7 +152,7 @@ ___ #### Defined in -[types.ts:172](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L172) +[types.ts:228](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L228) ___ @@ -151,7 +162,7 @@ ___ #### Defined in -[types.ts:173](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L173) +[types.ts:229](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L229) ___ @@ -161,7 +172,7 @@ ___ #### Defined in -[types.ts:169](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L169) +[types.ts:225](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L225) ___ @@ -171,7 +182,7 @@ ___ #### Defined in -[types.ts:194](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L194) +[types.ts:250](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L250) ___ @@ -181,7 +192,7 @@ ___ #### Defined in -[types.ts:171](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L171) +[types.ts:227](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L227) ___ @@ -191,7 +202,7 @@ ___ #### Defined in -[types.ts:178](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L178) +[types.ts:234](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L234) ___ @@ -201,7 +212,7 @@ ___ #### Defined in -[types.ts:174](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L174) +[types.ts:230](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L230) ___ @@ -211,7 +222,7 @@ ___ #### Defined in -[types.ts:183](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L183) +[types.ts:239](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L239) ___ @@ -221,7 +232,7 @@ ___ #### Defined in -[types.ts:177](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L177) +[types.ts:233](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L233) ___ @@ -231,7 +242,7 @@ ___ #### Defined in -[types.ts:186](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L186) +[types.ts:242](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L242) ___ @@ -241,7 +252,7 @@ ___ #### Defined in -[types.ts:181](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L181) +[types.ts:237](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L237) ___ @@ -251,7 +262,7 @@ ___ #### Defined in -[types.ts:187](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L187) +[types.ts:243](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L243) ___ @@ -261,7 +272,7 @@ ___ #### Defined in -[types.ts:176](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L176) +[types.ts:232](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L232) ___ @@ -271,7 +282,7 @@ ___ #### Defined in -[types.ts:188](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L188) +[types.ts:244](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L244) ___ @@ -281,7 +292,7 @@ ___ #### Defined in -[types.ts:190](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L190) +[types.ts:246](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L246) ___ @@ -291,4 +302,4 @@ ___ #### Defined in -[types.ts:191](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L191) +[types.ts:247](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L247) diff --git a/packages/block/docs/interfaces/VerkleExecutionWitness.md b/packages/block/docs/interfaces/VerkleExecutionWitness.md new file mode 100644 index 000000000..00fad0e8e --- /dev/null +++ b/packages/block/docs/interfaces/VerkleExecutionWitness.md @@ -0,0 +1,40 @@ +[@ethereumjs/block](../README.md) / VerkleExecutionWitness + +# Interface: VerkleExecutionWitness + +Experimental, object format could eventual change. +An object that provides the state and proof necessary for verkle stateless execution + +## Table of contents + +### Properties + +- [stateDiff](VerkleExecutionWitness.md#statediff) +- [verkleProof](VerkleExecutionWitness.md#verkleproof) + +## Properties + +### stateDiff + +â€ĸ **stateDiff**: [`VerkleStateDiff`](VerkleStateDiff.md)[] + +An array of state diffs. +Each item corresponding to state accesses or state modifications of the block. +In the current design, it also contains the resulting state of the block execution (post-state). + +#### Defined in + +[types.ts:105](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L105) + +___ + +### verkleProof + +â€ĸ **verkleProof**: [`VerkleProof`](VerkleProof.md) + +The verkle proof for the block. +Proves that the provided stateDiff belongs to the canonical verkle tree. + +#### Defined in + +[types.ts:110](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L110) diff --git a/packages/block/docs/interfaces/VerkleProof.md b/packages/block/docs/interfaces/VerkleProof.md new file mode 100644 index 000000000..23d25192f --- /dev/null +++ b/packages/block/docs/interfaces/VerkleProof.md @@ -0,0 +1,71 @@ +[@ethereumjs/block](../README.md) / VerkleProof + +# Interface: VerkleProof + +## Table of contents + +### Properties + +- [commitmentsByPath](VerkleProof.md#commitmentsbypath) +- [d](VerkleProof.md#d) +- [depthExtensionPresent](VerkleProof.md#depthextensionpresent) +- [ipaProof](VerkleProof.md#ipaproof) +- [otherStems](VerkleProof.md#otherstems) + +## Properties + +### commitmentsByPath + +â€ĸ **commitmentsByPath**: `string`[] + +#### Defined in + +[types.ts:75](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L75) + +___ + +### d + +â€ĸ **d**: `string` + +#### Defined in + +[types.ts:76](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L76) + +___ + +### depthExtensionPresent + +â€ĸ **depthExtensionPresent**: `string` + +#### Defined in + +[types.ts:77](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L77) + +___ + +### ipaProof + +â€ĸ **ipaProof**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `cl` | `string`[] | +| `cr` | `string`[] | +| `finalEvaluation` | `string` | + +#### Defined in + +[types.ts:78](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L78) + +___ + +### otherStems + +â€ĸ **otherStems**: `string`[] + +#### Defined in + +[types.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L83) diff --git a/packages/block/docs/interfaces/VerkleStateDiff.md b/packages/block/docs/interfaces/VerkleStateDiff.md new file mode 100644 index 000000000..7ec08c132 --- /dev/null +++ b/packages/block/docs/interfaces/VerkleStateDiff.md @@ -0,0 +1,30 @@ +[@ethereumjs/block](../README.md) / VerkleStateDiff + +# Interface: VerkleStateDiff + +## Table of contents + +### Properties + +- [stem](VerkleStateDiff.md#stem) +- [suffixDiffs](VerkleStateDiff.md#suffixdiffs) + +## Properties + +### stem + +â€ĸ **stem**: `string` + +#### Defined in + +[types.ts:87](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L87) + +___ + +### suffixDiffs + +â€ĸ **suffixDiffs**: { `currentValue`: ``null`` \| `string` ; `newValue`: ``null`` \| `string` ; `suffix`: `string` \| `number` }[] + +#### Defined in + +[types.ts:88](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/block/src/types.ts#L88) diff --git a/packages/block/examples/4844.ts b/packages/block/examples/4844.ts index bc2a9fe04..189bead7c 100644 --- a/packages/block/examples/4844.ts +++ b/packages/block/examples/4844.ts @@ -1,13 +1,13 @@ import { Common, Chain, Hardfork } from '@ethereumjs/common' import { Block } from '@ethereumjs/block' import { BlobEIP4844Transaction } from '@ethereumjs/tx' -import { Address, initKZG } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { Address } from '@ethereumjs/util' +import { loadKZG } from 'kzg-wasm' import { randomBytes } from 'crypto' const main = async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Cancun, diff --git a/packages/block/package.json b/packages/block/package.json index 8fe29e368..bfbbe30e2 100644 --- a/packages/block/package.json +++ b/packages/block/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/block", - "version": "5.1.1", + "version": "5.2.0", "description": "Provides Block serialization and help functions", "keywords": [ "ethereum", @@ -41,20 +41,20 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --config=vitest.config.browser.ts --browser.name=webkit --browser.provider=playwright --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/common": "^4.2.0", + "@ethereumjs/common": "^4.3.0", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/trie": "^6.1.1", - "@ethereumjs/tx": "^5.2.1", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/trie": "^6.2.0", + "@ethereumjs/tx": "^5.3.0", + "@ethereumjs/util": "^9.0.3", "ethereum-cryptography": "^2.1.3" }, "devDependencies": { - "kzg-wasm": "^0.2.0" + "kzg-wasm": "^0.4.0" }, "engines": { "node": ">=18" diff --git a/packages/block/src/block.ts b/packages/block/src/block.ts index 9032b1e9c..fe1a4df2b 100644 --- a/packages/block/src/block.ts +++ b/packages/block/src/block.ts @@ -5,6 +5,7 @@ import { BlobEIP4844Transaction, Capability, TransactionFactory } from '@ethereu import { BIGINT_0, KECCAK256_RLP, + KECCAK256_RLP_ARRAY, Withdrawal, bigIntToHex, bytesToHex, @@ -62,6 +63,7 @@ export class Block { protected cache: { txTrieRoot?: Uint8Array + withdrawalsTrieRoot?: Uint8Array } = {} /** @@ -228,12 +230,16 @@ export class Block { // executionWitness are not part of the EL fetched blocks via eth_ bodies method // they are currently only available via the engine api constructed blocks let executionWitness - if (header.common.isActivatedEIP(6800) && executionWitnessBytes !== undefined) { - executionWitness = JSON.parse(bytesToUtf8(RLP.decode(executionWitnessBytes) as Uint8Array)) - } else { - // don't assign default witness if eip 6800 is implemented as it leads to incorrect - // assumptions while executing the block. if not present in input implies its unavailable - executionWitness = null + if (header.common.isActivatedEIP(6800)) { + if (executionWitnessBytes !== undefined) { + executionWitness = JSON.parse(bytesToUtf8(RLP.decode(executionWitnessBytes) as Uint8Array)) + } else if (opts?.executionWitness !== undefined) { + executionWitness = opts.executionWitness + } else { + // don't assign default witness if eip 6800 is implemented as it leads to incorrect + // assumptions while executing the block. if not present in input implies its unavailable + executionWitness = null + } } return new Block(header, transactions, uncleHeaders, withdrawals, opts, executionWitness) @@ -716,6 +722,9 @@ export class Block { * @returns true if the uncle's hash is valid, false otherwise. */ uncleHashIsValid(): boolean { + if (this.uncleHeaders.length === 0) { + return equalsBytes(KECCAK256_RLP_ARRAY, this.header.uncleHash) + } const uncles = this.uncleHeaders.map((uh) => uh.raw()) const raw = RLP.encode(uncles) return equalsBytes(this.keccakFunction(raw), this.header.uncleHash) @@ -729,11 +738,21 @@ export class Block { if (!this.common.isActivatedEIP(4895)) { throw new Error('EIP 4895 is not activated') } - const withdrawalsRoot = await Block.genWithdrawalsTrieRoot( - this.withdrawals!, - new Trie({ common: this.common }) - ) - return equalsBytes(withdrawalsRoot, this.header.withdrawalsRoot!) + + let result + if (this.withdrawals!.length === 0) { + result = equalsBytes(this.header.withdrawalsRoot!, KECCAK256_RLP) + return result + } + + if (this.cache.withdrawalsTrieRoot === undefined) { + this.cache.withdrawalsTrieRoot = await Block.genWithdrawalsTrieRoot( + this.withdrawals!, + new Trie({ common: this.common }) + ) + } + result = equalsBytes(this.cache.withdrawalsTrieRoot, this.header.withdrawalsRoot!) + return result } /** @@ -800,6 +819,37 @@ export class Block { } } + toExecutionPayload(): ExecutionPayload { + const blockJson = this.toJSON() + const header = blockJson.header! + const transactions = this.transactions.map((tx) => bytesToHex(tx.serialize())) ?? [] + const withdrawalsArr = blockJson.withdrawals ? { withdrawals: blockJson.withdrawals } : {} + + const executionPayload: ExecutionPayload = { + blockNumber: header.number!, + parentHash: header.parentHash!, + feeRecipient: header.coinbase!, + stateRoot: header.stateRoot!, + receiptsRoot: header.receiptTrie!, + logsBloom: header.logsBloom!, + gasLimit: header.gasLimit!, + gasUsed: header.gasUsed!, + timestamp: header.timestamp!, + extraData: header.extraData!, + baseFeePerGas: header.baseFeePerGas!, + blobGasUsed: header.blobGasUsed, + excessBlobGas: header.excessBlobGas, + blockHash: bytesToHex(this.hash()), + prevRandao: header.mixHash!, + transactions, + ...withdrawalsArr, + parentBeaconBlockRoot: header.parentBeaconBlockRoot, + executionWitness: this.executionWitness, + } + + return executionPayload + } + /** * Return a compact error string representation of the object */ diff --git a/packages/block/src/from-beacon-payload.ts b/packages/block/src/from-beacon-payload.ts index 79aafd1bf..7c0d10eed 100644 --- a/packages/block/src/from-beacon-payload.ts +++ b/packages/block/src/from-beacon-payload.ts @@ -1,39 +1,93 @@ import { bigIntToHex } from '@ethereumjs/util' import type { ExecutionPayload, VerkleExecutionWitness } from './types.js' +import type { PrefixedHexString } from '@ethereumjs/util' type BeaconWithdrawal = { - index: string - validator_index: string - address: string - amount: string + index: PrefixedHexString + validator_index: PrefixedHexString + address: PrefixedHexString + amount: PrefixedHexString } // Payload json that one gets using the beacon apis // curl localhost:5052/eth/v2/beacon/blocks/56610 | jq .data.message.body.execution_payload export type BeaconPayloadJson = { - parent_hash: string - fee_recipient: string - state_root: string - receipts_root: string - logs_bloom: string - prev_randao: string - block_number: string - gas_limit: string - gas_used: string - timestamp: string - extra_data: string - base_fee_per_gas: string - block_hash: string - transactions: string[] + parent_hash: PrefixedHexString + fee_recipient: PrefixedHexString + state_root: PrefixedHexString + receipts_root: PrefixedHexString + logs_bloom: PrefixedHexString + prev_randao: PrefixedHexString + block_number: PrefixedHexString + gas_limit: PrefixedHexString + gas_used: PrefixedHexString + timestamp: PrefixedHexString + extra_data: PrefixedHexString + base_fee_per_gas: PrefixedHexString + block_hash: PrefixedHexString + transactions: PrefixedHexString[] withdrawals?: BeaconWithdrawal[] - blob_gas_used?: string - excess_blob_gas?: string - parent_beacon_block_root?: string + blob_gas_used?: PrefixedHexString + excess_blob_gas?: PrefixedHexString + parent_beacon_block_root?: PrefixedHexString // the casing of VerkleExecutionWitness remains same camel case for now execution_witness?: VerkleExecutionWitness } +type VerkleProofSnakeJson = { + commitments_by_path: PrefixedHexString[] + d: PrefixedHexString + depth_extension_present: PrefixedHexString + ipa_proof: { + cl: PrefixedHexString[] + cr: PrefixedHexString[] + final_evaluation: PrefixedHexString + } + other_stems: PrefixedHexString[] +} + +type VerkleStateDiffSnakeJson = { + stem: PrefixedHexString + suffix_diffs: { + current_value: PrefixedHexString | null + new_value: PrefixedHexString | null + suffix: number | string + }[] +} + +type VerkleExecutionWitnessSnakeJson = { + state_diff: VerkleStateDiffSnakeJson[] + verkle_proof: VerkleProofSnakeJson +} + +function parseExecutionWitnessFromSnakeJson({ + state_diff, + verkle_proof, +}: VerkleExecutionWitnessSnakeJson): VerkleExecutionWitness { + return { + stateDiff: state_diff.map(({ stem, suffix_diffs }) => ({ + stem, + suffixDiffs: suffix_diffs.map(({ current_value, new_value, suffix }) => ({ + currentValue: current_value, + newValue: new_value, + suffix, + })), + })), + verkleProof: { + commitmentsByPath: verkle_proof.commitments_by_path, + d: verkle_proof.d, + depthExtensionPresent: verkle_proof.depth_extension_present, + ipaProof: { + cl: verkle_proof.ipa_proof.cl, + cr: verkle_proof.ipa_proof.cr, + finalEvaluation: verkle_proof.ipa_proof.final_evaluation, + }, + otherStems: verkle_proof.other_stems, + }, + } +} + /** * Converts a beacon block execution payload JSON object {@link BeaconPayloadJson} to the {@link ExecutionPayload} data needed to construct a {@link Block}. * The JSON data can be retrieved from a consensus layer (CL) client on this Beacon API `/eth/v2/beacon/blocks/[block number]` @@ -75,9 +129,13 @@ export function executionPayloadFromBeaconPayload(payload: BeaconPayloadJson): E executionPayload.parentBeaconBlockRoot = payload.parent_beacon_block_root } if (payload.execution_witness !== undefined && payload.execution_witness !== null) { - // the casing structure in payload is already camel case, might be updated in - // kaustinen relaunch - executionPayload.executionWitness = payload.execution_witness + // the casing structure in payload could be camel case or snake depending upon the CL + executionPayload.executionWitness = + payload.execution_witness.verkleProof !== undefined + ? payload.execution_witness + : parseExecutionWitnessFromSnakeJson( + payload.execution_witness as unknown as VerkleExecutionWitnessSnakeJson + ) } return executionPayload diff --git a/packages/block/src/helpers.ts b/packages/block/src/helpers.ts index 679a622de..d78a40e8a 100644 --- a/packages/block/src/helpers.ts +++ b/packages/block/src/helpers.ts @@ -3,12 +3,13 @@ import { BIGINT_0, BIGINT_1, TypeOutput, isHexString, toType } from '@ethereumjs import type { BlockHeaderBytes, HeaderData } from './types.js' import type { TypedTransaction } from '@ethereumjs/tx' +import type { PrefixedHexString } from '@ethereumjs/util' /** * Returns a 0x-prefixed hex number string from a hex string or string integer. * @param {string} input string to check, convert, and return */ -export const numberToHex = function (input?: string) { +export const numberToHex = function (input?: string): PrefixedHexString | undefined { if (input === undefined) return undefined if (!isHexString(input)) { const regex = new RegExp(/^\d+$/) // test to make sure input contains only digits @@ -16,7 +17,7 @@ export const numberToHex = function (input?: string) { const msg = `Cannot convert string to hex string. numberToHex only supports 0x-prefixed hex or integer strings but the given string was: ${input}` throw new Error(msg) } - return '0x' + parseInt(input, 10).toString(16) + return `0x${parseInt(input, 10).toString(16)}` } return input } diff --git a/packages/block/src/index.ts b/packages/block/src/index.ts index b6b4faa48..f6c5da85a 100644 --- a/packages/block/src/index.ts +++ b/packages/block/src/index.ts @@ -1,5 +1,5 @@ export { Block } from './block.js' -export { executionPayloadFromBeaconPayload } from './from-beacon-payload.js' +export { type BeaconPayloadJson, executionPayloadFromBeaconPayload } from './from-beacon-payload.js' export { BlockHeader } from './header.js' export { getDifficulty, valuesArrayToHeaderData } from './helpers.js' export * from './types.js' diff --git a/packages/block/src/types.ts b/packages/block/src/types.ts index 74520b1a4..75feea03d 100644 --- a/packages/block/src/types.ts +++ b/packages/block/src/types.ts @@ -69,6 +69,8 @@ export interface BlockOptions { * Skip consensus format validation checks on header if set. Defaults to false. */ skipConsensusFormatValidation?: boolean + + executionWitness?: VerkleExecutionWitness } export interface VerkleProof { @@ -193,61 +195,61 @@ export interface JsonBlock { } /** - * An object with the block header's data represented as strings. + * An object with the block header's data represented as 0x-prefixed hex strings. */ export interface JsonHeader { - parentHash?: string - uncleHash?: string - coinbase?: string - stateRoot?: string - transactionsTrie?: string - receiptTrie?: string - logsBloom?: string - difficulty?: string - number?: string - gasLimit?: string - gasUsed?: string - timestamp?: string - extraData?: string - mixHash?: string - nonce?: string - baseFeePerGas?: string - withdrawalsRoot?: string - blobGasUsed?: string - excessBlobGas?: string - parentBeaconBlockRoot?: string + parentHash?: PrefixedHexString + uncleHash?: PrefixedHexString + coinbase?: PrefixedHexString + stateRoot?: PrefixedHexString + transactionsTrie?: PrefixedHexString + receiptTrie?: PrefixedHexString + logsBloom?: PrefixedHexString + difficulty?: PrefixedHexString + number?: PrefixedHexString + gasLimit?: PrefixedHexString + gasUsed?: PrefixedHexString + timestamp?: PrefixedHexString + extraData?: PrefixedHexString + mixHash?: PrefixedHexString + nonce?: PrefixedHexString + baseFeePerGas?: PrefixedHexString + withdrawalsRoot?: PrefixedHexString + blobGasUsed?: PrefixedHexString + excessBlobGas?: PrefixedHexString + parentBeaconBlockRoot?: PrefixedHexString } /* * Based on https://ethereum.org/en/developers/docs/apis/json-rpc/ */ export interface JsonRpcBlock { - number: string // the block number. null when pending block. - hash: string // hash of the block. null when pending block. - parentHash: string // hash of the parent block. - mixHash?: string // bit hash which proves combined with the nonce that a sufficient amount of computation has been carried out on this block. - nonce: string // hash of the generated proof-of-work. null when pending block. - sha3Uncles: string // SHA3 of the uncles data in the block. - logsBloom: string // the bloom filter for the logs of the block. null when pending block. - transactionsRoot: string // the root of the transaction trie of the block. - stateRoot: string // the root of the final state trie of the block. - receiptsRoot: string // the root of the receipts trie of the block. - miner: string // the address of the beneficiary to whom the mining rewards were given. - difficulty: string // integer of the difficulty for this block. - totalDifficulty: string // integer of the total difficulty of the chain until this block. - extraData: string // the “extra data” field of this block. - size: string // integer the size of this block in bytes. - gasLimit: string // the maximum gas allowed in this block. - gasUsed: string // the total used gas by all transactions in this block. - timestamp: string // the unix timestamp for when the block was collated. - transactions: Array // Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter. - uncles: string[] // Array of uncle hashes - baseFeePerGas?: string // If EIP-1559 is enabled for this block, returns the base fee per gas + number: PrefixedHexString // the block number. null when pending block. + hash: PrefixedHexString // hash of the block. null when pending block. + parentHash: PrefixedHexString // hash of the parent block. + mixHash?: PrefixedHexString // bit hash which proves combined with the nonce that a sufficient amount of computation has been carried out on this block. + nonce: PrefixedHexString // hash of the generated proof-of-work. null when pending block. + sha3Uncles: PrefixedHexString // SHA3 of the uncles data in the block. + logsBloom: PrefixedHexString // the bloom filter for the logs of the block. null when pending block. + transactionsRoot: PrefixedHexString // the root of the transaction trie of the block. + stateRoot: PrefixedHexString // the root of the final state trie of the block. + receiptsRoot: PrefixedHexString // the root of the receipts trie of the block. + miner: PrefixedHexString // the address of the beneficiary to whom the mining rewards were given. + difficulty: PrefixedHexString // integer of the difficulty for this block. + totalDifficulty: PrefixedHexString // integer of the total difficulty of the chain until this block. + extraData: PrefixedHexString // the “extra data” field of this block. + size: PrefixedHexString // integer the size of this block in bytes. + gasLimit: PrefixedHexString // the maximum gas allowed in this block. + gasUsed: PrefixedHexString // the total used gas by all transactions in this block. + timestamp: PrefixedHexString // the unix timestamp for when the block was collated. + transactions: Array // Array of transaction objects, or 32 Bytes transaction hashes depending on the last given parameter. + uncles: PrefixedHexString[] // Array of uncle hashes + baseFeePerGas?: PrefixedHexString // If EIP-1559 is enabled for this block, returns the base fee per gas withdrawals?: Array // If EIP-4895 is enabled for this block, array of withdrawals - withdrawalsRoot?: string // If EIP-4895 is enabled for this block, the root of the withdrawal trie of the block. - blobGasUsed?: string // If EIP-4844 is enabled for this block, returns the blob gas used for the block - excessBlobGas?: string // If EIP-4844 is enabled for this block, returns the excess blob gas for the block - parentBeaconBlockRoot?: string // If EIP-4788 is enabled for this block, returns parent beacon block root + withdrawalsRoot?: PrefixedHexString // If EIP-4895 is enabled for this block, the root of the withdrawal trie of the block. + blobGasUsed?: PrefixedHexString // If EIP-4844 is enabled for this block, returns the blob gas used for the block + excessBlobGas?: PrefixedHexString // If EIP-4844 is enabled for this block, returns the excess blob gas for the block + parentBeaconBlockRoot?: PrefixedHexString // If EIP-4788 is enabled for this block, returns parent beacon block root executionWitness?: VerkleExecutionWitness | null // If Verkle is enabled for this block } @@ -280,5 +282,5 @@ export type ExecutionPayload = { excessBlobGas?: PrefixedHexString // QUANTITY, 64 Bits parentBeaconBlockRoot?: PrefixedHexString // QUANTITY, 64 Bits // VerkleExecutionWitness is already a hex serialized object - executionWitness?: VerkleExecutionWitness | null // QUANTITY, 64 Bits, null imples not available + executionWitness?: VerkleExecutionWitness | null // QUANTITY, 64 Bits, null implies not available } diff --git a/packages/block/test/block.spec.ts b/packages/block/test/block.spec.ts index e0a6371c7..58dae5468 100644 --- a/packages/block/test/block.spec.ts +++ b/packages/block/test/block.spec.ts @@ -20,8 +20,9 @@ import * as testDataPreLondon2 from './testdata/testdata_pre-london-2.json' import * as testDataPreLondon from './testdata/testdata_pre-london.json' import * as testnetMerge from './testdata/testnetMerge.json' -import type { BlockBytes } from '../src/index.js' -import type { NestedUint8Array } from '@ethereumjs/util' +import type { BlockBytes, JsonRpcBlock } from '../src/index.js' +import type { ChainConfig } from '@ethereumjs/common' +import type { NestedUint8Array, PrefixedHexString } from '@ethereumjs/util' describe('[Block]: block functions', () => { it('should test block initialization', () => { @@ -51,7 +52,7 @@ describe('[Block]: block functions', () => { ) const zero = new Uint8Array(0) - const headerArray = [] + const headerArray: Uint8Array[] = [] for (let item = 0; item < 15; item++) { headerArray.push(zero) } @@ -82,7 +83,7 @@ describe('[Block]: block functions', () => { const common = new Common({ chain: 'testnetMerge', hardfork: Hardfork.Istanbul, - customChains, + customChains: customChains as ChainConfig[], }) let block = Block.fromBlockData( @@ -153,7 +154,7 @@ describe('[Block]: block functions', () => { it('should test block validation on pow chain', async () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) - const blockRlp = toBytes(testDataPreLondon.blocks[0].rlp) + const blockRlp = toBytes(testDataPreLondon.blocks[0].rlp as PrefixedHexString) try { Block.fromRLPSerializedBlock(blockRlp, { common }) assert.ok(true, 'should pass') @@ -166,7 +167,7 @@ describe('[Block]: block functions', () => { const common = new Common({ chain: Chain.Goerli, hardfork: Hardfork.Chainstart }) try { - blockFromRpc(testDataFromRpcGoerli, [], { common }) + blockFromRpc(testDataFromRpcGoerli as JsonRpcBlock, [], { common }) assert.ok(true, 'does not throw') } catch (error: any) { assert.fail('error thrown') @@ -179,7 +180,7 @@ describe('[Block]: block functions', () => { } it('should test transaction validation - invalid tx trie', async () => { - const blockRlp = toBytes(testDataPreLondon.blocks[0].rlp) + const blockRlp = toBytes(testDataPreLondon.blocks[0].rlp as PrefixedHexString) const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }) const block = Block.fromRLPSerializedBlock(blockRlp, { common, freeze: false }) await testTransactionValidation(block) @@ -220,7 +221,7 @@ describe('[Block]: block functions', () => { it('should test transaction validation with legacy tx in london', async () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }) - const blockRlp = toBytes(testDataPreLondon.blocks[0].rlp) + const blockRlp = toBytes(testDataPreLondon.blocks[0].rlp as PrefixedHexString) const block = Block.fromRLPSerializedBlock(blockRlp, { common, freeze: false }) await testTransactionValidation(block) ;(block.transactions[0] as any).gasPrice = BigInt(0) @@ -233,7 +234,7 @@ describe('[Block]: block functions', () => { it('should test uncles hash validation', async () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) - const blockRlp = toBytes(testDataPreLondon2.blocks[2].rlp) + const blockRlp = toBytes(testDataPreLondon2.blocks[2].rlp as PrefixedHexString) const block = Block.fromRLPSerializedBlock(blockRlp, { common, freeze: false }) assert.equal(block.uncleHashIsValid(), true) ;(block.header as any).uncleHash = new Uint8Array(32) @@ -322,16 +323,16 @@ describe('[Block]: block functions', () => { it('should test genesis hashes (mainnet default)', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Chainstart }) - const rlp = hexToBytes('0x' + testDataGenesis.test.genesis_rlp_hex) - const hash = hexToBytes('0x' + testDataGenesis.test.genesis_hash) + const rlp = hexToBytes(`0x${testDataGenesis.test.genesis_rlp_hex}`) + const hash = hexToBytes(`0x${testDataGenesis.test.genesis_hash}`) const block = Block.fromRLPSerializedBlock(rlp, { common }) assert.ok(equalsBytes(block.hash(), hash), 'genesis hash match') }) it('should test hash() method (mainnet default)', () => { let common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Chainstart }) - const rlp = hexToBytes('0x' + testDataGenesis.test.genesis_rlp_hex) - const hash = hexToBytes('0x' + testDataGenesis.test.genesis_hash) + const rlp = hexToBytes(`0x${testDataGenesis.test.genesis_rlp_hex}`) + const hash = hexToBytes(`0x${testDataGenesis.test.genesis_hash}`) let block = Block.fromRLPSerializedBlock(rlp, { common }) assert.ok(equalsBytes(block.hash(), hash), 'genesis hash match') @@ -369,23 +370,31 @@ describe('[Block]: block functions', () => { it('should return the same block data from raw()', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) - const block = Block.fromRLPSerializedBlock(toBytes(testDataPreLondon2.blocks[2].rlp), { - common, - }) + const block = Block.fromRLPSerializedBlock( + toBytes(testDataPreLondon2.blocks[2].rlp as PrefixedHexString), + { + common, + } + ) const blockFromRaw = Block.fromValuesArray(block.raw(), { common }) assert.ok(equalsBytes(block.hash(), blockFromRaw.hash())) }) it('should test toJSON', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) - const block = Block.fromRLPSerializedBlock(toBytes(testDataPreLondon2.blocks[2].rlp), { - common, - }) + const block = Block.fromRLPSerializedBlock( + toBytes(testDataPreLondon2.blocks[2].rlp as PrefixedHexString), + { + common, + } + ) assert.equal(typeof block.toJSON(), 'object') }) it('DAO hardfork', () => { - const blockData = RLP.decode(testDataPreLondon2.blocks[0].rlp) as NestedUint8Array + const blockData = RLP.decode( + testDataPreLondon2.blocks[0].rlp as PrefixedHexString + ) as NestedUint8Array // Set block number from test block to mainnet DAO fork block 1920000 blockData[0][8] = hexToBytes('0x1D4C00') diff --git a/packages/block/test/eip4844block.spec.ts b/packages/block/test/eip4844block.spec.ts index 74f87a20a..dc2ff91ec 100644 --- a/packages/block/test/eip4844block.spec.ts +++ b/packages/block/test/eip4844block.spec.ts @@ -4,10 +4,9 @@ import { blobsToCommitments, commitmentsToVersionedHashes, getBlobs, - initKZG, randomBytes, } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, beforeAll, describe, it } from 'vitest' import { BlockHeader } from '../src/header.js' @@ -17,13 +16,14 @@ import { Block } from '../src/index.js' import gethGenesis from './testdata/4844-hardfork.json' import type { TypedTransaction } from '@ethereumjs/tx' +import type { Kzg } from '@ethereumjs/util' describe('EIP4844 header tests', () => { let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() + common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -101,8 +101,7 @@ describe('blob gas tests', () => { let common: Common let blobGasPerBlob: bigint beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -155,11 +154,11 @@ describe('blob gas tests', () => { }) describe('transaction validation tests', () => { + let kzg: Kzg let common: Common let blobGasPerBlob: bigint beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -169,7 +168,7 @@ describe('transaction validation tests', () => { }) it('should work', () => { const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const blobVersionedHashes = commitmentsToVersionedHashes(commitments) const tx1 = BlobEIP4844Transaction.fromTxData( diff --git a/packages/block/test/eip4895block.spec.ts b/packages/block/test/eip4895block.spec.ts index 3c6748fb6..6c2bae317 100644 --- a/packages/block/test/eip4895block.spec.ts +++ b/packages/block/test/eip4895block.spec.ts @@ -1,6 +1,13 @@ import { Chain, Common, Hardfork } from '@ethereumjs/common' import { RLP } from '@ethereumjs/rlp' -import { Address, KECCAK256_RLP, Withdrawal, hexToBytes, zeros } from '@ethereumjs/util' +import { + Address, + KECCAK256_RLP, + Withdrawal, + hexToBytes, + randomBytes, + zeros, +} from '@ethereumjs/util' import { assert, describe, it } from 'vitest' import { Block } from '../src/block.js' @@ -224,4 +231,14 @@ describe('EIP4895 tests', () => { 'should provide withdrawals array when 4895 is active' ) }) + + it('should return early when withdrawals root equals KECCAK256_RLP', async () => { + const block = Block.fromBlockData({}, { common }) + // Set invalid withdrawalsRoot in cache + block['cache'].withdrawalsTrieRoot = randomBytes(32) + assert.ok( + await block.withdrawalsTrieIsValid(), + 'correctly executed code path where withdrawals length is 0' + ) + }) }) diff --git a/packages/block/test/from-beacon-payload.spec.ts b/packages/block/test/from-beacon-payload.spec.ts index c4d75009a..06f275657 100644 --- a/packages/block/test/from-beacon-payload.spec.ts +++ b/packages/block/test/from-beacon-payload.spec.ts @@ -1,6 +1,5 @@ import { Common, Hardfork } from '@ethereumjs/common' -import { initKZG } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, beforeAll, describe, it } from 'vitest' import * as shardingJson from '../../client/test/sim/configs/4844-devnet.json' @@ -12,11 +11,10 @@ import * as payload87475 from './testdata/payload-slot-87475.json' import * as testnetVerkleKaustinen from './testdata/testnetVerkleKaustinen.json' describe('[fromExecutionPayloadJson]: 4844 devnet 5', () => { - let kzg let common: Common beforeAll(async () => { - kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() + const commonJson = { ...shardingJson } commonJson.config = { ...commonJson.config, chainId: 4844001005 } const network = 'sharding' @@ -77,11 +75,6 @@ describe('[fromExecutionPayloadJson]: 4844 devnet 5', () => { }) describe('[fromExecutionPayloadJson]: kaustinen', () => { - let kzg - beforeAll(async () => { - kzg = await createKZG() - initKZG(kzg) - }) const network = 'kaustinen' // safely change chainId without modifying undelying json diff --git a/packages/blockchain/CHANGELOG.md b/packages/blockchain/CHANGELOG.md index f13897414..c5c5d8448 100644 --- a/packages/blockchain/CHANGELOG.md +++ b/packages/blockchain/CHANGELOG.md @@ -6,6 +6,47 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 7.2.0 - 2024-03-05 + +### Full 4844 Browser Readiness + +#### WASM KZG + +Shortly following the "Dencun Hardfork Support" release round from last month, this is now the first round of releases where the EthereumJS libraries are now fully browser compatible regarding the new 4844 functionality, see PRs [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) and [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296)! 🎉 + +Our WASM wizard @acolytec3 has spent the last two weeks and created a WASM build of the [c-kzg](https://github.com/benjaminion/c-kzg) library which we have released under the `kzg-wasm` name on npm (and you can also use independently for other projects). See the newly created [GitHub repository](https://github.com/ethereumjs/kzg-wasm) for some library-specific documentation. + +This WASM KZG library can now be used for KZG initialization (replacing the old recommended `c-kzg` initialization), see the respective [README section](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/README.md#kzg-initialization) from the tx library for usage instructions (which is also accurate for the other using upstream libraries like block or EVM). + +Note that `kzg-wasm` needs to be added manually to your own dependencies and the KZG initialization code needs to be adopted like the following (which you will likely want to do in most cases, so if you deal with post Dencun EVM bytecode and/or 4844 blob txs in any way): + +```typescript +import { loadKZG } from 'kzg-wasm' +import { Chain, Common, Hardfork } from '@ethereumjs/common' + +const kzg = await loadKZG() + +// Instantiate `common` +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, +}) +``` + +Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. + +Note that passing in the KZG setup file is not necessary anymore, since this is now defaulting to the setup file from the official [KZG ceremony](https://ceremony.ethereum.org/) (which is now bundled with the KZG library). + +#### Trie Node.js Import Bug + +Since this fits well also to be placed here relatively prominently for awareness: we had a relatively nasty bug in the `@ethereumjs/trie` library with a `Node.js` web stream import also affecting browser compatibility, see PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). This bug has been fixed along with these releases and this library now references the updated trie library version. + +### Other Changes + +- Remove internal `_init()` method along EVM/VM constructor refactoring, PRs [#3304](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3304/) and [#3315](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3315) +- Fix a type error related to the `lru-cache` dependency, PR [#3285](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3285) + ## 7.1.0 - 2024-02-08 ### Dencun Hardfork Support diff --git a/packages/blockchain/README.md b/packages/blockchain/README.md index d269a0a68..8fbd1a09d 100644 --- a/packages/blockchain/README.md +++ b/packages/blockchain/README.md @@ -178,6 +178,8 @@ This library supports the blob transaction type introduced with [EIP-4844](https The blockchain library now allows for blob transactions to be validated and included in a chain where EIP-4844 activated either by hardfork or standalone EIP. +**Note:** Working with blob transactions needs a manual KZG library installation and global initialization, see [KZG Setup](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/tx/README.md#kzg-setup) for instructions. + ## Browser With the breaking release round in Summer 2023 we have added hybrid ESM/CJS builds for all our libraries (see section below) and have eliminated many of the caveats which had previously prevented a frictionless browser usage. diff --git a/packages/blockchain/docs/classes/Blockchain.md b/packages/blockchain/docs/classes/Blockchain.md index 3b7dc7216..e82b9b710 100644 --- a/packages/blockchain/docs/classes/Blockchain.md +++ b/packages/blockchain/docs/classes/Blockchain.md @@ -59,7 +59,7 @@ This class stores and interacts with blocks. #### Defined in -[blockchain.ts:112](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L112) +[blockchain.ts:110](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L110) ___ @@ -73,7 +73,7 @@ ___ #### Defined in -[blockchain.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L83) +[blockchain.ts:82](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L82) ___ @@ -83,7 +83,7 @@ ___ #### Defined in -[blockchain.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L84) +[blockchain.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L83) ___ @@ -93,7 +93,7 @@ ___ #### Defined in -[blockchain.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L85) +[blockchain.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L84) ___ @@ -109,7 +109,7 @@ Optional events emitter #### Defined in -[blockchain.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L86) +[blockchain.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L85) ## Accessors @@ -125,7 +125,7 @@ The genesis Block for the blockchain. #### Defined in -[blockchain.ts:1412](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1412) +[blockchain.ts:1404](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1404) ## Methods @@ -147,7 +147,7 @@ The genesis Block for the blockchain. #### Defined in -[blockchain.ts:1349](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1349) +[blockchain.ts:1341](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1341) ___ @@ -169,7 +169,7 @@ Creates a genesis Block for the blockchain with params from Common.genesis #### Defined in -[blockchain.ts:1421](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1421) +[blockchain.ts:1413](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1413) ___ @@ -202,7 +202,7 @@ we can be sure it is correct). #### Defined in -[blockchain.ts:931](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L931) +[blockchain.ts:923](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L923) ___ @@ -229,7 +229,7 @@ block will be the canonical block at that number in the chain #### Defined in -[blockchain.ts:799](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L799) +[blockchain.ts:791](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L791) ___ @@ -255,7 +255,7 @@ Looks up many blocks relative to blockId Note: due to `GetBlockHeaders #### Defined in -[blockchain.ts:848](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L848) +[blockchain.ts:840](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L840) ___ @@ -275,7 +275,7 @@ Returns the latest full block in the canonical chain. #### Defined in -[blockchain.ts:396](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L396) +[blockchain.ts:386](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L386) ___ @@ -291,7 +291,7 @@ Returns the latest header in the canonical chain. #### Defined in -[blockchain.ts:385](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L385) +[blockchain.ts:375](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L375) ___ @@ -313,7 +313,7 @@ Gets a header by number. Header must be in the canonical chain #### Defined in -[blockchain.ts:1390](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1390) +[blockchain.ts:1382](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1382) ___ @@ -344,7 +344,7 @@ has not been run. This matches the behavior of [iterator](Blockchain.md#iterator #### Defined in -[blockchain.ts:355](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L355) +[blockchain.ts:345](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L345) ___ @@ -366,7 +366,7 @@ This method differs from `getIteratorHead`. If the head is not found, it returns #### Defined in -[blockchain.ts:366](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L366) +[blockchain.ts:356](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L356) ___ @@ -388,7 +388,7 @@ Gets total difficulty for a header's parent, helpful for determining terminal bl #### Defined in -[blockchain.ts:834](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L834) +[blockchain.ts:826](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L826) ___ @@ -415,7 +415,7 @@ Gets total difficulty for a block specified by hash and number #### Defined in -[blockchain.ts:820](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L820) +[blockchain.ts:812](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L812) ___ @@ -448,7 +448,7 @@ number of blocks actually iterated #### Defined in -[blockchain.ts:1037](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1037) +[blockchain.ts:1029](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1029) ___ @@ -478,7 +478,7 @@ heads/hashes are overwritten. #### Defined in -[blockchain.ts:426](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L426) +[blockchain.ts:416](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L416) ___ @@ -505,7 +505,7 @@ chain is rebuilt and any stale heads/hashes are overwritten. #### Defined in -[blockchain.ts:412](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L412) +[blockchain.ts:402](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L402) ___ @@ -531,7 +531,7 @@ heads/hashes are overwritten. #### Defined in -[blockchain.ts:453](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L453) +[blockchain.ts:443](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L443) ___ @@ -558,7 +558,7 @@ chain is rebuilt and any stale heads/hashes are overwritten. #### Defined in -[blockchain.ts:439](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L439) +[blockchain.ts:429](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L429) ___ @@ -583,7 +583,7 @@ canonicalHead and cleans up canonical references greater than canonicalHead #### Defined in -[blockchain.ts:465](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L465) +[blockchain.ts:455](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L455) ___ @@ -607,7 +607,7 @@ any other error, this function throws. #### Defined in -[blockchain.ts:1404](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1404) +[blockchain.ts:1396](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1396) ___ @@ -631,7 +631,7 @@ Therefore, the array needs to be ordered upon number. #### Defined in -[blockchain.ts:890](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L890) +[blockchain.ts:882](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L882) ___ @@ -659,7 +659,7 @@ When calling the iterator, the iterator will start running the first child block #### Defined in -[blockchain.ts:1120](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1120) +[blockchain.ts:1112](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L1112) ___ @@ -687,7 +687,7 @@ the original. #### Defined in -[blockchain.ts:243](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L243) +[blockchain.ts:309](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L309) ___ @@ -710,7 +710,7 @@ whether the block is internally consistent #### Defined in -[blockchain.ts:702](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L702) +[blockchain.ts:694](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L694) ___ @@ -748,7 +748,7 @@ It verifies the current block against the `parentHash`: #### Defined in -[blockchain.ts:635](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L635) +[blockchain.ts:627](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L627) ___ @@ -771,7 +771,7 @@ encouraged method to use when creating a blockchain object. #### Defined in -[blockchain.ts:131](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L131) +[blockchain.ts:129](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L129) ___ @@ -795,4 +795,4 @@ objects must be readable by Block.fromBlockData #### Defined in -[blockchain.ts:145](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L145) +[blockchain.ts:211](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/blockchain/src/blockchain.ts#L211) diff --git a/packages/blockchain/package.json b/packages/blockchain/package.json index d2fbf3d39..c4014ba63 100644 --- a/packages/blockchain/package.json +++ b/packages/blockchain/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/blockchain", - "version": "7.1.0", + "version": "7.2.0", "description": "A module to store and interact with blocks", "keywords": [ "ethereum", @@ -41,18 +41,18 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --browser.name=webkit --browser.provider=playwright --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/block": "^5.1.1", - "@ethereumjs/common": "^4.2.0", - "@ethereumjs/ethash": "^3.0.2", + "@ethereumjs/block": "^5.2.0", + "@ethereumjs/common": "^4.3.0", + "@ethereumjs/ethash": "^3.0.3", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/trie": "^6.1.1", - "@ethereumjs/tx": "^5.2.1", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/trie": "^6.2.0", + "@ethereumjs/tx": "^5.3.0", + "@ethereumjs/util": "^9.0.3", "debug": "^4.3.3", "ethereum-cryptography": "^2.1.3", "lru-cache": "10.1.0" diff --git a/packages/blockchain/src/blockchain.ts b/packages/blockchain/src/blockchain.ts index 63da9ec57..acf4c64d7 100644 --- a/packages/blockchain/src/blockchain.ts +++ b/packages/blockchain/src/blockchain.ts @@ -38,10 +38,9 @@ import type { BlockchainInterface, BlockchainOptions, Consensus, - GenesisOptions, OnBlock, } from './types.js' -import type { BlockData } from '@ethereumjs/block' +import type { BlockData, HeaderData } from '@ethereumjs/block' import type { CliqueConfig } from '@ethereumjs/common' import type { BigIntLike, DB, DBObject, GenesisState } from '@ethereumjs/util' @@ -106,7 +105,6 @@ export class Blockchain implements BlockchainInterface { */ private _heads: { [key: string]: Uint8Array } - protected _isInitialized = false private _lock: Lock public readonly common: Common @@ -131,7 +129,75 @@ export class Blockchain implements BlockchainInterface { public static async create(opts: BlockchainOptions = {}) { const blockchain = new Blockchain(opts) - await blockchain._init(opts) + await blockchain.consensus.setup({ blockchain }) + + let stateRoot = opts.genesisBlock?.header.stateRoot ?? opts.genesisStateRoot + if (stateRoot === undefined) { + if (blockchain._customGenesisState !== undefined) { + stateRoot = await genGenesisStateRoot(blockchain._customGenesisState, blockchain.common) + } else { + stateRoot = await getGenesisStateRoot( + Number(blockchain.common.chainId()) as Chain, + blockchain.common + ) + } + } + + const genesisBlock = opts.genesisBlock ?? blockchain.createGenesisBlock(stateRoot) + + let genesisHash = await blockchain.dbManager.numberToHash(BIGINT_0) + + const dbGenesisBlock = + genesisHash !== undefined ? await blockchain.dbManager.getBlock(genesisHash) : undefined + + // If the DB has a genesis block, then verify that the genesis block in the + // DB is indeed the Genesis block generated or assigned. + if (dbGenesisBlock !== undefined && !equalsBytes(genesisBlock.hash(), dbGenesisBlock.hash())) { + throw new Error( + 'The genesis block in the DB has a different hash than the provided genesis block.' + ) + } + + genesisHash = genesisBlock.hash() + + if (!dbGenesisBlock) { + // If there is no genesis block put the genesis block in the DB. + // For that TD, the BlockOrHeader, and the Lookups have to be saved. + const dbOps: DBOp[] = [] + dbOps.push(DBSetTD(genesisBlock.header.difficulty, BIGINT_0, genesisHash)) + DBSetBlockOrHeader(genesisBlock).map((op) => dbOps.push(op)) + DBSaveLookups(genesisHash, BIGINT_0).map((op) => dbOps.push(op)) + await blockchain.dbManager.batch(dbOps) + await blockchain.consensus.genesisInit(genesisBlock) + } + + // At this point, we can safely set the genesis: + // it is either the one we put in the DB, or it is equal to the one + // which we read from the DB. + blockchain._genesisBlock = genesisBlock + + // load verified iterator heads + const heads = await blockchain.dbManager.getHeads() + blockchain._heads = heads !== undefined ? heads : {} + + // load headerchain head + let hash = await blockchain.dbManager.getHeadHeader() + blockchain._headHeaderHash = hash !== undefined ? hash : genesisHash + + // load blockchain head + hash = await blockchain.dbManager.getHeadBlock() + blockchain._headBlockHash = hash !== undefined ? hash : genesisHash + + if (blockchain._hardforkByHeadBlockNumber) { + const latestHeader = await blockchain._getHeader(blockchain._headHeaderHash) + const td = await blockchain.getParentTD(latestHeader) + await blockchain.checkAndTransitionHardForkByNumber( + latestHeader.number, + td, + latestHeader.timestamp + ) + } + return blockchain } @@ -249,82 +315,6 @@ export class Blockchain implements BlockchainInterface { return copiedBlockchain } - /** - * This method is called in {@link Blockchain.create} and either sets up the DB or reads - * values from the DB and makes these available to the consumers of - * Blockchain. - * - * @param opts An options object to provide genesisBlock or ways to contruct it - * - * @hidden - */ - private async _init(opts: GenesisOptions = {}): Promise { - await this.consensus.setup({ blockchain: this }) - if (this._isInitialized) return - - let stateRoot = opts.genesisBlock?.header.stateRoot ?? opts.genesisStateRoot - if (stateRoot === undefined) { - if (this._customGenesisState !== undefined) { - stateRoot = await genGenesisStateRoot(this._customGenesisState, this.common) - } else { - stateRoot = await getGenesisStateRoot(Number(this.common.chainId()) as Chain, this.common) - } - } - - const genesisBlock = opts.genesisBlock ?? this.createGenesisBlock(stateRoot) - - let genesisHash = await this.dbManager.numberToHash(BIGINT_0) - - const dbGenesisBlock = - genesisHash !== undefined ? await this.dbManager.getBlock(genesisHash) : undefined - - // If the DB has a genesis block, then verify that the genesis block in the - // DB is indeed the Genesis block generated or assigned. - if (dbGenesisBlock !== undefined && !equalsBytes(genesisBlock.hash(), dbGenesisBlock.hash())) { - throw new Error( - 'The genesis block in the DB has a different hash than the provided genesis block.' - ) - } - - genesisHash = genesisBlock.hash() - - if (!dbGenesisBlock) { - // If there is no genesis block put the genesis block in the DB. - // For that TD, the BlockOrHeader, and the Lookups have to be saved. - const dbOps: DBOp[] = [] - dbOps.push(DBSetTD(genesisBlock.header.difficulty, BIGINT_0, genesisHash)) - DBSetBlockOrHeader(genesisBlock).map((op) => dbOps.push(op)) - DBSaveLookups(genesisHash, BIGINT_0).map((op) => dbOps.push(op)) - await this.dbManager.batch(dbOps) - await this.consensus.genesisInit(genesisBlock) - } - - // At this point, we can safely set the genesis: - // it is either the one we put in the DB, or it is equal to the one - // which we read from the DB. - this._genesisBlock = genesisBlock - - // load verified iterator heads - const heads = await this.dbManager.getHeads() - this._heads = heads !== undefined ? heads : {} - - // load headerchain head - let hash = await this.dbManager.getHeadHeader() - this._headHeaderHash = hash !== undefined ? hash : genesisHash - - // load blockchain head - hash = await this.dbManager.getHeadBlock() - this._headBlockHash = hash !== undefined ? hash : genesisHash - - if (this._hardforkByHeadBlockNumber) { - const latestHeader = await this._getHeader(this._headHeaderHash) - const td = await this.getParentTD(latestHeader) - await this.checkAndTransitionHardForkByNumber(latestHeader.number, td, latestHeader.timestamp) - } - - this._isInitialized = true - } - /** * Run a function after acquiring a lock. It is implied that we have already * initialized the module (or we are calling this from the init function, like @@ -1428,7 +1418,7 @@ export class Blockchain implements BlockchainInterface { timestamp: common.genesis().timestamp, }) - const header: BlockData['header'] = { + const header: HeaderData = { ...common.genesis(), number: 0, stateRoot, diff --git a/packages/blockchain/test/customConsensus.spec.ts b/packages/blockchain/test/customConsensus.spec.ts index 5f7fb45b9..27f1a760d 100644 --- a/packages/blockchain/test/customConsensus.spec.ts +++ b/packages/blockchain/test/customConsensus.spec.ts @@ -143,7 +143,7 @@ describe('consensus transition checks', () => { const blockchain = await Blockchain.create({ common, consensus }) try { - await (blockchain as any).checkAndTransitionHardForkByNumber(5n) + await blockchain.checkAndTransitionHardForkByNumber(5n) assert.ok('checkAndTransitionHardForkByNumber does not throw with custom consensus') } catch (err: any) { assert.fail( @@ -151,11 +151,11 @@ describe('consensus transition checks', () => { ) } - ;(blockchain as any).consensus = new EthashConsensus() - ;(blockchain.common as any).consensusAlgorithm = () => 'fibonacci' + blockchain.consensus = new EthashConsensus() + blockchain.common.consensusAlgorithm = () => 'fibonacci' try { - await (blockchain as any).checkAndTransitionHardForkByNumber(5n) + await blockchain.checkAndTransitionHardForkByNumber(5n) assert.fail( 'checkAndTransitionHardForkByNumber should throw when using standard consensus (ethash, clique, casper) but consensus algorithm defined in common is different' ) diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index 6b4d7fc5c..4af920442 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -6,6 +6,23 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.10.1 - 2024-03-05 + +This is mainly a maintenance release coming with a few internal changes and minor bug fixes, single user-focused addition is the support for the `eth_feeHistory` RPC call. + +### Support for eth_feeHistory RPC Method + +Support for the `eth_feeHistory` RPC endpoint has been added in PR [#3295](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3295). The endpoint allows to query the base fee and the priority fee per gas for a requested/supported block range. + +### Internal Changes and Improvements + +- The underlying EthereumJS libraries now use `kzg-wasm` instead of the `c-kzg` Node.js bindings for 4844 functionality, PR [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) +- Ensure executed block does not get pruned if head=final FCU, PR [#3153](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3153) +- Improved SNAP sync behavior in certain scenarios (SNAP feature still experimental), PR [#3200](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3200) +- Refactor internal Engine API code structure, PR [#3291](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3291) +- Remove `devnet6.txt` trusted setup file and all test usages in downstream libraries, PR [#3288](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3288) +- Snap sync (experimental): use zero-element proof for checking validity of final, empty range result, PR [#3047](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3047) + ## 0.10.0 - 2024-02-08 This client release now comes with official Dencun hardfork support 🎉 and by default uses WASM for crypto primitives for faster block execution times. diff --git a/packages/client/README.md b/packages/client/README.md index 708f14393..5eb589fe0 100644 --- a/packages/client/README.md +++ b/packages/client/README.md @@ -305,6 +305,21 @@ dist/bin/cli.js --d --dnsNetworks -- EIP-1459 ENR tree urls to query for peer discovery targets ``` +## Metrics + +The client can optionally collect metrics using the Prometheus metrics platform and expose them via an HTTP endpoint with the following CLI flags. +The current metrics that are reported by the client can be found [here](./src/util//metrics.ts). + +```sh +# npm installation +ethereumjs --prometheus + +# source installation +npm run client:start:ts -- --prometheus --prometheusPort=9123 +``` + +Note: The Prometheus endpoint runs on port 8000 by default + ## API [API Reference](./docs/README.md) diff --git a/packages/client/bin/cli.ts b/packages/client/bin/cli.ts index 4c5747318..820b083e8 100755 --- a/packages/client/bin/cli.ts +++ b/packages/client/bin/cli.ts @@ -13,12 +13,10 @@ import { ecrecover, ecsign, hexToBytes, - initKZG, parseGethGenesisState, randomBytes, setLengthLeft, short, - toBytes, } from '@ethereumjs/util' import { keccak256 as keccak256WASM, @@ -33,11 +31,15 @@ import { ecdsaRecover, ecdsaSign } from 'ethereum-cryptography/secp256k1-compat' import { sha256 } from 'ethereum-cryptography/sha256' import { existsSync, writeFileSync } from 'fs' import { ensureDirSync, readFileSync, removeSync } from 'fs-extra' -import { createKZG } from 'kzg-wasm' +import * as http from 'http' +import { Server as RPCServer } from 'jayson/promise' +import { loadKZG } from 'kzg-wasm' import { Level } from 'level' import { homedir } from 'os' import * as path from 'path' -import readline from 'readline' +import * as promClient from 'prom-client' +import * as readline from 'readline' +import * as url from 'url' import * as yargs from 'yargs' import { hideBin } from 'yargs/helpers' @@ -47,6 +49,7 @@ import { LevelDB } from '../src/execution/level' import { getLogger } from '../src/logging' import { Event } from '../src/types' import { parseMultiaddrs } from '../src/util' +import { setupMetrics } from '../src/util/metrics' import { helprpc, startRPCServers } from './startRpc' @@ -56,7 +59,7 @@ import type { ClientOpts } from '../src/types' import type { RPCArgs } from './startRpc' import type { BlockBytes } from '@ethereumjs/block' import type { CustomCrypto } from '@ethereumjs/common' -import type { GenesisState } from '@ethereumjs/util' +import type { GenesisState, PrefixedHexString } from '@ethereumjs/util' import type { AbstractLevel } from 'abstract-level' type Account = [address: Address, privateKey: Uint8Array] @@ -229,6 +232,16 @@ const args: ClientOpts = yargs number: true, default: 5, }) + .option('prometheus', { + describe: 'Enable the Prometheus metrics server with HTTP endpoint', + boolean: true, + default: false, + }) + .option('prometheusPort', { + describe: 'Enable the Prometheus metrics server with HTTP endpoint', + number: true, + default: 8000, + }) .option('rpcDebug', { describe: 'Additionally log truncated RPC calls filtered by name (prefix), e.g.: "eth,engine_getPayload" (use "all" for all methods). Truncated by default, add verbosity using "rpcDebugVerbose"', @@ -382,6 +395,16 @@ const args: ClientOpts = yargs 'Block number to start syncing from. Must be lower than the local chain tip. Note: this is destructive and removes blocks from the blockchain, please back up your datadir before using.', number: true, }) + .option('startExecutionFrom', { + describe: + 'Block number to start/restart execution from. For merkle based state, parent state should be present in the the db while in verkle stateless mode the chain should be synced till the block and witnesses available this block onwards', + number: true, + }) + .option('startExecution', { + describe: + 'Start execution of unexecuted blocks without waiting for the CL fcU, set to `true` if `startExecutionFrom` provided', + boolean: true, + }) .option('isSingleNode', { describe: 'To run client in single node configuration without need to discover the sync height from peer. Particularly useful in test configurations. This flag is automically activated in the "dev" mode', @@ -421,6 +444,15 @@ const args: ClientOpts = yargs 'Skip executing blocks in new payload calls in engine, alias for --engineNewpayloadMaxExecute=0 and overrides any engineNewpayloadMaxExecute if also provided', boolean: true, }) + .option('ignoreStatelessInvalidExecs', { + describe: + 'Ignore stateless execution failures and keep moving the vm execution along using execution witnesses available in block (verkle). Sets/overrides --statelessVerkle=true and --engineNewpayloadMaxExecute=0 to prevent engine newPayload direct block execution where block execution faliures may stall the CL client. Useful for debugging the verkle. If provided a valid filename as arg, the invalid blocks will be stored there which one may use later for debugging', + coerce: (arg: string | boolean) => + typeof arg === 'string' && arg !== 'true' && arg !== 'false' + ? path.resolve(arg) + : arg === true || arg === 'true', + hidden: true, + }) .option('useJsCrypto', { describe: 'Use pure Javascript cryptography functions', boolean: true, @@ -526,6 +558,52 @@ async function startBlock(client: EthereumClient) { } } +async function startExecutionFrom(client: EthereumClient) { + if (args.startExecutionFrom === undefined) return + const startExecutionFrom = BigInt(args.startExecutionFrom) + + const height = client.chain.headers.height + if (height < startExecutionFrom) { + logger.error(`Cannot start merkle chain higher than current height ${height}`) + process.exit() + } + + const startExecutionBlock = await client.chain.getBlock(startExecutionFrom) + const startExecutionParent = await client.chain.getBlock(startExecutionBlock.header.parentHash) + const startExecutionParentTd = await client.chain.getTd( + startExecutionParent.hash(), + startExecutionParent.header.number + ) + + const startExecutionHardfork = client.config.execCommon.getHardforkBy({ + blockNumber: startExecutionBlock.header.number, + td: startExecutionParentTd, + timestamp: startExecutionBlock.header.timestamp, + }) + + if ( + client.config.execCommon.hardforkGteHardfork(startExecutionHardfork, Hardfork.Prague) && + client.config.statelessVerkle + ) { + // for stateless verkle sync execution witnesses are available and hence we can blindly set the vmHead + // to startExecutionParent's hash + try { + await client.chain.blockchain.setIteratorHead('vm', startExecutionParent.hash()) + await client.chain.update(false) + logger.info( + `vmHead set to ${client.chain.headers.height} for starting stateless execution at hardfork=${startExecutionHardfork}` + ) + } catch (err: any) { + logger.error(`Error setting vmHead for starting stateless execution: ${err}`) + process.exit() + } + } else { + // we need parent state availability to set the vmHead to the parent + logger.error(`Stateful execution reset not implemented at hardfork=${startExecutionHardfork}`) + process.exit() + } +} + /** * Starts and returns the {@link EthereumClient} */ @@ -550,6 +628,8 @@ async function startClient( hardforkByHeadBlockNumber: true, validateConsensus, validateBlocks: true, + genesisState: genesisMeta.genesisState, + genesisStateRoot: genesisMeta.genesisStateRoot, }) config.chainCommon.setForkHashes(blockchain.genesisBlock.hash()) } @@ -600,6 +680,9 @@ async function startClient( if (typeof args.startBlock === 'number') { await startBlock(client) } + if (typeof args.startExecutionFrom === 'number') { + await startExecutionFrom(client) + } // update client's sync status and start txpool if synchronized client.config.updateSynchronizedState(client.chain.headers.latest) @@ -716,11 +799,11 @@ async function inputAccounts() { if (!isFile) { for (const addressString of addresses) { const address = Address.fromString(addressString) - const inputKey = await question( + const inputKey = (await question( `Please enter the 0x-prefixed private key to unlock ${address}:\n` - ) + )) as PrefixedHexString ;(rl as any).history = (rl as any).history.slice(1) - const privKey = toBytes(inputKey) + const privKey = hexToBytes(inputKey) const derivedAddress = Address.fromPrivateKey(privKey) if (address.equals(derivedAddress)) { accounts.push([address, privKey]) @@ -765,11 +848,17 @@ function generateAccount(): Account { * @param config Client config object * @param clientStartPromise promise that returns a client and server object */ -const stopClient = async (config: Config, clientStartPromise: any) => { +const stopClient = async ( + config: Config, + clientStartPromise: Promise<{ + client: EthereumClient + servers: (RPCServer | http.Server)[] + } | null> +) => { config.logger.info('Caught interrupt signal. Obtaining client handle for clean shutdown...') config.logger.info('(This might take a little longer if client not yet fully started)') let timeoutHandle - if (clientStartPromise.toString().includes('Promise') === true) + if (clientStartPromise?.toString().includes('Promise') === true) // Client hasn't finished starting up so setting timeout to terminate process if not already shutdown gracefully timeoutHandle = setTimeout(() => { config.logger.warn('Client has become unresponsive while starting up.') @@ -781,7 +870,7 @@ const stopClient = async (config: Config, clientStartPromise: any) => { config.logger.info('Shutting down the client and the servers...') const { client, servers } = clientHandle for (const s of servers) { - s.http().close() + s instanceof RPCServer ? (s as RPCServer).http().close() : (s as http.Server).close() } await client.stop() config.logger.info('Exiting.') @@ -806,8 +895,7 @@ async function run() { // Give network id precedence over network name const chain = args.networkId ?? args.network ?? Chain.Mainnet const cryptoFunctions: CustomCrypto = {} - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() // Initialize WASM crypto if JS crypto is not specified if (args.useJsCrypto === false) { @@ -907,8 +995,7 @@ async function run() { chain: chainName, mergeForkIdPostMerge: args.mergeForkIdPostMerge, }) - //@ts-ignore - common.customCrypto = cryptoFunctions + ;(common.customCrypto as any) = cryptoFunctions customGenesisState = parseGethGenesisState(genesisFile) } @@ -959,6 +1046,42 @@ async function run() { const multiaddrs = args.multiaddrs !== undefined ? parseMultiaddrs(args.multiaddrs) : undefined const mine = args.mine !== undefined ? args.mine : args.dev !== undefined const isSingleNode = args.isSingleNode !== undefined ? args.isSingleNode : args.dev !== undefined + + let prometheusMetrics = undefined + let metricsServer: http.Server | undefined + if (args.prometheus === true) { + // Create custom metrics + prometheusMetrics = setupMetrics() + + const register = new promClient.Registry() + register.setDefaultLabels({ + app: 'ethereumjs-client', + }) + promClient.collectDefaultMetrics({ register }) + for (const [_, metric] of Object.entries(prometheusMetrics)) { + register.registerMetric(metric) + } + + metricsServer = http.createServer(async (req, res) => { + if (req.url === undefined) { + res.statusCode = 400 + res.end('Bad Request: URL is missing') + return + } + const reqUrl = new url.URL(req.url, `http://${req.headers.host}`) + const route = reqUrl.pathname + + if (route === '/metrics') { + // Return all metrics in the Prometheus exposition format + res.setHeader('Content-Type', register.contentType) + res.end(await register.metrics()) + } + }) + // Start the HTTP server which exposes the metrics on http://localhost:${args.prometheusPort}/metrics + logger.info(`Starting Metrics Server on port ${args.prometheusPort}`) + metricsServer.listen(args.prometheusPort) + } + const config = new Config({ accounts, bootnodes, @@ -997,8 +1120,14 @@ async function run() { useStringValueTrieDB: args.useStringValueTrieDB, txLookupLimit: args.txLookupLimit, pruneEngineCache: args.pruneEngineCache, - statelessVerkle: args.statelessVerkle, - engineNewpayloadMaxExecute: args.skipEngineExec === true ? 0 : args.engineNewpayloadMaxExecute, + statelessVerkle: args.ignoreStatelessInvalidExecs !== false ? true : args.statelessVerkle, + startExecution: args.startExecutionFrom !== undefined ? true : args.startExecution, + engineNewpayloadMaxExecute: + args.ignoreStatelessInvalidExecs !== false || args.skipEngineExec === true + ? 0 + : args.engineNewpayloadMaxExecute, + ignoreStatelessInvalidExecs: args.ignoreStatelessInvalidExecs, + prometheusMetrics, }) config.events.setMaxListeners(50) config.events.on(Event.SERVER_LISTENING, (details) => { @@ -1024,7 +1153,7 @@ async function run() { genesisStateRoot: customGenesisStateRoot, }) .then((client) => { - const servers = + const servers: (RPCServer | http.Server)[] = args.rpc === true || args.rpcEngine === true || args.ws === true ? startRPCServers(client, args as RPCArgs) : [] @@ -1034,6 +1163,7 @@ async function run() { ) { config.logger.warn(`Engine RPC endpoint not activated on a post-Merge HF setup.`) } + if (metricsServer !== undefined) servers.push(metricsServer) config.superMsg('Client started successfully') return { client, servers } }) diff --git a/packages/client/devnets/4844-interop/tools/txGenerator.ts b/packages/client/devnets/4844-interop/tools/txGenerator.ts index 0eaa80cee..7587ff8ea 100644 --- a/packages/client/devnets/4844-interop/tools/txGenerator.ts +++ b/packages/client/devnets/4844-interop/tools/txGenerator.ts @@ -8,12 +8,11 @@ import { getBlobs, bytesToHex, hexToBytes, - initKZG, } from '@ethereumjs/util' import { randomBytes } from '@ethereumjs/util' import { Client } from 'jayson/promise' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' // CLI Args const clientPort = parseInt(process.argv[2]) // EL client port number @@ -28,8 +27,7 @@ async function getNonce(client: Client, account: string) { } async function run(data: any) { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const common = Common.fromGethGenesis(genesisJson, { chain: genesisJson.ChainName ?? 'devnet', @@ -40,7 +38,7 @@ async function run(data: any) { const client = Client.http({ port: clientPort }) const blobs = getBlobs(data) - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const hashes = commitmentsToVersionedHashes(commitments) const account = Address.fromPrivateKey(randomBytes(32)) diff --git a/packages/client/docs/README.md b/packages/client/docs/README.md index 57bc8d8e0..a130c1fdd 100644 --- a/packages/client/docs/README.md +++ b/packages/client/docs/README.md @@ -16,6 +16,3 @@ ### Interfaces - [ConfigOptions](interfaces/ConfigOptions.md) - -### Usage -- [Run as EL client](usage/RunAsElClient.md) diff --git a/packages/client/docs/classes/Config.md b/packages/client/docs/classes/Config.md index 486df0b92..c95f5605a 100644 --- a/packages/client/docs/classes/Config.md +++ b/packages/client/docs/classes/Config.md @@ -10,65 +10,106 @@ ### Properties +- [accountCache](Config.md#accountcache) - [accounts](Config.md#accounts) - [bootnodes](Config.md#bootnodes) - [chainCommon](Config.md#chaincommon) +- [codeCache](Config.md#codecache) - [datadir](Config.md#datadir) - [debugCode](Config.md#debugcode) -- [disableBeaconSync](Config.md#disablebeaconsync) -- [disableSnapSync](Config.md#disablesnapsync) - [discDns](Config.md#discdns) - [discV4](Config.md#discv4) - [dnsAddr](Config.md#dnsaddr) +- [enableSnapSync](Config.md#enablesnapsync) +- [engineNewpayloadMaxExecute](Config.md#enginenewpayloadmaxexecute) +- [engineNewpayloadMaxTxsExecute](Config.md#enginenewpayloadmaxtxsexecute) +- [engineParentLookupMaxDepth](Config.md#engineparentlookupmaxdepth) - [events](Config.md#events) - [execCommon](Config.md#execcommon) +- [execution](Config.md#execution) - [extIP](Config.md#extip) -- [forceSnapSync](Config.md#forcesnapsync) +- [isSingleNode](Config.md#issinglenode) - [key](Config.md#key) - [lastSyncDate](Config.md#lastsyncdate) +- [lastsyncronized](Config.md#lastsyncronized) - [lightserv](Config.md#lightserv) - [logger](Config.md#logger) +- [maxAccountRange](Config.md#maxaccountrange) - [maxFetcherJobs](Config.md#maxfetcherjobs) +- [maxFetcherRequests](Config.md#maxfetcherrequests) +- [maxInvalidBlocksErrorCache](Config.md#maxinvalidblockserrorcache) - [maxPeers](Config.md#maxpeers) - [maxPerRequest](Config.md#maxperrequest) +- [maxRangeBytes](Config.md#maxrangebytes) +- [maxStorageRange](Config.md#maxstoragerange) - [minPeers](Config.md#minpeers) - [mine](Config.md#mine) - [minerCoinbase](Config.md#minercoinbase) - [multiaddrs](Config.md#multiaddrs) +- [numBlocksPerIteration](Config.md#numblocksperiteration) - [port](Config.md#port) +- [prefixStorageTrieKeys](Config.md#prefixstoragetriekeys) +- [pruneEngineCache](Config.md#pruneenginecache) - [safeReorgDistance](Config.md#safereorgdistance) +- [savePreimages](Config.md#savepreimages) - [saveReceipts](Config.md#savereceipts) -- [servers](Config.md#servers) +- [server](Config.md#server) +- [shutdown](Config.md#shutdown) - [skeletonFillCanonicalBackStep](Config.md#skeletonfillcanonicalbackstep) - [skeletonSubchainMergeMinimum](Config.md#skeletonsubchainmergeminimum) +- [snapAvailabilityDepth](Config.md#snapavailabilitydepth) +- [snapTransitionSafeDepth](Config.md#snaptransitionsafedepth) +- [statelessVerkle](Config.md#statelessverkle) +- [storageCache](Config.md#storagecache) - [syncTargetHeight](Config.md#synctargetheight) +- [syncedStateRemovalPeriod](Config.md#syncedstateremovalperiod) - [synchronized](Config.md#synchronized) - [syncmode](Config.md#syncmode) -- [transports](Config.md#transports) +- [trieCache](Config.md#triecache) - [txLookupLimit](Config.md#txlookuplimit) +- [useStringValueTrieDB](Config.md#usestringvaluetriedb) - [vm](Config.md#vm) +- [vmProfilerOpts](Config.md#vmprofileropts) +- [ACCOUNT\_CACHE](Config.md#account_cache) - [CHAIN\_DEFAULT](Config.md#chain_default) +- [CODE\_CACHE](Config.md#code_cache) - [DATADIR\_DEFAULT](Config.md#datadir_default) - [DEBUGCODE\_DEFAULT](Config.md#debugcode_default) - [DNSADDR\_DEFAULT](Config.md#dnsaddr_default) +- [ENGINE\_NEWPAYLOAD\_MAX\_EXECUTE](Config.md#engine_newpayload_max_execute) +- [ENGINE\_NEWPAYLOAD\_MAX\_TXS\_EXECUTE](Config.md#engine_newpayload_max_txs_execute) +- [ENGINE\_PARENTLOOKUP\_MAX\_DEPTH](Config.md#engine_parentlookup_max_depth) +- [EXECUTION](Config.md#execution-1) - [LIGHTSERV\_DEFAULT](Config.md#lightserv_default) - [MAXFETCHERJOBS\_DEFAULT](Config.md#maxfetcherjobs_default) +- [MAXFETCHERREQUESTS\_DEFAULT](Config.md#maxfetcherrequests_default) - [MAXPEERS\_DEFAULT](Config.md#maxpeers_default) - [MAXPERREQUEST\_DEFAULT](Config.md#maxperrequest_default) +- [MAX\_ACCOUNT\_RANGE](Config.md#max_account_range) +- [MAX\_INVALID\_BLOCKS\_ERROR\_CACHE](Config.md#max_invalid_blocks_error_cache) +- [MAX\_RANGE\_BYTES](Config.md#max_range_bytes) +- [MAX\_STORAGE\_RANGE](Config.md#max_storage_range) - [MINPEERS\_DEFAULT](Config.md#minpeers_default) +- [NUM\_BLOCKS\_PER\_ITERATION](Config.md#num_blocks_per_iteration) - [PORT\_DEFAULT](Config.md#port_default) +- [PRUNE\_ENGINE\_CACHE](Config.md#prune_engine_cache) - [SAFE\_REORG\_DISTANCE](Config.md#safe_reorg_distance) - [SKELETON\_FILL\_CANONICAL\_BACKSTEP](Config.md#skeleton_fill_canonical_backstep) - [SKELETON\_SUBCHAIN\_MERGE\_MINIMUM](Config.md#skeleton_subchain_merge_minimum) +- [SNAP\_AVAILABILITY\_DEPTH](Config.md#snap_availability_depth) +- [SNAP\_TRANSITION\_SAFE\_DEPTH](Config.md#snap_transition_safe_depth) +- [STORAGE\_CACHE](Config.md#storage_cache) +- [SYNCED\_STATE\_REMOVAL\_PERIOD](Config.md#synced_state_removal_period) - [SYNCMODE\_DEFAULT](Config.md#syncmode_default) -- [TRANSPORTS\_DEFAULT](Config.md#transports_default) +- [TRIE\_CACHE](Config.md#trie_cache) ### Methods - [getDataDirectory](Config.md#getdatadirectory) - [getDnsDiscovery](Config.md#getdnsdiscovery) - [getNetworkDirectory](Config.md#getnetworkdirectory) -- [getV4Discovery](Config.md#getv4discovery) +- [superMsg](Config.md#supermsg) +- [updateSynchronizedState](Config.md#updatesynchronizedstate) - [getClientKey](Config.md#getclientkey) - [getConfigDB](Config.md#getconfigdb) @@ -86,17 +127,27 @@ #### Defined in -[config.ts:316](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L316) +[config.ts:460](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L460) ## Properties +### accountCache + +â€ĸ `Readonly` **accountCache**: `number` + +#### Defined in + +[config.ts:410](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L410) + +___ + ### accounts -â€ĸ `Readonly` **accounts**: [address: Address, privKey: Buffer][] +â€ĸ `Readonly` **accounts**: [address: Address, privKey: Uint8Array][] #### Defined in -[config.ts:295](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L295) +[config.ts:419](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L419) ___ @@ -106,7 +157,7 @@ ___ #### Defined in -[config.ts:280](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L280) +[config.ts:396](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L396) ___ @@ -116,7 +167,17 @@ ___ #### Defined in -[config.ts:311](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L311) +[config.ts:455](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L455) + +___ + +### codeCache + +â€ĸ `Readonly` **codeCache**: `number` + +#### Defined in + +[config.ts:412](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L412) ___ @@ -126,7 +187,7 @@ ___ #### Defined in -[config.ts:277](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L277) +[config.ts:394](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L394) ___ @@ -136,57 +197,77 @@ ___ #### Defined in -[config.ts:291](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L291) +[config.ts:414](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L414) ___ -### disableBeaconSync +### discDns -â€ĸ `Readonly` **disableBeaconSync**: `boolean` +â€ĸ `Readonly` **discDns**: `boolean` #### Defined in -[config.ts:301](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L301) +[config.ts:415](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L415) ___ -### disableSnapSync +### discV4 -â€ĸ `Readonly` **disableSnapSync**: `boolean` = `false` +â€ĸ `Readonly` **discV4**: `boolean` #### Defined in -[config.ts:304](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L304) +[config.ts:416](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L416) ___ -### discDns +### dnsAddr -â€ĸ `Readonly` **discDns**: `boolean` +â€ĸ `Readonly` **dnsAddr**: `string` #### Defined in -[config.ts:292](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L292) +[config.ts:407](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L407) ___ -### discV4 +### enableSnapSync -â€ĸ `Readonly` **discV4**: `boolean` +â€ĸ `Readonly` **enableSnapSync**: `boolean` #### Defined in -[config.ts:293](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L293) +[config.ts:440](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L440) ___ -### dnsAddr +### engineNewpayloadMaxExecute -â€ĸ `Readonly` **dnsAddr**: `string` +â€ĸ `Readonly` **engineNewpayloadMaxExecute**: `number` + +#### Defined in + +[config.ts:433](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L433) + +___ + +### engineNewpayloadMaxTxsExecute + +â€ĸ `Readonly` **engineNewpayloadMaxTxsExecute**: `number` + +#### Defined in + +[config.ts:434](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L434) + +___ + +### engineParentLookupMaxDepth + +â€ĸ `Readonly` **engineParentLookupMaxDepth**: `number` #### Defined in -[config.ts:290](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L290) +[config.ts:432](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L432) ___ @@ -199,7 +280,7 @@ components of the client #### Defined in -[config.ts:255](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L255) +[config.ts:346](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L346) ___ @@ -209,7 +290,17 @@ ___ #### Defined in -[config.ts:312](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L312) +[config.ts:456](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L456) + +___ + +### execution + +â€ĸ `Readonly` **execution**: `boolean` + +#### Defined in + +[config.ts:408](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L408) ___ @@ -219,27 +310,27 @@ ___ #### Defined in -[config.ts:282](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L282) +[config.ts:398](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L398) ___ -### forceSnapSync +### isSingleNode -â€ĸ `Readonly` **forceSnapSync**: `boolean` +â€ĸ `Readonly` **isSingleNode**: `boolean` #### Defined in -[config.ts:302](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L302) +[config.ts:418](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L418) ___ ### key -â€ĸ `Readonly` **key**: `Buffer` +â€ĸ `Readonly` **key**: `Uint8Array` #### Defined in -[config.ts:278](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L278) +[config.ts:395](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L395) ___ @@ -247,9 +338,21 @@ ___ â€ĸ **lastSyncDate**: `number` +lastSyncDate in ms + +#### Defined in + +[config.ts:449](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L449) + +___ + +### lastsyncronized + +â€ĸ `Optional` **lastsyncronized**: `boolean` + #### Defined in -[config.ts:307](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L307) +[config.ts:447](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L447) ___ @@ -259,7 +362,7 @@ ___ #### Defined in -[config.ts:276](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L276) +[config.ts:393](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L393) ___ @@ -269,7 +372,17 @@ ___ #### Defined in -[config.ts:273](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L273) +[config.ts:390](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L390) + +___ + +### maxAccountRange + +â€ĸ `Readonly` **maxAccountRange**: `bigint` + +#### Defined in + +[config.ts:427](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L427) ___ @@ -279,7 +392,27 @@ ___ #### Defined in -[config.ts:287](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L287) +[config.ts:403](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L403) + +___ + +### maxFetcherRequests + +â€ĸ `Readonly` **maxFetcherRequests**: `number` + +#### Defined in + +[config.ts:404](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L404) + +___ + +### maxInvalidBlocksErrorCache + +â€ĸ `Readonly` **maxInvalidBlocksErrorCache**: `number` + +#### Defined in + +[config.ts:429](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L429) ___ @@ -289,7 +422,7 @@ ___ #### Defined in -[config.ts:289](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L289) +[config.ts:406](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L406) ___ @@ -299,7 +432,27 @@ ___ #### Defined in -[config.ts:286](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L286) +[config.ts:402](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L402) + +___ + +### maxRangeBytes + +â€ĸ `Readonly` **maxRangeBytes**: `number` + +#### Defined in + +[config.ts:426](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L426) + +___ + +### maxStorageRange + +â€ĸ `Readonly` **maxStorageRange**: `bigint` + +#### Defined in + +[config.ts:428](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L428) ___ @@ -309,7 +462,7 @@ ___ #### Defined in -[config.ts:288](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L288) +[config.ts:405](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L405) ___ @@ -319,7 +472,7 @@ ___ #### Defined in -[config.ts:294](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L294) +[config.ts:417](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L417) ___ @@ -329,7 +482,7 @@ ___ #### Defined in -[config.ts:296](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L296) +[config.ts:420](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L420) ___ @@ -339,7 +492,17 @@ ___ #### Defined in -[config.ts:283](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L283) +[config.ts:399](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L399) + +___ + +### numBlocksPerIteration + +â€ĸ `Readonly` **numBlocksPerIteration**: `number` + +#### Defined in + +[config.ts:409](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L409) ___ @@ -349,7 +512,27 @@ ___ #### Defined in -[config.ts:281](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L281) +[config.ts:397](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L397) + +___ + +### prefixStorageTrieKeys + +â€ĸ `Readonly` **prefixStorageTrieKeys**: `boolean` + +#### Defined in + +[config.ts:438](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L438) + +___ + +### pruneEngineCache + +â€ĸ `Readonly` **pruneEngineCache**: `boolean` + +#### Defined in + +[config.ts:430](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L430) ___ @@ -359,7 +542,17 @@ ___ #### Defined in -[config.ts:298](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L298) +[config.ts:423](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L423) + +___ + +### savePreimages + +â€ĸ `Readonly` **savePreimages**: `boolean` + +#### Defined in + +[config.ts:442](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L442) ___ @@ -369,17 +562,29 @@ ___ #### Defined in -[config.ts:284](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L284) +[config.ts:400](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L400) ___ -### servers +### server -â€ĸ `Readonly` **servers**: (`Libp2pServer` \| `RlpxServer`)[] = `[]` +â€ĸ `Readonly` **server**: `undefined` \| `RlpxServer` = `undefined` #### Defined in -[config.ts:314](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L314) +[config.ts:458](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L458) + +___ + +### shutdown + +â€ĸ **shutdown**: `boolean` = `false` + +Client is in the process of shutting down + +#### Defined in + +[config.ts:453](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L453) ___ @@ -389,7 +594,7 @@ ___ #### Defined in -[config.ts:299](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L299) +[config.ts:424](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L424) ___ @@ -399,7 +604,47 @@ ___ #### Defined in -[config.ts:300](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L300) +[config.ts:425](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L425) + +___ + +### snapAvailabilityDepth + +â€ĸ `Readonly` **snapAvailabilityDepth**: `bigint` + +#### Defined in + +[config.ts:435](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L435) + +___ + +### snapTransitionSafeDepth + +â€ĸ `Readonly` **snapTransitionSafeDepth**: `bigint` + +#### Defined in + +[config.ts:436](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L436) + +___ + +### statelessVerkle + +â€ĸ `Readonly` **statelessVerkle**: `boolean` + +#### Defined in + +[config.ts:444](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L444) + +___ + +### storageCache + +â€ĸ `Readonly` **storageCache**: `number` + +#### Defined in + +[config.ts:411](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L411) ___ @@ -411,7 +656,17 @@ Best known block height #### Defined in -[config.ts:309](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L309) +[config.ts:451](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L451) + +___ + +### syncedStateRemovalPeriod + +â€ĸ `Readonly` **syncedStateRemovalPeriod**: `number` + +#### Defined in + +[config.ts:431](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L431) ___ @@ -421,7 +676,7 @@ ___ #### Defined in -[config.ts:306](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L306) +[config.ts:446](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L446) ___ @@ -431,17 +686,17 @@ ___ #### Defined in -[config.ts:274](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L274) +[config.ts:391](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L391) ___ -### transports +### trieCache -â€ĸ `Readonly` **transports**: `string`[] +â€ĸ `Readonly` **trieCache**: `number` #### Defined in -[config.ts:279](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L279) +[config.ts:413](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L413) ___ @@ -451,7 +706,17 @@ ___ #### Defined in -[config.ts:285](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L285) +[config.ts:401](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L401) + +___ + +### useStringValueTrieDB + +â€ĸ `Readonly` **useStringValueTrieDB**: `boolean` + +#### Defined in + +[config.ts:441](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L441) ___ @@ -461,7 +726,27 @@ ___ #### Defined in -[config.ts:275](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L275) +[config.ts:392](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L392) + +___ + +### vmProfilerOpts + +â€ĸ `Optional` `Readonly` **vmProfilerOpts**: `VMProfilerOpts` + +#### Defined in + +[config.ts:421](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L421) + +___ + +### ACCOUNT\_CACHE + +â–Ē `Static` `Readonly` **ACCOUNT\_CACHE**: ``400000`` + +#### Defined in + +[config.ts:361](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L361) ___ @@ -471,7 +756,17 @@ ___ #### Defined in -[config.ts:257](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L257) +[config.ts:348](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L348) + +___ + +### CODE\_CACHE + +â–Ē `Static` `Readonly` **CODE\_CACHE**: ``200000`` + +#### Defined in + +[config.ts:363](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L363) ___ @@ -481,7 +776,7 @@ ___ #### Defined in -[config.ts:260](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L260) +[config.ts:351](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L351) ___ @@ -491,7 +786,7 @@ ___ #### Defined in -[config.ts:268](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L268) +[config.ts:365](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L365) ___ @@ -501,7 +796,47 @@ ___ #### Defined in -[config.ts:267](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L267) +[config.ts:358](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L358) + +___ + +### ENGINE\_NEWPAYLOAD\_MAX\_EXECUTE + +â–Ē `Static` `Readonly` **ENGINE\_NEWPAYLOAD\_MAX\_EXECUTE**: ``2`` + +#### Defined in + +[config.ts:382](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L382) + +___ + +### ENGINE\_NEWPAYLOAD\_MAX\_TXS\_EXECUTE + +â–Ē `Static` `Readonly` **ENGINE\_NEWPAYLOAD\_MAX\_TXS\_EXECUTE**: ``100`` + +#### Defined in + +[config.ts:384](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L384) + +___ + +### ENGINE\_PARENTLOOKUP\_MAX\_DEPTH + +â–Ē `Static` `Readonly` **ENGINE\_PARENTLOOKUP\_MAX\_DEPTH**: ``128`` + +#### Defined in + +[config.ts:381](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L381) + +___ + +### EXECUTION + +â–Ē `Static` `Readonly` **EXECUTION**: ``true`` + +#### Defined in + +[config.ts:359](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L359) ___ @@ -511,7 +846,7 @@ ___ #### Defined in -[config.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L259) +[config.ts:350](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L350) ___ @@ -521,7 +856,17 @@ ___ #### Defined in -[config.ts:264](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L264) +[config.ts:354](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L354) + +___ + +### MAXFETCHERREQUESTS\_DEFAULT + +â–Ē `Static` `Readonly` **MAXFETCHERREQUESTS\_DEFAULT**: ``5`` + +#### Defined in + +[config.ts:355](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L355) ___ @@ -531,17 +876,57 @@ ___ #### Defined in -[config.ts:266](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L266) +[config.ts:357](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L357) ___ ### MAXPERREQUEST\_DEFAULT -â–Ē `Static` `Readonly` **MAXPERREQUEST\_DEFAULT**: ``50`` +â–Ē `Static` `Readonly` **MAXPERREQUEST\_DEFAULT**: ``100`` + +#### Defined in + +[config.ts:353](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L353) + +___ + +### MAX\_ACCOUNT\_RANGE + +â–Ē `Static` `Readonly` **MAX\_ACCOUNT\_RANGE**: `bigint` + +#### Defined in + +[config.ts:372](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L372) + +___ + +### MAX\_INVALID\_BLOCKS\_ERROR\_CACHE + +â–Ē `Static` `Readonly` **MAX\_INVALID\_BLOCKS\_ERROR\_CACHE**: ``128`` + +#### Defined in + +[config.ts:376](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L376) + +___ + +### MAX\_RANGE\_BYTES + +â–Ē `Static` `Readonly` **MAX\_RANGE\_BYTES**: ``50000`` #### Defined in -[config.ts:263](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L263) +[config.ts:370](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L370) + +___ + +### MAX\_STORAGE\_RANGE + +â–Ē `Static` `Readonly` **MAX\_STORAGE\_RANGE**: `bigint` + +#### Defined in + +[config.ts:374](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L374) ___ @@ -551,7 +936,17 @@ ___ #### Defined in -[config.ts:265](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L265) +[config.ts:356](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L356) + +___ + +### NUM\_BLOCKS\_PER\_ITERATION + +â–Ē `Static` `Readonly` **NUM\_BLOCKS\_PER\_ITERATION**: ``100`` + +#### Defined in + +[config.ts:360](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L360) ___ @@ -561,7 +956,17 @@ ___ #### Defined in -[config.ts:262](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L262) +[config.ts:352](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L352) + +___ + +### PRUNE\_ENGINE\_CACHE + +â–Ē `Static` `Readonly` **PRUNE\_ENGINE\_CACHE**: ``true`` + +#### Defined in + +[config.ts:377](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L377) ___ @@ -571,7 +976,7 @@ ___ #### Defined in -[config.ts:269](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L269) +[config.ts:366](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L366) ___ @@ -581,7 +986,7 @@ ___ #### Defined in -[config.ts:270](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L270) +[config.ts:367](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L367) ___ @@ -591,7 +996,47 @@ ___ #### Defined in -[config.ts:271](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L271) +[config.ts:368](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L368) + +___ + +### SNAP\_AVAILABILITY\_DEPTH + +â–Ē `Static` `Readonly` **SNAP\_AVAILABILITY\_DEPTH**: `bigint` + +#### Defined in + +[config.ts:385](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L385) + +___ + +### SNAP\_TRANSITION\_SAFE\_DEPTH + +â–Ē `Static` `Readonly` **SNAP\_TRANSITION\_SAFE\_DEPTH**: `bigint` + +#### Defined in + +[config.ts:388](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L388) + +___ + +### STORAGE\_CACHE + +â–Ē `Static` `Readonly` **STORAGE\_CACHE**: ``200000`` + +#### Defined in + +[config.ts:362](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L362) + +___ + +### SYNCED\_STATE\_REMOVAL\_PERIOD + +â–Ē `Static` `Readonly` **SYNCED\_STATE\_REMOVAL\_PERIOD**: ``60000`` + +#### Defined in + +[config.ts:379](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L379) ___ @@ -601,17 +1046,17 @@ ___ #### Defined in -[config.ts:258](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L258) +[config.ts:349](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L349) ___ -### TRANSPORTS\_DEFAULT +### TRIE\_CACHE -â–Ē `Static` `Readonly` **TRANSPORTS\_DEFAULT**: `string`[] +â–Ē `Static` `Readonly` **TRIE\_CACHE**: ``200000`` #### Defined in -[config.ts:261](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L261) +[config.ts:364](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L364) ## Methods @@ -633,7 +1078,7 @@ Returns the location for each [DataDirectory](../enums/DataDirectory.md) #### Defined in -[config.ts:398](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L398) +[config.ts:637](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L637) ___ @@ -656,7 +1101,7 @@ is enabled based on chainName. `true` for goerli #### Defined in -[config.ts:444](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L444) +[config.ts:698](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L698) ___ @@ -672,36 +1117,61 @@ Returns the network directory for the chain. #### Defined in -[config.ts:390](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L390) +[config.ts:629](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L629) ___ -### getV4Discovery +### superMsg -▸ **getV4Discovery**(`option`): `boolean` +▸ **superMsg**(`msgs`, `meta?`): `void` -Returns specified option or the default setting for whether v4 peer discovery -is enabled based on chainName. `true` for `mainnet` +#### Parameters + +| Name | Type | +| :------ | :------ | +| `msgs` | `string` \| `string`[] | +| `meta?` | `any` | + +#### Returns + +`void` + +#### Defined in + +[config.ts:679](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L679) + +___ + +### updateSynchronizedState + +▸ **updateSynchronizedState**(`latest?`, `emitSyncEvent?`): `void` + +Update the synchronized state of the chain + +**`Emits`** + +Event.SYNC_SYNCHRONIZED #### Parameters | Name | Type | | :------ | :------ | -| `option` | `undefined` \| `boolean` | +| `latest?` | ``null`` \| `BlockHeader` | +| `emitSyncEvent?` | `boolean` | #### Returns -`boolean` +`void` #### Defined in -[config.ts:454](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L454) +[config.ts:570](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L570) ___ ### getClientKey -▸ `Static` **getClientKey**(`datadir`, `common`): `Promise`<`undefined` \| `Buffer`\> +▸ `Static` **getClientKey**(`datadir`, `common`): `Promise`<`undefined` \| `Uint8Array`\> Gets the client private key from the config db. @@ -714,17 +1184,17 @@ Gets the client private key from the config db. #### Returns -`Promise`<`undefined` \| `Buffer`\> +`Promise`<`undefined` \| `Uint8Array`\> #### Defined in -[config.ts:422](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L422) +[config.ts:661](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L661) ___ ### getConfigDB -▸ `Static` **getConfigDB**(`networkDir`): `Level`<`string` \| `Buffer`, `Buffer`\> +▸ `Static` **getConfigDB**(`networkDir`): `Level`<`string` \| `Uint8Array`, `Uint8Array`\> Returns the config level db. @@ -736,8 +1206,8 @@ Returns the config level db. #### Returns -`Level`<`string` \| `Buffer`, `Buffer`\> +`Level`<`string` \| `Uint8Array`, `Uint8Array`\> #### Defined in -[config.ts:415](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L415) +[config.ts:654](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L654) diff --git a/packages/client/docs/enums/SyncMode.md b/packages/client/docs/enums/SyncMode.md index 087d93308..1f9fac307 100644 --- a/packages/client/docs/enums/SyncMode.md +++ b/packages/client/docs/enums/SyncMode.md @@ -8,6 +8,7 @@ - [Full](SyncMode.md#full) - [Light](SyncMode.md#light) +- [None](SyncMode.md#none) ## Enumeration Members @@ -17,7 +18,7 @@ #### Defined in -[config.ts:23](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L23) +[config.ts:24](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L24) ___ @@ -27,4 +28,14 @@ ___ #### Defined in -[config.ts:24](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L24) +[config.ts:25](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L25) + +___ + +### None + +â€ĸ **None** = ``"none"`` + +#### Defined in + +[config.ts:26](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L26) diff --git a/packages/client/docs/interfaces/ConfigOptions.md b/packages/client/docs/interfaces/ConfigOptions.md index 6b7dbd17a..2c034912a 100644 --- a/packages/client/docs/interfaces/ConfigOptions.md +++ b/packages/client/docs/interfaces/ConfigOptions.md @@ -6,44 +6,79 @@ ### Properties +- [accountCache](ConfigOptions.md#accountcache) - [accounts](ConfigOptions.md#accounts) - [bootnodes](ConfigOptions.md#bootnodes) +- [codeCache](ConfigOptions.md#codecache) - [common](ConfigOptions.md#common) - [datadir](ConfigOptions.md#datadir) - [debugCode](ConfigOptions.md#debugcode) -- [disableBeaconSync](ConfigOptions.md#disablebeaconsync) - [discDns](ConfigOptions.md#discdns) - [discV4](ConfigOptions.md#discv4) - [dnsAddr](ConfigOptions.md#dnsaddr) - [dnsNetworks](ConfigOptions.md#dnsnetworks) +- [enableSnapSync](ConfigOptions.md#enablesnapsync) +- [engineNewpayloadMaxExecute](ConfigOptions.md#enginenewpayloadmaxexecute) +- [engineNewpayloadMaxTxsExecute](ConfigOptions.md#enginenewpayloadmaxtxsexecute) +- [engineParentLookupMaxDepth](ConfigOptions.md#engineparentlookupmaxdepth) +- [execution](ConfigOptions.md#execution) - [extIP](ConfigOptions.md#extip) -- [forceSnapSync](ConfigOptions.md#forcesnapsync) +- [isSingleNode](ConfigOptions.md#issinglenode) - [key](ConfigOptions.md#key) - [lightserv](ConfigOptions.md#lightserv) - [logger](ConfigOptions.md#logger) +- [maxAccountRange](ConfigOptions.md#maxaccountrange) - [maxFetcherJobs](ConfigOptions.md#maxfetcherjobs) +- [maxFetcherRequests](ConfigOptions.md#maxfetcherrequests) +- [maxInvalidBlocksErrorCache](ConfigOptions.md#maxinvalidblockserrorcache) - [maxPeers](ConfigOptions.md#maxpeers) - [maxPerRequest](ConfigOptions.md#maxperrequest) +- [maxRangeBytes](ConfigOptions.md#maxrangebytes) +- [maxStorageRange](ConfigOptions.md#maxstoragerange) - [minPeers](ConfigOptions.md#minpeers) - [mine](ConfigOptions.md#mine) - [minerCoinbase](ConfigOptions.md#minercoinbase) - [multiaddrs](ConfigOptions.md#multiaddrs) +- [numBlocksPerIteration](ConfigOptions.md#numblocksperiteration) - [port](ConfigOptions.md#port) +- [prefixStorageTrieKeys](ConfigOptions.md#prefixstoragetriekeys) +- [pruneEngineCache](ConfigOptions.md#pruneenginecache) - [safeReorgDistance](ConfigOptions.md#safereorgdistance) +- [savePreimages](ConfigOptions.md#savepreimages) - [saveReceipts](ConfigOptions.md#savereceipts) -- [servers](ConfigOptions.md#servers) +- [server](ConfigOptions.md#server) - [skeletonFillCanonicalBackStep](ConfigOptions.md#skeletonfillcanonicalbackstep) - [skeletonSubchainMergeMinimum](ConfigOptions.md#skeletonsubchainmergeminimum) +- [snapAvailabilityDepth](ConfigOptions.md#snapavailabilitydepth) +- [snapTransitionSafeDepth](ConfigOptions.md#snaptransitionsafedepth) +- [statelessVerkle](ConfigOptions.md#statelessverkle) +- [storageCache](ConfigOptions.md#storagecache) +- [syncedStateRemovalPeriod](ConfigOptions.md#syncedstateremovalperiod) - [syncmode](ConfigOptions.md#syncmode) -- [transports](ConfigOptions.md#transports) +- [trieCache](ConfigOptions.md#triecache) - [txLookupLimit](ConfigOptions.md#txlookuplimit) +- [useStringValueTrieDB](ConfigOptions.md#usestringvaluetriedb) - [vm](ConfigOptions.md#vm) +- [vmProfileBlocks](ConfigOptions.md#vmprofileblocks) +- [vmProfileTxs](ConfigOptions.md#vmprofiletxs) ## Properties +### accountCache + +â€ĸ `Optional` **accountCache**: `number` + +Size for the account cache (max number of accounts) + +#### Defined in + +[config.ts:199](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L199) + +___ + ### accounts -â€ĸ `Optional` **accounts**: [address: Address, privKey: Buffer][] +â€ĸ `Optional` **accounts**: [address: Address, privKey: Uint8Array][] Unlocked accounts of form [address, privateKey] Currently only the first account is used to seal mined PoA blocks @@ -52,7 +87,7 @@ Default: [] #### Defined in -[config.ts:221](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L221) +[config.ts:269](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L269) ___ @@ -65,7 +100,19 @@ Network bootnodes #### Defined in -[config.ts:98](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L98) +[config.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L96) + +___ + +### codeCache + +â€ĸ `Optional` **codeCache**: `number` + +Size for the code cache (max number of contracts) + +#### Defined in + +[config.ts:209](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L209) ___ @@ -80,7 +127,7 @@ Default: 'mainnet' Common #### Defined in -[config.ts:34](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L34) +[config.ts:36](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L36) ___ @@ -92,7 +139,7 @@ Root data directory for the blockchain #### Defined in -[config.ts:78](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L78) +[config.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L83) ___ @@ -108,22 +155,7 @@ EthereumJS VM on execution errors #### Defined in -[config.ts:192](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L192) - -___ - -### disableBeaconSync - -â€ĸ `Optional` **disableBeaconSync**: `boolean` - -Whether to disable beacon (optimistic) sync if CL provides -blocks at the head of chain. - -Default: false - -#### Defined in - -[config.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L49) +[config.ts:223](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L223) ___ @@ -137,7 +169,7 @@ Default: `true` for testnets, false for mainnet #### Defined in -[config.ts:199](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L199) +[config.ts:230](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L230) ___ @@ -151,7 +183,7 @@ Default: `false` for testnets, true for mainnet #### Defined in -[config.ts:206](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L206) +[config.ts:237](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L237) ___ @@ -165,7 +197,7 @@ Default `8.8.8.8` (Google) #### Defined in -[config.ts:178](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L178) +[config.ts:179](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L179) ___ @@ -177,7 +209,69 @@ EIP-1459 ENR Tree urls to query via DNS for peer discovery #### Defined in -[config.ts:183](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L183) +[config.ts:184](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L184) + +___ + +### enableSnapSync + +â€ĸ `Optional` **enableSnapSync**: `boolean` + +Whether to enable and run snapSync, currently experimental + +Default: false + +#### Defined in + +[config.ts:50](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L50) + +___ + +### engineNewpayloadMaxExecute + +â€ĸ `Optional` **engineNewpayloadMaxExecute**: `number` + +Max blocks including unexecuted parents to be executed in engine's newPayload + +#### Defined in + +[config.ts:313](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L313) + +___ + +### engineNewpayloadMaxTxsExecute + +â€ĸ `Optional` **engineNewpayloadMaxTxsExecute**: `number` + +Limit max transactions per block to execute in engine's newPayload for responsive engine api + +#### Defined in + +[config.ts:318](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L318) + +___ + +### engineParentLookupMaxDepth + +â€ĸ `Optional` **engineParentLookupMaxDepth**: `number` + +Max depth for parent lookups in engine's newPayload and forkchoiceUpdated + +#### Defined in + +[config.ts:308](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L308) + +___ + +### execution + +â€ĸ `Optional` **execution**: `boolean` + +Start continuous VM execution (pre-Merge setting) + +#### Defined in + +[config.ts:189](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L189) ___ @@ -189,30 +283,27 @@ RLPx external IP #### Defined in -[config.ts:110](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L110) +[config.ts:108](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L108) ___ -### forceSnapSync +### isSingleNode -â€ĸ `Optional` **forceSnapSync**: `boolean` +â€ĸ `Optional` **isSingleNode**: `boolean` -Whether to test and run snapSync. When fully ready, this needs to -be replaced by a more sophisticated condition based on how far back we are -from the head, and how to run it in conjunction with the beacon sync -blocks at the head of chain. +Is a single node and doesn't need peers for synchronization -Default: false +Default: `false` #### Defined in -[config.ts:59](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L59) +[config.ts:251](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L251) ___ ### key -â€ĸ `Optional` **key**: `Buffer` +â€ĸ `Optional` **key**: `Uint8Array` Private key for the client. Use return value of [getClientKey](../classes/Config.md#getclientkey). @@ -220,7 +311,7 @@ If left blank, a random key will be generated and used. #### Defined in -[config.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L85) +[config.ts:90](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L90) ___ @@ -234,7 +325,7 @@ Default: `false` #### Defined in -[config.ts:73](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L73) +[config.ts:78](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L78) ___ @@ -249,7 +340,17 @@ Default: Logger with loglevel 'info' #### Defined in -[config.ts:143](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L143) +[config.ts:139](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L139) + +___ + +### maxAccountRange + +â€ĸ `Optional` **maxAccountRange**: `bigint` + +#### Defined in + +[config.ts:299](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L299) ___ @@ -263,7 +364,31 @@ Default: `100` #### Defined in -[config.ts:157](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L157) +[config.ts:153](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L153) + +___ + +### maxFetcherRequests + +â€ĸ `Optional` **maxFetcherRequests**: `number` + +Max outgoing multi-peer requests by the fetcher at any given time + +#### Defined in + +[config.ts:158](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L158) + +___ + +### maxInvalidBlocksErrorCache + +â€ĸ `Optional` **maxInvalidBlocksErrorCache**: `number` + +Cache size of invalid block hashes and their errors + +#### Defined in + +[config.ts:325](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L325) ___ @@ -277,7 +402,7 @@ Default: `25` #### Defined in -[config.ts:171](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L171) +[config.ts:172](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L172) ___ @@ -287,11 +412,31 @@ ___ Max items per block or header request -Default: `50`` +Default: `100` + +#### Defined in + +[config.ts:146](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L146) + +___ + +### maxRangeBytes + +â€ĸ `Optional` **maxRangeBytes**: `number` + +#### Defined in + +[config.ts:297](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L297) + +___ + +### maxStorageRange + +â€ĸ `Optional` **maxStorageRange**: `bigint` #### Defined in -[config.ts:150](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L150) +[config.ts:320](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L320) ___ @@ -305,7 +450,7 @@ Default: `1` #### Defined in -[config.ts:164](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L164) +[config.ts:165](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L165) ___ @@ -319,7 +464,7 @@ Default: `false` #### Defined in -[config.ts:213](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L213) +[config.ts:244](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L244) ___ @@ -332,7 +477,7 @@ If not provided, defaults to the primary account. #### Defined in -[config.ts:227](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L227) +[config.ts:275](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L275) ___ @@ -345,7 +490,19 @@ Network multiaddrs for libp2p #### Defined in -[config.ts:116](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L116) +[config.ts:114](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L114) + +___ + +### numBlocksPerIteration + +â€ĸ `Optional` **numBlocksPerIteration**: `number` + +Number of blocks to execute in batch mode and logged to console + +#### Defined in + +[config.ts:194](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L194) ___ @@ -359,7 +516,32 @@ Default: `30303` #### Defined in -[config.ts:105](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L105) +[config.ts:103](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L103) + +___ + +### prefixStorageTrieKeys + +â€ĸ `Optional` **prefixStorageTrieKeys**: `boolean` + +A temporary option to offer backward compatibility with already-synced databases that are +using non-prefixed keys for storage tries + +Default: true + +#### Defined in + +[config.ts:58](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L58) + +___ + +### pruneEngineCache + +â€ĸ `Optional` **pruneEngineCache**: `boolean` + +#### Defined in + +[config.ts:326](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L326) ___ @@ -372,7 +554,19 @@ to try to refetch and refeed the blocks. #### Defined in -[config.ts:233](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L233) +[config.ts:281](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L281) + +___ + +### savePreimages + +â€ĸ `Optional` **savePreimages**: `boolean` + +Save account keys preimages in the meta db (default: false) + +#### Defined in + +[config.ts:333](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L333) ___ @@ -384,22 +578,20 @@ Save tx receipts and logs in the meta db (default: false) #### Defined in -[config.ts:129](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L129) +[config.ts:125](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L125) ___ -### servers - -â€ĸ `Optional` **servers**: (`Libp2pServer` \| `RlpxServer`)[] +### server -Transport servers (RLPx or Libp2p) -Use `transports` option, only used for testing purposes +â€ĸ `Optional` **server**: `RlpxServer` -Default: servers created from `transports` option +Transport servers (RLPx) +Only used for testing purposes #### Defined in -[config.ts:124](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L124) +[config.ts:120](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L120) ___ @@ -413,7 +605,7 @@ to backstep and fill again using reverse block fetcher. #### Defined in -[config.ts:240](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L240) +[config.ts:288](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L288) ___ @@ -427,7 +619,63 @@ reset #### Defined in -[config.ts:247](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L247) +[config.ts:295](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L295) + +___ + +### snapAvailabilityDepth + +â€ĸ `Optional` **snapAvailabilityDepth**: `bigint` + +#### Defined in + +[config.ts:327](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L327) + +___ + +### snapTransitionSafeDepth + +â€ĸ `Optional` **snapTransitionSafeDepth**: `bigint` + +#### Defined in + +[config.ts:328](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L328) + +___ + +### statelessVerkle + +â€ĸ `Optional` **statelessVerkle**: `boolean` + +Enables stateless verkle block execution (default: false) + +#### Defined in + +[config.ts:338](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L338) + +___ + +### storageCache + +â€ĸ `Optional` **storageCache**: `number` + +Size for the storage cache (max number of contracts) + +#### Defined in + +[config.ts:204](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L204) + +___ + +### syncedStateRemovalPeriod + +â€ĸ `Optional` **syncedStateRemovalPeriod**: `number` + +The time after which synced state is downgraded to unsynced + +#### Defined in + +[config.ts:303](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L303) ___ @@ -435,27 +683,25 @@ ___ â€ĸ `Optional` **syncmode**: [`SyncMode`](../enums/SyncMode.md) -Synchronization mode ('full' or 'light') +Synchronization mode ('full', 'light', 'none') Default: 'full' #### Defined in -[config.ts:41](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L41) +[config.ts:43](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L43) ___ -### transports +### trieCache -â€ĸ `Optional` **transports**: `string`[] +â€ĸ `Optional` **trieCache**: `number` -Network transports ('rlpx' and/or 'libp2p') - -Default: `['rlpx', 'libp2p']` +Size for the trie cache (max number of trie nodes) #### Defined in -[config.ts:92](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L92) +[config.ts:214](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L214) ___ @@ -468,7 +714,20 @@ Number of recent blocks to maintain transactions index for #### Defined in -[config.ts:135](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L135) +[config.ts:131](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L131) + +___ + +### useStringValueTrieDB + +â€ĸ `Optional` **useStringValueTrieDB**: `boolean` + +A temporary option to offer backward compatibility with already-synced databases that stores +trie items as `string`, instead of the more performant `Uint8Array` + +#### Defined in + +[config.ts:64](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L64) ___ @@ -482,4 +741,28 @@ Default: VM instance created by client #### Defined in -[config.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/lib/config.ts#L66) +[config.ts:71](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L71) + +___ + +### vmProfileBlocks + +â€ĸ `Optional` **vmProfileBlocks**: `boolean` + +Whether to profile VM blocks + +#### Defined in + +[config.ts:256](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L256) + +___ + +### vmProfileTxs + +â€ĸ `Optional` **vmProfileTxs**: `boolean` + +Whether to profile VM txs + +#### Defined in + +[config.ts:261](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/client/src/config.ts#L261) diff --git a/packages/client/package.json b/packages/client/package.json index 79082ee5a..554cda2c9 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/client", - "version": "0.10.0", + "version": "0.10.1", "description": "EthereumJS Execution Layer (EL) Client Implementation", "keywords": [ "ethereum", @@ -56,25 +56,25 @@ "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/block": "5.1.1", - "@ethereumjs/blockchain": "7.1.0", - "@ethereumjs/common": "4.2.0", - "@ethereumjs/devp2p": "6.1.1", - "@ethereumjs/ethash": "3.0.2", - "@ethereumjs/evm": "2.2.1", - "@ethereumjs/genesis": "0.2.1", + "@ethereumjs/block": "5.2.0", + "@ethereumjs/blockchain": "7.2.0", + "@ethereumjs/common": "4.3.0", + "@ethereumjs/devp2p": "6.1.2", + "@ethereumjs/ethash": "3.0.3", + "@ethereumjs/evm": "3.0.0", + "@ethereumjs/genesis": "0.2.2", "@ethereumjs/rlp": "5.0.2", - "@ethereumjs/statemanager": "2.2.2", - "@ethereumjs/trie": "6.1.1", - "@ethereumjs/tx": "5.2.1", - "@ethereumjs/util": "9.0.2", - "@ethereumjs/verkle": "^0.0.1", - "@ethereumjs/vm": "7.2.1", + "@ethereumjs/statemanager": "2.3.0", + "@ethereumjs/trie": "6.2.0", + "@ethereumjs/tx": "5.3.0", + "@ethereumjs/util": "9.0.3", + "@ethereumjs/verkle": "^0.0.2", + "@ethereumjs/vm": "8.0.0", "@polkadot/util": "^12.6.2", "@polkadot/wasm-crypto": "^7.3.2", "abstract-level": "^1.0.3", "body-parser": "^1.19.2", - "kzg-wasm": "^0.2.0", + "kzg-wasm": "^0.4.0", "chalk": "^4.1.2", "connect": "^3.7.0", "cors": "^2.8.5", @@ -88,6 +88,7 @@ "level": "^8.0.0", "memory-level": "^1.0.0", "multiaddr": "^10.0.1", + "prom-client": "^15.1.0", "qheap": "^1.4.0", "winston": "^3.3.3", "winston-daily-rotate-file": "^4.5.5", diff --git a/packages/client/src/blockchain/chain.ts b/packages/client/src/blockchain/chain.ts index f2b8c1a9e..eeed9c235 100644 --- a/packages/client/src/blockchain/chain.ts +++ b/packages/client/src/blockchain/chain.ts @@ -162,13 +162,15 @@ export class Chain { options.blockchain = options.blockchain ?? - new (Blockchain as any)({ + (await Blockchain.create({ db: new LevelDB(options.chainDB), common: options.config.chainCommon, hardforkByHeadBlockNumber: true, validateBlocks: true, validateConsensus, - }) + genesisState: options.genesisState, + genesisStateRoot: options.genesisStateRoot, + })) return new this(options) } @@ -253,10 +255,6 @@ export class Chain { async open(): Promise { if (this.opened) return false await this.blockchain.db.open() - await (this.blockchain as any)._init({ - genesisState: this._customGenesisState, - genesisStateRoot: this._customGenesisStateRoot, - }) this.opened = true await this.update(false) diff --git a/packages/client/src/config.ts b/packages/client/src/config.ts index 65734e5a0..cad13ff01 100644 --- a/packages/client/src/config.ts +++ b/packages/client/src/config.ts @@ -9,7 +9,7 @@ import { Event, EventBus } from './types' import { isBrowser, short } from './util' import type { Logger } from './logging' -import type { EventBusType, MultiaddrLike } from './types' +import type { EventBusType, MultiaddrLike, PrometheusMetrics } from './types' import type { BlockHeader } from '@ethereumjs/block' import type { VM, VMProfilerOpts } from '@ethereumjs/vm' import type { Multiaddr } from 'multiaddr' @@ -336,6 +336,13 @@ export interface ConfigOptions { * Enables stateless verkle block execution (default: false) */ statelessVerkle?: boolean + startExecution?: boolean + ignoreStatelessInvalidExecs?: boolean | string + + /** + * Enables Prometheus Metrics that can be collected for monitoring client health + */ + prometheusMetrics?: PrometheusMetrics } export class Config { @@ -442,6 +449,8 @@ export class Config { public readonly savePreimages: boolean public readonly statelessVerkle: boolean + public readonly startExecution: boolean + public readonly ignoreStatelessInvalidExecs: boolean | string public synchronized: boolean public lastsyncronized?: boolean @@ -457,6 +466,8 @@ export class Config { public readonly server: RlpxServer | undefined = undefined + public readonly metrics: PrometheusMetrics | undefined + constructor(options: ConfigOptions = {}) { this.events = new EventBus() as EventBusType @@ -529,6 +540,10 @@ export class Config { this.useStringValueTrieDB = options.useStringValueTrieDB ?? false this.statelessVerkle = options.statelessVerkle ?? true + this.startExecution = options.startExecution ?? false + this.ignoreStatelessInvalidExecs = options.ignoreStatelessInvalidExecs ?? false + + this.metrics = options.prometheusMetrics // Start it off as synchronized if this is configured to mine or as single node this.synchronized = this.isSingleNode ?? this.mine @@ -542,7 +557,7 @@ export class Config { this.discDns = this.getDnsDiscovery(options.discDns) this.discV4 = options.discV4 ?? true - this.logger = options.logger ?? getLogger({ loglevel: 'error' }) + this.logger = options.logger ?? getLogger({ logLevel: 'error' }) this.logger.info(`Sync Mode ${this.syncmode}`) if (this.syncmode !== SyncMode.None) { diff --git a/packages/client/src/execution/vmexecution.ts b/packages/client/src/execution/vmexecution.ts index 7a852451f..318f31ab1 100644 --- a/packages/client/src/execution/vmexecution.ts +++ b/packages/client/src/execution/vmexecution.ts @@ -22,6 +22,7 @@ import { hexToBytes, } from '@ethereumjs/util' import { VM } from '@ethereumjs/vm' +import { writeFileSync } from 'fs' import { Event } from '../types' import { short } from '../util' @@ -39,6 +40,7 @@ import type { RunBlockOpts, TxReceipt } from '@ethereumjs/vm' export enum ExecStatus { VALID = 'VALID', INVALID = 'INVALID', + IGNORE_INVALID = 'IGNORE_INVALID', } type ChainStatus = { @@ -186,9 +188,8 @@ export class VMExecution extends Execution { if (this.verkleVM !== undefined) { return } - this.config.logger.info(`Setting up verkleVM`) - const stateManager = new StatelessVerkleStateManager() + const stateManager = await StatelessVerkleStateManager.create() this.verkleVM = await VM.create({ common: this.config.execCommon, blockchain: this.chain.blockchain, @@ -237,6 +238,26 @@ export class VMExecution extends Execution { return } + const blockchain = this.chain.blockchain + if (typeof blockchain.getIteratorHead !== 'function') { + throw new Error('cannot get iterator head: blockchain has no getIteratorHead function') + } + const headBlock = await blockchain.getIteratorHead() + const { number, timestamp, stateRoot } = headBlock.header + this.chainStatus = { + height: number, + status: ExecStatus.VALID, + root: stateRoot, + hash: headBlock.hash(), + } + + if (typeof blockchain.getTotalDifficulty !== 'function') { + throw new Error('cannot get iterator head: blockchain has no getTotalDifficulty function') + } + const td = await blockchain.getTotalDifficulty(headBlock.header.hash()) + this.config.execCommon.setHardforkBy({ blockNumber: number, td, timestamp }) + this.hardfork = this.config.execCommon.hardfork() + if (this.config.execCommon.gteHardfork(Hardfork.Prague)) { if (!this.config.statelessVerkle) { throw Error(`Currently stateful verkle execution not supported`) @@ -252,32 +273,18 @@ export class VMExecution extends Execution { this.vm = this.merkleVM! } - if (typeof this.vm.blockchain.getIteratorHead !== 'function') { - throw new Error('cannot get iterator head: blockchain has no getIteratorHead function') - } - const headBlock = await this.vm.blockchain.getIteratorHead() - const { number, timestamp, stateRoot } = headBlock.header - this.chainStatus = { - height: number, - status: ExecStatus.VALID, - root: stateRoot, - hash: headBlock.hash(), - } if (number === BIGINT_0) { const genesisState = - this.chain['_customGenesisState'] ?? getGenesis(Number(this.vm.common.chainId())) - if (!genesisState) { + this.chain['_customGenesisState'] ?? getGenesis(Number(blockchain.common.chainId())) + if ( + !genesisState && + (this.vm instanceof DefaultStateManager || !this.config.statelessVerkle) + ) { throw new Error('genesisState not available') + } else { + await this.vm.stateManager.generateCanonicalGenesis(genesisState) } - await this.vm.stateManager.generateCanonicalGenesis(genesisState) - } - - if (typeof this.vm.blockchain.getTotalDifficulty !== 'function') { - throw new Error('cannot get iterator head: blockchain has no getTotalDifficulty function') } - const td = await this.vm.blockchain.getTotalDifficulty(headBlock.header.hash()) - this.config.execCommon.setHardforkBy({ blockNumber: number, td, timestamp }) - this.hardfork = this.config.execCommon.hardfork() await super.open() // TODO: Should a run be started to execute any left over blocks? @@ -566,6 +573,16 @@ export class VMExecution extends Execution { }) } + async jumpVmHead(jumpToHash: Uint8Array, jumpToNumber?: bigint): Promise { + return this.runWithLock(async () => { + // check if the block is canonical in chain + this.config.logger.warn( + `Setting execution head to hash=${short(jumpToHash)} number=${jumpToNumber}` + ) + await this.vm.blockchain.setIteratorHead('vm', jumpToHash) + }) + } + /** * Runs the VM execution * @param loop Whether to continue iterating until vm head equals chain head (default: true) @@ -753,14 +770,6 @@ export class VMExecution extends Execution { // Ensure to catch and not throw as this would lead to unCaughtException with process exit .catch(async (error) => { if (errorBlock !== undefined) { - // set the chainStatus to invalid - this.chainStatus = { - height: errorBlock.header.number, - root: errorBlock.header.stateRoot, - hash: errorBlock.hash(), - status: ExecStatus.INVALID, - } - const { number } = errorBlock.header const hash = short(errorBlock.hash()) const errorMsg = `Execution of block number=${number} hash=${hash} hardfork=${this.hardfork} failed` @@ -807,7 +816,37 @@ export class VMExecution extends Execution { ) } } else { - this.config.logger.warn(`${errorMsg}:\n${error}`) + this.chainStatus = { + height: errorBlock.header.number, + root: errorBlock.header.stateRoot, + hash: errorBlock.hash(), + status: + this.config.ignoreStatelessInvalidExecs !== false + ? ExecStatus.IGNORE_INVALID + : ExecStatus.INVALID, + } + + // headBlock should be parent of errorBlock and not undefined + if ( + typeof this.config.ignoreStatelessInvalidExecs === 'string' && + headBlock !== undefined + ) { + // save the data in spec test compatible manner + const blockNumStr = `${errorBlock.header.number}` + const file = `${this.config.ignoreStatelessInvalidExecs}/${blockNumStr}.json` + const jsonDump = { + [blockNumStr]: { + parent: headBlock.toExecutionPayload(), + execute: errorBlock.toExecutionPayload(), + }, + } + writeFileSync(file, JSON.stringify(jsonDump, null, 2)) + this.config.logger.warn( + `${errorMsg}:\n${error} payload saved to=${this.config.ignoreStatelessInvalidExecs}` + ) + } else { + this.config.logger.warn(`${errorMsg}:\n${error}`) + } } if (this.config.debugCode) { @@ -854,6 +893,8 @@ export class VMExecution extends Execution { : this.config.logger.info)( `Executed blocks count=${numExecuted} first=${firstNumber} hash=${firstHash} ${tdAdd}${baseFeeAdd}hardfork=${this.hardfork} last=${lastNumber} hash=${lastHash} txs=${txCounter}` ) + + await this.chain.update(false) } else { this.config.logger.debug( `No blocks executed past chain head hash=${short(endHeadBlock.hash())} number=${ @@ -906,7 +947,7 @@ export class VMExecution extends Execution { canonicalHead.header.number } hardfork=${this.config.execCommon.hardfork()} execution=${this.config.execution}` if ( - !this.config.execCommon.gteHardfork(Hardfork.Paris) && + (!this.config.execCommon.gteHardfork(Hardfork.Paris) || this.config.startExecution) && this.config.execution && vmHeadBlock.header.number < canonicalHead.header.number ) { diff --git a/packages/client/src/miner/pendingBlock.ts b/packages/client/src/miner/pendingBlock.ts index 0f28abe22..77d5969f2 100644 --- a/packages/client/src/miner/pendingBlock.ts +++ b/packages/client/src/miner/pendingBlock.ts @@ -361,7 +361,7 @@ export class PendingBlock { } } else if ((error as Error).message.includes('blobs missing')) { // Remove the blob tx which doesn't has blobs bundled - this.txPool.removeByHash(bytesToHex(tx.hash())) + this.txPool.removeByHash(bytesToHex(tx.hash()), tx) this.config.logger.error( `Pending: Removed from txPool a blob tx ${bytesToHex(tx.hash())} with missing blobs` ) diff --git a/packages/client/src/net/server/rlpxserver.ts b/packages/client/src/net/server/rlpxserver.ts index 3eac08ba0..c312d7761 100644 --- a/packages/client/src/net/server/rlpxserver.ts +++ b/packages/client/src/net/server/rlpxserver.ts @@ -267,14 +267,10 @@ export class RlpxServer extends Server { let peer: RlpxPeer | null = new RlpxPeer({ config: this.config, id: bytesToUnprefixedHex(rlpxPeer.getId()!), - // @ts-ignore - host: rlpxPeer._socket.remoteAddress!, - // @ts-ignore - port: rlpxPeer._socket.remotePort!, + host: rlpxPeer['_socket'].remoteAddress!, + port: rlpxPeer['_socket'].remotePort!, protocols: Array.from(this.protocols), - // @ts-ignore: Property 'server' does not exist on type 'Socket'. - // TODO: check this error - inbound: rlpxPeer._socket.server !== undefined, + inbound: (rlpxPeer['_socket'] as any).server !== undefined, }) try { await peer.accept(rlpxPeer, this) diff --git a/packages/client/src/rpc/modules/engine/CLConnectionManager.ts b/packages/client/src/rpc/modules/engine/CLConnectionManager.ts index 9bc5b81be..451f9b0da 100644 --- a/packages/client/src/rpc/modules/engine/CLConnectionManager.ts +++ b/packages/client/src/rpc/modules/engine/CLConnectionManager.ts @@ -55,7 +55,6 @@ type PayloadToPayloadStats = { } const logCLStatus = (logger: winston.Logger, logMsg: string, logLevel: logLevel) => { - //@ts-ignore logger[logLevel](enginePrefix + logMsg) } export class CLConnectionManager { diff --git a/packages/client/src/rpc/modules/engine/engine.ts b/packages/client/src/rpc/modules/engine/engine.ts index 946a43226..642774888 100644 --- a/packages/client/src/rpc/modules/engine/engine.ts +++ b/packages/client/src/rpc/modules/engine/engine.ts @@ -1026,6 +1026,21 @@ export class Engine { } } + // if the execution is stalled because it hit an invalid block which we need to hop over + if ( + this.execution.chainStatus?.status === ExecStatus.IGNORE_INVALID && + this.config.ignoreStatelessInvalidExecs !== false + ) { + // jump the vm head to failing block so that next block can be executed + this.config.logger.debug( + `Jumping the stalled vmHead forward to hash=${this.execution.chainStatus.hash} height=${this.execution.chainStatus.height} to continue the execution` + ) + await this.execution.jumpVmHead( + this.execution.chainStatus.hash, + this.execution.chainStatus.height + ) + } + // Trigger the statebuild here since we have finalized and safeblock available void this.service.buildHeadState() diff --git a/packages/client/src/rpc/modules/engine/types.ts b/packages/client/src/rpc/modules/engine/types.ts index 8d00f68c9..e7c890c27 100644 --- a/packages/client/src/rpc/modules/engine/types.ts +++ b/packages/client/src/rpc/modules/engine/types.ts @@ -2,6 +2,7 @@ import { UNKNOWN_PAYLOAD } from '../../error-code' import type { Skeleton } from '../../../service' import type { Block, ExecutionPayload } from '@ethereumjs/block' +import type { PrefixedHexString } from '@ethereumjs/util' export enum Status { ACCEPTED = 'ACCEPTED', @@ -11,14 +12,14 @@ export enum Status { VALID = 'VALID', } -export type Bytes8 = string -export type Bytes20 = string -export type Bytes32 = string +export type Bytes8 = PrefixedHexString +export type Bytes20 = PrefixedHexString +export type Bytes32 = PrefixedHexString // type Root = Bytes32 export type Blob = Bytes32 -export type Bytes48 = string -export type Uint64 = string -export type Uint256 = string +export type Bytes48 = PrefixedHexString +export type Uint64 = PrefixedHexString +export type Uint256 = PrefixedHexString type WithdrawalV1 = Exclude[number] diff --git a/packages/client/src/rpc/modules/engine/util/generic.ts b/packages/client/src/rpc/modules/engine/util/generic.ts index 13ad0fdbb..68a84688a 100644 --- a/packages/client/src/rpc/modules/engine/util/generic.ts +++ b/packages/client/src/rpc/modules/engine/util/generic.ts @@ -7,6 +7,7 @@ import { type ChainCache } from '../types' import type { Chain } from '../../../../blockchain' import type { Common } from '@ethereumjs/common' +import type { PrefixedHexString } from '@ethereumjs/util' /** * Recursively finds parent blocks starting from the parentHash. @@ -77,7 +78,7 @@ export const validHash = async ( hash: Uint8Array, chain: Chain, chainCache: ChainCache -): Promise => { +): Promise => { const { remoteBlocks, executedBlocks, invalidBlocks, skeleton } = chainCache const maxDepth = chain.config.engineParentLookupMaxDepth diff --git a/packages/client/src/rpc/modules/eth.ts b/packages/client/src/rpc/modules/eth.ts index 62dd0603b..d1477a97c 100644 --- a/packages/client/src/rpc/modules/eth.ts +++ b/packages/client/src/rpc/modules/eth.ts @@ -541,9 +541,9 @@ export class Eth { if (transaction.gasPrice === undefined && transaction.maxFeePerGas === undefined) { // If no gas price or maxFeePerGas provided, use current block base fee for gas estimates if (transaction.type !== undefined && parseInt(transaction.type) === 2) { - transaction.maxFeePerGas = '0x' + block.header.baseFeePerGas?.toString(16) + transaction.maxFeePerGas = `0x${block.header.baseFeePerGas?.toString(16)}` } else if (block.header.baseFeePerGas !== undefined) { - transaction.gasPrice = '0x' + block.header.baseFeePerGas?.toString(16) + transaction.gasPrice = `0x${block.header.baseFeePerGas?.toString(16)}` } } diff --git a/packages/client/src/rpc/modules/web3.ts b/packages/client/src/rpc/modules/web3.ts index 415de2919..74ebbae34 100644 --- a/packages/client/src/rpc/modules/web3.ts +++ b/packages/client/src/rpc/modules/web3.ts @@ -1,4 +1,4 @@ -import { bytesToHex, toBytes } from '@ethereumjs/util' +import { bytesToHex, hexToBytes, toBytes } from '@ethereumjs/util' import { keccak256 } from 'ethereum-cryptography/keccak' import { getClientVersion } from '../../util' @@ -8,6 +8,7 @@ import { middleware, validators } from '../validation' import type { EthereumClient } from '../..' import type { Chain } from '../../blockchain' import type { Service } from '../../service' +import type { PrefixedHexString } from '@ethereumjs/util' /** * web3_* RPC module @@ -43,8 +44,8 @@ export class Web3 { * Returns Keccak-256 (not the standardized SHA3-256) of the given data * @param params The data to convert into a SHA3 hash */ - sha3(params: string[]) { - const hexEncodedDigest = bytesToHex(keccak256(toBytes(params[0]))) + sha3(params: PrefixedHexString[]): PrefixedHexString { + const hexEncodedDigest = bytesToHex(keccak256(toBytes(hexToBytes(params[0])))) return hexEncodedDigest } } diff --git a/packages/client/src/rpc/types.ts b/packages/client/src/rpc/types.ts index 77ce97091..71f0f6a8f 100644 --- a/packages/client/src/rpc/types.ts +++ b/packages/client/src/rpc/types.ts @@ -1,26 +1,28 @@ +import type { PrefixedHexString } from '@ethereumjs/util' + export interface RpcTx { - from?: string - to?: string - gas?: string - gasPrice?: string - value?: string - data?: string - maxPriorityFeePerGas?: string - maxFeePerGas?: string - type?: string + from?: PrefixedHexString + to?: PrefixedHexString + gas?: PrefixedHexString + gasPrice?: PrefixedHexString + value?: PrefixedHexString + data?: PrefixedHexString + maxPriorityFeePerGas?: PrefixedHexString + maxFeePerGas?: PrefixedHexString + type?: PrefixedHexString } export interface RpcTxRes { - from: string - to?: string - gas: string - gasPrice: string - value: string - input?: string - data?: string - maxPriorityFeePerGas: string - maxFeePerGas: string - type: string + from: PrefixedHexString + to?: PrefixedHexString + gas: PrefixedHexString + gasPrice: PrefixedHexString + value: PrefixedHexString + input?: PrefixedHexString + data?: PrefixedHexString + maxPriorityFeePerGas: PrefixedHexString + maxFeePerGas: PrefixedHexString + type: PrefixedHexString } /** diff --git a/packages/client/src/service/txpool.ts b/packages/client/src/service/txpool.ts index 34fd142d9..590147d45 100644 --- a/packages/client/src/service/txpool.ts +++ b/packages/client/src/service/txpool.ts @@ -362,7 +362,21 @@ export class TxPool { add.push({ tx, added, hash }) this.pool.set(address, add) this.handled.set(hash, { address, added }) + this.txsInPool++ + + if (isLegacyTx(tx)) { + this.config.metrics?.legacyTxGauge?.inc() + } + if (isAccessListEIP2930Tx(tx)) { + this.config.metrics?.accessListEIP2930TxGauge?.inc() + } + if (isFeeMarketEIP1559Tx(tx)) { + this.config.metrics?.feeMarketEIP1559TxGauge?.inc() + } + if (isBlobEIP4844Tx(tx)) { + this.config.metrics?.blobEIP4844TxGauge?.inc() + } } catch (e) { this.handled.set(hash, { address, added, error: e as Error }) throw e @@ -391,15 +405,30 @@ export class TxPool { /** * Removes the given tx from the pool * @param txHash Hash of the transaction + * @param tx Optional, the transaction object itself can be included for collecting metrics */ - removeByHash(txHash: UnprefixedHash) { + removeByHash(txHash: UnprefixedHash, tx?: any) { const handled = this.handled.get(txHash) if (!handled) return const { address } = handled const poolObjects = this.pool.get(address) if (!poolObjects) return const newPoolObjects = poolObjects.filter((poolObj) => poolObj.hash !== txHash) + this.txsInPool-- + if (isLegacyTx(tx)) { + this.config.metrics?.legacyTxGauge?.dec() + } + if (isAccessListEIP2930Tx(tx)) { + this.config.metrics?.accessListEIP2930TxGauge?.dec() + } + if (isFeeMarketEIP1559Tx(tx)) { + this.config.metrics?.feeMarketEIP1559TxGauge?.dec() + } + if (isBlobEIP4844Tx(tx)) { + this.config.metrics?.blobEIP4844TxGauge?.dec() + } + if (newPoolObjects.length === 0) { // List of txs for address is now empty, can delete this.pool.delete(address) @@ -631,7 +660,7 @@ export class TxPool { for (const block of newBlocks) { for (const tx of block.transactions) { const txHash: UnprefixedHash = bytesToUnprefixedHex(tx.hash()) - this.removeByHash(txHash) + this.removeByHash(txHash, tx) } } } @@ -841,6 +870,12 @@ export class TxPool { this.pool.clear() this.handled.clear() this.txsInPool = 0 + if (this.config.metrics !== undefined) { + // TODO: Only clear the metrics related to the transaction pool here + for (const [_, metric] of Object.entries(this.config.metrics)) { + metric.set(0) + } + } this.opened = false } diff --git a/packages/client/src/types.ts b/packages/client/src/types.ts index e551c49e1..f455b0000 100644 --- a/packages/client/src/types.ts +++ b/packages/client/src/types.ts @@ -7,6 +7,7 @@ import type { Block, BlockHeader } from '@ethereumjs/block' import type { DefaultStateManager } from '@ethereumjs/statemanager' import type { Address } from '@ethereumjs/util' import type { Multiaddr } from 'multiaddr' +import type * as promClient from 'prom-client' /** * Types for the central event bus, emitted @@ -129,6 +130,8 @@ export interface ClientOpts { logLevelFile?: string logRotate?: boolean logMaxFiles?: number + prometheus?: boolean + prometheusPort?: number rpcDebug?: string rpcDebugVerbose?: string rpcCors?: string @@ -158,6 +161,8 @@ export interface ClientOpts { useStringValueTrieDB?: boolean txLookupLimit?: number startBlock?: number + startExecutionFrom?: number + startExecution?: boolean isSingleNode?: boolean vmProfileBlocks?: boolean vmProfileTxs?: boolean @@ -168,5 +173,13 @@ export interface ClientOpts { statelessVerkle?: boolean engineNewpayloadMaxExecute?: number skipEngineExec?: boolean + ignoreStatelessInvalidExecs?: string | boolean useJsCrypto?: boolean } + +export type PrometheusMetrics = { + legacyTxGauge: promClient.Gauge + accessListEIP2930TxGauge: promClient.Gauge + feeMarketEIP1559TxGauge: promClient.Gauge + blobEIP4844TxGauge: promClient.Gauge +} diff --git a/packages/client/src/util/metrics.ts b/packages/client/src/util/metrics.ts new file mode 100644 index 000000000..acb0102b7 --- /dev/null +++ b/packages/client/src/util/metrics.ts @@ -0,0 +1,22 @@ +import * as promClient from 'prom-client' + +export const setupMetrics = () => { + return { + legacyTxGauge: new promClient.Gauge({ + name: 'legacy_transactions_in_transaction_pool', + help: 'Number of legacy transactions in the client transaction pool', + }), + accessListEIP2930TxGauge: new promClient.Gauge({ + name: 'access_list_eip2930_transactions_in_transaction_pool', + help: 'Number of access list EIP 2930 transactions in the client transaction pool', + }), + feeMarketEIP1559TxGauge: new promClient.Gauge({ + name: 'fee_market_eip1559_transactions_in_transaction_pool', + help: 'Number of fee market EIP 1559 transactions in the client transaction pool', + }), + blobEIP4844TxGauge: new promClient.Gauge({ + name: 'blob_eip_4844_transactions_in_transaction_pool', + help: 'Number of blob EIP 4844 transactions in the client transaction pool', + }), + } +} diff --git a/packages/client/test/miner/miner.spec.ts b/packages/client/test/miner/miner.spec.ts index 5f4cbbcf3..ab4ea8425 100644 --- a/packages/client/test/miner/miner.spec.ts +++ b/packages/client/test/miner/miner.spec.ts @@ -392,17 +392,14 @@ describe('assembleBlocks() -> with saveReceipts', async () => { assert.ok(receipt, 'receipt should be saved') }) it('should save receipt', async () => { - const receipt = await receiptsManager!.getReceipts(txA01.hash()) + let receipt = await receiptsManager!.getReceipts(txA01.hash()) assert.ok(receipt, 'receipt should be saved') - it('should save receipt', async () => {}) - it('should save receipt', async () => { - const receipt = await receiptsManager!.getReceipts(txA02.hash()) - assert.ok(receipt, 'receipt should be saved') - }) - it('should save receipt', async () => { - const receipt = await receiptsManager!.getReceipts(txA03.hash()) - assert.ok(receipt, 'receipt should be saved') - }) + receipt = await receiptsManager!.getReceipts(txA02.hash()) + assert.ok(receipt, 'receipt should be saved') + + receipt = await receiptsManager!.getReceipts(txA03.hash()) + assert.ok(receipt, 'receipt should be saved') + await wait(500) }) }) diff --git a/packages/client/test/miner/pendingBlock.spec.ts b/packages/client/test/miner/pendingBlock.spec.ts index 37bc72165..4e7a444bb 100644 --- a/packages/client/test/miner/pendingBlock.spec.ts +++ b/packages/client/test/miner/pendingBlock.spec.ts @@ -16,11 +16,10 @@ import { equalsBytes, getBlobs, hexToBytes, - initKZG, randomBytes, } from '@ethereumjs/util' import { VM } from '@ethereumjs/vm' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it, vi } from 'vitest' import gethGenesis from '../../../block/test/testdata/4844-hardfork.json' @@ -56,12 +55,15 @@ common .map((hf) => { hf.timestamp = undefined }) - +const txGauge: any = { + inc: () => {}, +} const config = new Config({ common, accountCache: 10000, storageCache: 1000, logger: getLogger({ loglevel: 'debug' }), + prometheusMetrics: txGauge, }) const setup = () => { @@ -353,8 +355,7 @@ describe('[PendingBlock]', async () => { }) it('construct blob bundles', async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -366,9 +367,9 @@ describe('[PendingBlock]', async () => { const { txPool } = setup() const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const blobVersionedHashes = commitmentsToVersionedHashes(commitments) - const proofs = blobsToProofs(blobs, commitments) + const proofs = blobsToProofs(kzg, blobs, commitments) // Create 3 txs with 2 blobs each so that only 2 of them can be included in a build for (let x = 0; x <= 2; x++) { @@ -434,7 +435,7 @@ describe('[PendingBlock]', async () => { it('should exclude missingBlobTx', async () => { const gethGenesis = require('../../../block/test/testdata/4844-hardfork.json') - const kzg = await createKZG() + const kzg = await loadKZG() const common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', @@ -445,9 +446,9 @@ describe('[PendingBlock]', async () => { const { txPool } = setup() const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const blobVersionedHashes = commitmentsToVersionedHashes(commitments) - const proofs = blobsToProofs(blobs, commitments) + const proofs = blobsToProofs(kzg, blobs, commitments) // create a tx with missing blob data which should be excluded from the build const missingBlobTx = BlobEIP4844Transaction.fromTxData( diff --git a/packages/client/test/net/peer/peer.spec.ts b/packages/client/test/net/peer/peer.spec.ts index e298d7b68..147af840d 100644 --- a/packages/client/test/net/peer/peer.spec.ts +++ b/packages/client/test/net/peer/peer.spec.ts @@ -1,7 +1,12 @@ import { assert, describe, it } from 'vitest' import { Config } from '../../../src/config' -import { Peer } from '../../../src/net/peer' +import { Peer as AbstractPeer } from '../../../src/net/peer' + +// Mock peer class (can't directly use the imported Peer class as it's abstract) +class Peer extends AbstractPeer { + async connect() {} +} describe('[Peer]', () => { const config = new Config({ accountCache: 10000, storageCache: 1000 }) diff --git a/packages/client/test/net/peerpool.spec.ts b/packages/client/test/net/peerpool.spec.ts index 0fc0ca91e..b92bddb0f 100644 --- a/packages/client/test/net/peerpool.spec.ts +++ b/packages/client/test/net/peerpool.spec.ts @@ -68,7 +68,7 @@ describe('should check contains', () => { }) }) -it('should get idle peers', () => { +describe('should get idle peers', () => { // @ts-ignore const peers = [new Peer(1), new Peer(2), new Peer(3)] const config = new Config({ accountCache: 10000, storageCache: 1000 }) diff --git a/packages/client/test/net/protocol/ethprotocol.spec.ts b/packages/client/test/net/protocol/ethprotocol.spec.ts index 67bfaa031..801c08b71 100644 --- a/packages/client/test/net/protocol/ethprotocol.spec.ts +++ b/packages/client/test/net/protocol/ethprotocol.spec.ts @@ -1,7 +1,8 @@ import { Block } from '@ethereumjs/block' -import { Common, Hardfork } from '@ethereumjs/common' +import { Common, Chain as CommonChain, Hardfork } from '@ethereumjs/common' import { FeeMarketEIP1559Transaction, TransactionFactory, TransactionType } from '@ethereumjs/tx' import { Address, bigIntToBytes, bytesToBigInt, hexToBytes, randomBytes } from '@ethereumjs/util' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import { Chain } from '../../../src/blockchain/chain' @@ -114,12 +115,13 @@ describe('[EthProtocol]', () => { it('verify that PooledTransactions handler encodes correctly', async () => { const config = new Config({ - common: new Common({ chain: Config.CHAIN_DEFAULT, hardfork: Hardfork.London }), accountCache: 10000, storageCache: 1000, }) const chain = await Chain.create({ config }) const p = new EthProtocol({ config, chain }) + + chain.config.chainCommon.setHardfork(Hardfork.London) const tx = FeeMarketEIP1559Transaction.fromTxData( { maxFeePerGas: 10, @@ -201,11 +203,15 @@ describe('[EthProtocol]', () => { }) it('verify that Transactions handler encodes/decodes correctly', async () => { + const kzg = await loadKZG() const config = new Config({ common: new Common({ - chain: Config.CHAIN_DEFAULT, + chain: CommonChain.Holesky, hardfork: Hardfork.Paris, eips: [4895, 4844], + customCrypto: { + kzg, + }, }), accountCache: 10000, storageCache: 1000, @@ -214,9 +220,9 @@ describe('[EthProtocol]', () => { const chain = await Chain.create({ config }) const p = new EthProtocol({ config, chain }) - const legacyTx = TransactionFactory.fromTxData({ type: 0 }) - const eip2929Tx = TransactionFactory.fromTxData({ type: 1 }) - const eip1559Tx = TransactionFactory.fromTxData({ type: 2 }) + const legacyTx = TransactionFactory.fromTxData({ type: 0 }, { common: config.chainCommon }) + const eip2929Tx = TransactionFactory.fromTxData({ type: 1 }, { common: config.chainCommon }) + const eip1559Tx = TransactionFactory.fromTxData({ type: 2 }, { common: config.chainCommon }) const blobTx = TransactionFactory.fromTxData( { type: 3, to: Address.zero(), blobVersionedHashes: [hexToBytes('0x01' + '00'.repeat(31))] }, { common: config.chainCommon } diff --git a/packages/client/test/net/server/rlpxserver.spec.ts b/packages/client/test/net/server/rlpxserver.spec.ts index 4c68ef97b..77e21c7ad 100644 --- a/packages/client/test/net/server/rlpxserver.spec.ts +++ b/packages/client/test/net/server/rlpxserver.spec.ts @@ -159,7 +159,6 @@ describe('should return rlpx server info with ip4 as default', async () => { } ;(server as any).rlpx = { destroy: vi.fn() } - // @ts-ignore server.rlpx!.id = hexToBytes('0x' + mockId) await server.start() const nodeInfo = server.getRlpxInfo() @@ -209,7 +208,6 @@ describe('should return rlpx server info with ip6', async () => { } ;(server as any).rlpx = { destroy: vi.fn() } - // @ts-ignore server.rlpx!.id = hexToBytes('0x' + mockId) config.events.on(Event.SERVER_ERROR, (err) => { @@ -346,8 +344,6 @@ describe('should init rlpx', async () => { ;(server as any).peers.set('01', { id: '01' } as any) server.rlpx!.events.emit('peer:removed', rlpxPeer) server.rlpx!.events.emit('peer:error', rlpxPeer, new Error('err0')) - - // @ts-ignore - server.rlpx!.id = hexToBytes('0xff') + ;(server.rlpx!.id as any) = hexToBytes('0xff') server.rlpx!.events.emit('listening') }) diff --git a/packages/client/test/rpc/engine/CLConnectionManager.spec.ts b/packages/client/test/rpc/engine/CLConnectionManager.spec.ts index 04f1d3ea7..013682cc4 100644 --- a/packages/client/test/rpc/engine/CLConnectionManager.spec.ts +++ b/packages/client/test/rpc/engine/CLConnectionManager.spec.ts @@ -62,27 +62,28 @@ describe('hardfork MergeForkBlock', () => { }) }) describe('postmerge hardfork', () => { - ;(genesisJSON.config as any).mergeForkBlock = 10 - const params = parseGethGenesis(genesisJSON, 'post-merge', false) + it('starts on mergeBlock', async () => { + ;(genesisJSON.config as any).mergeForkBlock = 10 + const params = parseGethGenesis(genesisJSON, 'post-merge', false) - const common = new Common({ - chain: params.name, - customChains: [params], - }) - common.setHardforkBy({ blockNumber: 11 }) - const config = new Config({ common }) - const manager = new CLConnectionManager({ config }) + const common = new Common({ + chain: params.name, + customChains: [params], + }) + common.setHardforkBy({ blockNumber: 11 }) + const config = new Config({ common }) + const manager = new CLConnectionManager({ config }) - config.events.on(Event.CHAIN_UPDATED, () => { - it('starts on mergeBlock', () => { + config.events.on(Event.CHAIN_UPDATED, () => { assert.ok(manager.running, 'connection manager started on chain update on mergeBlock') config.events.emit(Event.CLIENT_SHUTDOWN) }) - }) - config.events.emit(Event.CHAIN_UPDATED) - config.events.on(Event.CLIENT_SHUTDOWN, () => { - it('stops on client shutdown', () => { - assert.notOk(manager.running, 'connection manager stopped on client shutdown') + + config.events.emit(Event.CHAIN_UPDATED) + config.events.on(Event.CLIENT_SHUTDOWN, () => { + it('stops on client shutdown', () => { + assert.notOk(manager.running, 'connection manager stopped on client shutdown') + }) }) }) }) @@ -105,26 +106,26 @@ describe('Status updates', async () => { manager.lastForkchoiceUpdate(update) manager.lastNewPayload(payload) }) -describe('updates stats when a new block is processed', async () => { - const config = new Config() - const manager = new CLConnectionManager({ config }) - manager.lastForkchoiceUpdate(update) - manager.lastNewPayload(payload) - const block = Block.fromBlockData({ - header: { parentHash: payload.payload.blockHash, number: payload.payload.blockNumber }, - }) - config.logger.on('data', (chunk) => { - it('received message', () => { +describe('updates stats when a new block is processed', () => { + it('received message', async () => { + const config = new Config() + const manager = new CLConnectionManager({ config }) + manager.lastForkchoiceUpdate(update) + manager.lastNewPayload(payload) + const block = Block.fromBlockData({ + header: { parentHash: payload.payload.blockHash, number: payload.payload.blockNumber }, + }) + config.logger.on('data', (chunk) => { if ((chunk.message as string).includes('Payload stats blocks count=1')) { assert.ok(true, 'received last payload stats message') manager.stop() config.logger.removeAllListeners() } }) - }) - manager.updatePayloadStats(block) - manager['lastPayloadLog']() + manager.updatePayloadStats(block) + manager['lastPayloadLog']() + }) }) describe('updates status correctly', async () => { const config = new Config() diff --git a/packages/client/test/rpc/engine/getPayloadV3.spec.ts b/packages/client/test/rpc/engine/getPayloadV3.spec.ts index 1b4618ac3..239eae103 100644 --- a/packages/client/test/rpc/engine/getPayloadV3.spec.ts +++ b/packages/client/test/rpc/engine/getPayloadV3.spec.ts @@ -10,9 +10,8 @@ import { commitmentsToVersionedHashes, getBlobs, hexToBytes, - initKZG, } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import { INVALID_PARAMS } from '../../../src/rpc/error-code.js' @@ -68,8 +67,7 @@ describe(method, () => { return this } - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const { service, server, common } = await setupChain(genesisJSON, 'post-merge', { engine: true, @@ -91,9 +89,9 @@ describe(method, () => { assert.ok(payloadId !== undefined && payloadId !== null, 'valid payloadId should be received') const txBlobs = getBlobs('hello world') - const txCommitments = blobsToCommitments(txBlobs) + const txCommitments = blobsToCommitments(kzg, txBlobs) const txVersionedHashes = commitmentsToVersionedHashes(txCommitments) - const txProofs = blobsToProofs(txBlobs, txCommitments) + const txProofs = blobsToProofs(kzg, txBlobs, txCommitments) const tx = TransactionFactory.fromTxData( { diff --git a/packages/client/test/rpc/engine/kaustinen6.spec.ts b/packages/client/test/rpc/engine/kaustinen6.spec.ts new file mode 100644 index 000000000..bd345a7b1 --- /dev/null +++ b/packages/client/test/rpc/engine/kaustinen6.spec.ts @@ -0,0 +1,231 @@ +import { Block, BlockHeader, executionPayloadFromBeaconPayload } from '@ethereumjs/block' +import { hexToBytes } from '@ethereumjs/util' +import { readFileSync } from 'fs' +import * as td from 'testdouble' +import { assert, describe, it } from 'vitest' + +import blocks from '../../testdata/blocks/kaustinen4.json' +import genesisJSON from '../../testdata/geth-genesis/kaustinen6.json' +import { getRpcClient, setupChain } from '../helpers.js' + +import type { Chain } from '../../../src/blockchain' +import type { BeaconPayloadJson } from '@ethereumjs/block' +import type { Common } from '@ethereumjs/common' +import type { HttpClient } from 'jayson/promise' +const genesisVerkleStateRoot = '0x1fbf85345a3cbba9a6d44f991b721e55620a22397c2a93ee8d5011136ac300ee' +const genesisVerkleBlockHash = '0x3fe165c03e7a77d1e3759362ebeeb16fd964cb411ce11fbe35c7032fab5b9a8a' + +/** + * One can run this test in this format: + * 1. Directly pull slots from a kaustinen beacon url + * `TEST_ONLINE_SLOTS=15 PEER_BEACON_URL=https://beacon.verkle-gen-devnet-6.ethpandaops.io DEBUG=ethjs,vm:*,evm:*,statemanager:verkle* npx vitest run test/rpc/engine/kaustinen6.spec.ts` + * + * However there are other ways to run the test with save data and testvectors but they are from old versions but + * can be updated to make it work + * + * a. On the saved blocks, comma separated (were produced for kaustinen4 ) + * `TEST_SAVED_NUMBERS=353,368,374,467 npx vitest run test/rpc/engine/kaustinen5.spec.ts` + * b. Geth produced testvectors (were produced for kaustinen5) + * `TEST_GETH_VEC_DIR=test/testdata/gethk5vecs DEBUG=ethjs,vm:*,evm:*,statemanager:verkle* npx vitest run test/rpc/engine/kaustinen6.spec.ts` + */ + +const originalValidate = (BlockHeader as any).prototype._consensusFormatValidation + +async function fetchExecutionPayload( + peerBeaconUrl: string, + slot: number | string +): Promise { + let beaconPayload: BeaconPayloadJson | undefined = undefined + try { + const beaconBlock = await (await fetch(`${peerBeaconUrl}/eth/v2/beacon/blocks/${slot}`)).json() + beaconPayload = beaconBlock.data.message.body.execution_payload + // eslint-disable-next-line no-empty + } catch (_e) {} + + return beaconPayload +} + +async function runBlock( + { chain, rpc, common }: { chain: Chain; rpc: HttpClient; common: Common }, + { execute, parent }: { execute: any; parent: any }, + isBeaconData: boolean, + context: any +) { + const blockCache = chain.blockCache + + const parentPayload = + isBeaconData === true ? executionPayloadFromBeaconPayload(parent as any) : parent + const parentBlock = await Block.fromExecutionPayload(parentPayload, { common }) + blockCache.remoteBlocks.set(parentPayload.blockHash.slice(2), parentBlock) + blockCache.executedBlocks.set(parentPayload.blockHash.slice(2), parentBlock) + + const executePayload = + isBeaconData === true ? executionPayloadFromBeaconPayload(execute as any) : execute + const res = await rpc.request('engine_newPayloadV2', [executePayload]) + + // if the block was not executed mark as skip so it shows in test + if (res.result.status === 'ACCEPTED') { + context.skip() + } + assert.equal(res.result.status, 'VALID', 'valid status should be received') +} + +describe(`valid verkle network setup`, async () => { + const { server, chain, common } = await setupChain(genesisJSON, 'post-merge', { + engine: true, + genesisStateRoot: genesisVerkleStateRoot, + }) + const rpc = getRpcClient(server) + it('genesis should be correctly setup', async () => { + const res = await rpc.request('eth_getBlockByNumber', ['0x0', false]) + + const block0 = res.result + assert.equal(block0.hash, genesisVerkleBlockHash) + assert.equal(block0.stateRoot, genesisVerkleStateRoot) + }) + + // currently it seems the the blocks can't be played one after another as it seems + // to not do clean init of the statemanager. this isn't a problem in sequential + // execution, but need to be fixed up in the stateless random execution + // TEST_SAVED_NUMBERS=353,368,374,479 + const savedTestCases = process.env.TEST_SAVED_NUMBERS?.split(',') ?? [] + + for (const testCase of savedTestCases) { + it(`run saved block ${testCase}`, async (context) => { + let testData + let isBeaconData + if (process.env.SAVED_DATA_DIR !== undefined) { + const fileName = `${process.env.SAVED_DATA_DIR}/${testCase}.json` + testData = JSON.parse(readFileSync(fileName, 'utf8'))[testCase] + isBeaconData = false + } else { + testData = blocks[testCase as keyof typeof blocks] + isBeaconData = true + } + if (testData === undefined) { + throw Error('unavailable data') + } + await runBlock({ common, chain, rpc }, testData, isBeaconData, context) + }) + } + + // we can also test online slots (not numbers because ELs don't provide witnesses + // directly, so we need to pull payload from beacon) + // TEST_ONLINE_SLOTS=345,375,368..467, + for (const numberOrRange of process.env.TEST_ONLINE_SLOTS?.split(',') ?? []) { + if (process.env.PEER_BEACON_URL === undefined) { + throw Error(`PEER_BEACON_URL env is not defined`) + } + + const rangeSplit = numberOrRange.split('..') + const startSlot = parseInt(rangeSplit[0]) + const endSlot = parseInt(rangeSplit[1] ?? rangeSplit[0]) + let parent = await fetchExecutionPayload(process.env.PEER_BEACON_URL, startSlot - 1) + for (let i = startSlot; i <= endSlot; i++) { + const execute = await fetchExecutionPayload(process.env.PEER_BEACON_URL, i) + if (execute === undefined) { + // may be there was no block on this slot + continue + } + + it(`run fetched block slot: ${i} number: ${execute.block_number}`, async (context) => { + try { + await runBlock({ common, chain, rpc }, { parent, execute }, true, context) + } finally { + parent = execute + } + }) + } + } + + if (process.env.TEST_GETH_VEC_DIR !== undefined) { + // eslint-disable-next-line @typescript-eslint/no-use-before-define + const gethVecs = await loadGethVectors(process.env.TEST_GETH_VEC_DIR, { common }) + let parent = gethVecs[0] + for (let i = 1; i < gethVecs.length; i++) { + const execute = gethVecs[i] + it(`run geth vector: ${execute.blockNumber}`, async (context) => { + await runBlock({ common, chain, rpc }, { parent, execute }, false, context) + parent = execute + }) + } + } + + it(`reset TD`, () => { + server.close() + BlockHeader.prototype['_consensusFormatValidation'] = originalValidate + td.reset() + }) +}) + +async function loadGethVectors(vectorsDirPath: string, opts: { common: Common }) { + // set chain id to 1 for geth vectors + opts.common['_chainParams'].chainId = BigInt(1) + const stateDiffVec = JSON.parse(readFileSync(`${vectorsDirPath}/statediffs.json`, 'utf8')) + const executionWitness0 = { + stateDiff: [], + verkleProof: { + commitmentsByPath: [], + d: '0x', + depthExtensionPresent: '0x', + ipaProof: { + cl: [], + cr: [], + finalEvaluation: '0x', + }, + otherStems: [], + }, + } + + const executionWitness1 = { + stateDiff: stateDiffVec[0], + verkleProof: { + commitmentsByPath: [], + d: '0x', + depthExtensionPresent: '0x', + ipaProof: { + cl: [], + cr: [], + finalEvaluation: '0x', + }, + otherStems: [], + }, + } + + const executionWitness2 = { + stateDiff: stateDiffVec[1], + verkleProof: { + commitmentsByPath: [], + d: '0x', + depthExtensionPresent: '0x', + ipaProof: { + cl: [], + cr: [], + finalEvaluation: '0x', + }, + otherStems: [], + }, + } + const block0RlpHex = readFileSync(`${vectorsDirPath}/block0.rlp.hex`, 'utf8').trim() + const block0 = Block.fromRLPSerializedBlock(hexToBytes(`0x${block0RlpHex}`), { + ...opts, + executionWitness: executionWitness0, + }) + const _block0Payload = block0.toExecutionPayload() + + const block1RlpHex = readFileSync(`${vectorsDirPath}/block1.rlp.hex`, 'utf8').trim() + const block1 = Block.fromRLPSerializedBlock(hexToBytes(`0x${block1RlpHex}`), { + ...opts, + executionWitness: executionWitness1, + }) + const block1Payload = block1.toExecutionPayload() + + const block2RlpHex = readFileSync(`${vectorsDirPath}/block2.rlp.hex`, 'utf8').trim() + const block2 = Block.fromRLPSerializedBlock(hexToBytes(`0x${block2RlpHex}`), { + ...opts, + executionWitness: executionWitness2, + }) + const block2Payload = block2.toExecutionPayload() + + return [block1Payload, block2Payload] +} diff --git a/packages/client/test/rpc/engine/newPayloadV3VersionedHashes.spec.ts b/packages/client/test/rpc/engine/newPayloadV3VersionedHashes.spec.ts index ed3ad75b1..39451b9c3 100644 --- a/packages/client/test/rpc/engine/newPayloadV3VersionedHashes.spec.ts +++ b/packages/client/test/rpc/engine/newPayloadV3VersionedHashes.spec.ts @@ -1,5 +1,4 @@ -import { initKZG } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import { INVALID_PARAMS } from '../../../src/rpc/error-code.js' @@ -15,8 +14,7 @@ const [blockData] = blocks describe(`${method}: Cancun validations`, () => { it('blobVersionedHashes', async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const { server } = await setupChain(genesisJSON, 'post-merge', { engine: true, diff --git a/packages/client/test/rpc/eth/getBalance.spec.ts b/packages/client/test/rpc/eth/getBalance.spec.ts index 64a9257bb..ac3ee5199 100644 --- a/packages/client/test/rpc/eth/getBalance.spec.ts +++ b/packages/client/test/rpc/eth/getBalance.spec.ts @@ -107,5 +107,5 @@ describe( assert.ok(res.error.message.includes('"pending" is not yet supported')) }) }, - 30000 + 40000 ) diff --git a/packages/client/test/rpc/eth/getBlockByNumber.spec.ts b/packages/client/test/rpc/eth/getBlockByNumber.spec.ts index 03badda8f..a78bfb488 100644 --- a/packages/client/test/rpc/eth/getBlockByNumber.spec.ts +++ b/packages/client/test/rpc/eth/getBlockByNumber.spec.ts @@ -1,15 +1,14 @@ import { Block } from '@ethereumjs/block' import { Common } from '@ethereumjs/common' import { BlobEIP4844Transaction, LegacyTransaction } from '@ethereumjs/tx' -import { Address, hexToBytes, initKZG } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { Address, hexToBytes } from '@ethereumjs/util' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import { INVALID_PARAMS } from '../../../src/rpc/error-code.js' import { createClient, createManager, dummy, getRpcClient, startRPC } from '../helpers.js' -const kzg = await createKZG() -initKZG(kzg) +const kzg = await loadKZG() const common = Common.custom({ chainId: 1 }, { customCrypto: { kzg } }) diff --git a/packages/client/test/rpc/eth/getFeeHistory.spec.ts b/packages/client/test/rpc/eth/getFeeHistory.spec.ts index 68be2c6b8..921524f1d 100644 --- a/packages/client/test/rpc/eth/getFeeHistory.spec.ts +++ b/packages/client/test/rpc/eth/getFeeHistory.spec.ts @@ -9,10 +9,9 @@ import { bytesToBigInt, commitmentsToVersionedHashes, getBlobs, - initKZG, } from '@ethereumjs/util' import { hexToBytes } from 'ethereum-cryptography/utils' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import genesisJSON from '../../testdata/geth-genesis/eip4844.json' @@ -121,11 +120,10 @@ const produceBlockWith4844Tx = async ( chain: Chain, blobsCount: number[] ) => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() // 4844 sample blob const sampleBlob = getBlobs('hello world') - const commitment = blobsToCommitments(sampleBlob) + const commitment = blobsToCommitments(kzg, sampleBlob) const blobVersionedHash = commitmentsToVersionedHashes(commitment) const { vm } = execution @@ -401,8 +399,7 @@ describe(method, () => { it( `${method} - Should correctly return the right blob base fees and ratios for a chain with 4844 active`, async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const { chain, execution, server } = await setupChain(genesisJSON, 'post-merge', { engine: true, hardfork: Hardfork.Cancun, diff --git a/packages/client/test/rpc/eth/getTransactionCount.spec.ts b/packages/client/test/rpc/eth/getTransactionCount.spec.ts index b75801815..946fbbd45 100644 --- a/packages/client/test/rpc/eth/getTransactionCount.spec.ts +++ b/packages/client/test/rpc/eth/getTransactionCount.spec.ts @@ -72,7 +72,7 @@ describe(method, () => { // call with nonexistent account res = await rpc.request(method, [`0x${'11'.repeat(20)}`, 'latest']) assert.equal(res.result, `0x0`, 'should return 0x0 for nonexistent account') - }, 30000) + }, 40000) it('call with unsupported block argument', async () => { const blockchain = await Blockchain.create() @@ -84,5 +84,5 @@ describe(method, () => { const res = await rpc.request(method, ['0xccfd725760a68823ff1e062f4cc97e1360e8d997', 'pending']) assert.equal(res.error.code, INVALID_PARAMS) assert.ok(res.error.message.includes('"pending" is not yet supported')) - }) + }, 40000) }) diff --git a/packages/client/test/rpc/eth/getTransactionReceipt.spec.ts b/packages/client/test/rpc/eth/getTransactionReceipt.spec.ts index 6c32b3dfb..08c6819fd 100644 --- a/packages/client/test/rpc/eth/getTransactionReceipt.spec.ts +++ b/packages/client/test/rpc/eth/getTransactionReceipt.spec.ts @@ -9,10 +9,9 @@ import { bytesToHex, commitmentsToVersionedHashes, getBlobs, - initKZG, randomBytes, } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import pow from '../../testdata/geth-genesis/pow.json' @@ -89,8 +88,7 @@ describe(method, () => { } else { const gethGenesis = require('../../../../block/test/testdata/4844-hardfork.json') - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', @@ -106,7 +104,7 @@ describe(method, () => { const rpc = getRpcClient(server) const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const blobVersionedHashes = commitmentsToVersionedHashes(commitments) const proofs = blobs.map((blob, ctx) => kzg.computeBlobKzgProof(blob, commitments[ctx])) const tx = BlobEIP4844Transaction.fromTxData( diff --git a/packages/client/test/rpc/eth/sendRawTransaction.spec.ts b/packages/client/test/rpc/eth/sendRawTransaction.spec.ts index 449099402..cf3f4cd43 100644 --- a/packages/client/test/rpc/eth/sendRawTransaction.spec.ts +++ b/packages/client/test/rpc/eth/sendRawTransaction.spec.ts @@ -13,10 +13,9 @@ import { commitmentsToVersionedHashes, getBlobs, hexToBytes, - initKZG, randomBytes, } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import { INTERNAL_ERROR, INVALID_PARAMS, PARSE_ERROR } from '../../../src/rpc/error-code.js' @@ -220,8 +219,7 @@ describe(method, () => { BlockHeader.prototype['_consensusFormatValidation'] = (): any => {} const gethGenesis = require('../../../../block/test/testdata/4844-hardfork.json') - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', @@ -235,7 +233,7 @@ describe(method, () => { syncTargetHeight: 100n, }) const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const blobVersionedHashes = commitmentsToVersionedHashes(commitments) const proofs = blobs.map((blob, ctx) => kzg.computeBlobKzgProof(blob, commitments[ctx])) const pk = randomBytes(32) diff --git a/packages/client/test/rpc/helpers.ts b/packages/client/test/rpc/helpers.ts index 1ff4c267f..5380dd137 100644 --- a/packages/client/test/rpc/helpers.ts +++ b/packages/client/test/rpc/helpers.ts @@ -99,14 +99,18 @@ export async function createClient(clientOpts: Partial = {}) { accountCache: 10000, storageCache: 1000, savePreimages: clientOpts.savePreimages, + logger: getLogger({}), }) - const blockchain = clientOpts.blockchain ?? mockBlockchain() + const blockchain = clientOpts.blockchain ?? (mockBlockchain() as unknown as Blockchain) - const chain = - // @ts-ignore TODO Move to async Chain.create() initialization - clientOpts.chain ?? new Chain({ config, blockchain: blockchain as any, genesisState }) + const chain = clientOpts.chain ?? (await Chain.create({ config, blockchain, genesisState })) chain.opened = true + // if blockchain has not been bundled with chain, add the mock blockchain + if (chain.blockchain === undefined) { + chain.blockchain = blockchain + } + const defaultClientConfig = { opened: true, ethProtocolVersions: [65], diff --git a/packages/client/test/service/fullethereumservice.spec.ts b/packages/client/test/service/fullethereumservice.spec.ts index b84f31ff3..eee2528d7 100644 --- a/packages/client/test/service/fullethereumservice.spec.ts +++ b/packages/client/test/service/fullethereumservice.spec.ts @@ -57,7 +57,6 @@ vi.mock('../../src/sync/beaconsync', () => { } }) -vi.mock('@ethereumjs/block') vi.mock('../../src/net/server') vi.mock('../../src/execution') const { FullEthereumService } = await import('../../src/service/fullethereumservice') @@ -215,6 +214,7 @@ describe('should ban peer for sending NewBlock/NewBlockHashes after merge', asyn const common = new Common({ chain: 'mainnet', hardfork: Hardfork.Paris }) const config = new Config({ common, accountCache: 10000, storageCache: 1000 }) const chain = await Chain.create({ config }) + chain.config.chainCommon.setHardfork(Hardfork.Paris) const service = new FullEthereumService({ config, chain }) service.pool.ban = () => { it('should ban peeer', () => { diff --git a/packages/client/test/service/lightethereumservice.spec.ts b/packages/client/test/service/lightethereumservice.spec.ts index fa5d3230a..663171195 100644 --- a/packages/client/test/service/lightethereumservice.spec.ts +++ b/packages/client/test/service/lightethereumservice.spec.ts @@ -80,7 +80,7 @@ describe('should open', async () => { await service.close() }) -it('should start/stop', async () => { +describe('should start/stop', async () => { const server = new RlpxServer({} as any) const config = new Config({ server, accountCache: 10000, storageCache: 1000 }) const chain = await Chain.create({ config }) diff --git a/packages/client/test/sim/4844-devnet.spec.ts b/packages/client/test/sim/4844-devnet.spec.ts index bff97ec85..7e7a3f59c 100644 --- a/packages/client/test/sim/4844-devnet.spec.ts +++ b/packages/client/test/sim/4844-devnet.spec.ts @@ -142,7 +142,7 @@ describe('sharding/eip4844 hardfork tests', async () => { done = false let block2 while (!done) { - const nextBlockNumber = `0x${(Number(block1.result.number) + 1).toString('16')}` + const nextBlockNumber = `0x${(Number(block1.result.number) + 1).toString(16)}` block2 = await client.request('eth_getBlockByNumber', [nextBlockNumber, false], 2.0) if (block2.result !== null && block2.result !== undefined) { done = true diff --git a/packages/client/test/sim/simutils.ts b/packages/client/test/sim/simutils.ts index f0dd2b22d..47443c061 100644 --- a/packages/client/test/sim/simutils.ts +++ b/packages/client/test/sim/simutils.ts @@ -13,6 +13,7 @@ import { randomBytes, } from '@ethereumjs/util' import * as fs from 'fs/promises' +import { loadKZG } from 'kzg-wasm' import { Level } from 'level' import { execSync, spawn } from 'node:child_process' import * as net from 'node:net' @@ -29,6 +30,8 @@ import type { TransactionType, TxData, TxOptions } from '@ethereumjs/tx' import type { ChildProcessWithoutNullStreams } from 'child_process' import type { Client } from 'jayson/promise' +const kzg = await loadKZG() + export const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms)) // This function switches between the native web implementation and a nodejs implementation export async function getEventSource(): Promise { @@ -315,8 +318,8 @@ export const runBlobTx = async ( opts?: TxOptions ) => { const blobs = getBlobs(bytesToHex(randomBytes(blobSize))) - const commitments = blobsToCommitments(blobs) - const proofs = blobsToProofs(blobs, commitments) + const commitments = blobsToCommitments(kzg, blobs) + const proofs = blobsToProofs(kzg, blobs, commitments) const hashes = commitmentsToVersionedHashes(commitments) const sender = Address.fromPrivateKey(pkey) @@ -385,8 +388,8 @@ export const createBlobTxs = async ( const blobSize = txMeta.blobSize ?? 2 ** 17 - 1 const blobs = getBlobs(bytesToHex(randomBytes(blobSize))) - const commitments = blobsToCommitments(blobs) - const proofs = blobsToProofs(blobs, commitments) + const commitments = blobsToCommitments(kzg, blobs) + const proofs = blobsToProofs(kzg, blobs, commitments) const hashes = commitmentsToVersionedHashes(commitments) const txns = [] diff --git a/packages/client/test/sim/snapsync.spec.ts b/packages/client/test/sim/snapsync.spec.ts index 54580a6c5..16db5149d 100644 --- a/packages/client/test/sim/snapsync.spec.ts +++ b/packages/client/test/sim/snapsync.spec.ts @@ -25,7 +25,6 @@ import { } from './simutils' import type { EthereumClient } from '../../src/client' -import type { RlpxServer } from '../../src/net/server' import type { DefaultStateManager } from '@ethereumjs/statemanager' const client = Client.http({ port: 8545 }) @@ -130,12 +129,16 @@ describe('simple mainnet test run', async () => { beaconSyncRelayer: relayer, } = // eslint-disable-next-line @typescript-eslint/no-use-before-define - (await createSnapClient(common, customGenesisState, [nodeInfo.enode], peerBeaconUrl).catch( - (e) => { - console.log(e) - return null - } - )) ?? { + (await createSnapClient( + common, + customGenesisState, + [nodeInfo.enode], + peerBeaconUrl, + '' + ).catch((e) => { + console.log(e) + return null + })) ?? { ejsInlineClient: null, peerConnectedPromise: Promise.reject('Client creation error'), beaconSyncRelayer: null, @@ -146,7 +149,7 @@ describe('simple mainnet test run', async () => { snapCompleted = snapSyncCompletedPromise assert.ok(ejsClient !== null, 'ethereumjs client started') - const enode = (ejsClient!.server('rlpx') as RlpxServer)!.getRlpxInfo().enode + const enode = ejsClient!.server()!.getRlpxInfo().enode const res = await client.request('admin_addPeer', [enode]) assert.equal(res.result, true, 'successfully requested Geth add EthereumJS as peer') @@ -176,7 +179,7 @@ describe('simple mainnet test run', async () => { // call sync if not has been called yet void ejsClient.services[0].synchronizer?.sync() await Promise.race([ - snapCompleted.then(([root, syncedStateManager]) => { + (snapCompleted as any).then(([root, syncedStateManager]: [any, any]) => { syncedSnapRoot = root stateManager = syncedStateManager }), @@ -208,13 +211,13 @@ describe('simple mainnet test run', async () => { undefined, undefined, BigInt(0), - ] - customGenesisState[sender][0] = `0x${senderBalance.toString(16)}` + ] as any + ;(customGenesisState[sender][0] as any) = `0x${senderBalance.toString(16)}` } for (const addressString of Object.keys(customGenesisState)) { const address = Address.fromString(addressString) - const account = await stateManager.getAccount(address) + const account = await stateManager?.getAccount(address) assert.equal( account?.balance, BigInt(customGenesisState[addressString][0]), diff --git a/packages/client/test/sim/txGenerator.ts b/packages/client/test/sim/txGenerator.ts index 8fab408fb..a3122f095 100644 --- a/packages/client/test/sim/txGenerator.ts +++ b/packages/client/test/sim/txGenerator.ts @@ -9,6 +9,7 @@ import { randomBytes, } from '@ethereumjs/util' import { Client } from 'jayson/promise' +import { loadKZG } from 'kzg-wasm' import type { TransactionType, TxData } from '@ethereumjs/tx' @@ -25,6 +26,8 @@ const BLOB_SIZE = BYTES_PER_FIELD_ELEMENT * FIELD_ELEMENTS_PER_BLOB const pkey = hexToBytes('0x45a915e4d060149eb4365960e6a7a45f334393093061116b197e3240065ff2d8') const sender = Address.fromPrivateKey(pkey) +const kzg = await loadKZG() + function get_padded(data: any, blobs_len: number) { const pdata = new Uint8Array(blobs_len * USEFUL_BYTES_PER_BLOB) const datalen = (data as Uint8Array).byteLength @@ -94,7 +97,7 @@ async function run(data: any) { } const blobs = get_blobs(data) - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const hashes = commitmentsToVersionedHashes(commitments) const account = Address.fromPrivateKey(randomBytes(32)) diff --git a/packages/client/test/sync/beaconsync.spec.ts b/packages/client/test/sync/beaconsync.spec.ts index 3407f6016..da7f3a7ff 100644 --- a/packages/client/test/sync/beaconsync.spec.ts +++ b/packages/client/test/sync/beaconsync.spec.ts @@ -106,18 +106,18 @@ describe('[BeaconSynchronizer]', async () => { const pool = new PeerPool() as any const chain = await Chain.create({ config }) const skeleton = new Skeleton({ chain, config, metaDB: new MemoryLevel() }) - skeleton['getSyncStatus'] = td.func() + skeleton['getSyncStatus'] = td.func<(typeof skeleton)['getSyncStatus']>() await skeleton.open() const sync = new BeaconSynchronizer({ config, pool, chain, execution, skeleton }) - sync.best = td.func() - sync.latest = td.func() + sync.best = td.func<(typeof sync)['best']>() + sync.latest = td.func<(typeof sync)['latest']>() td.when(sync.best()).thenResolve('peer') td.when(sync.latest('peer' as any)).thenResolve({ number: BigInt(2), hash: () => new Uint8Array(0), }) - td.when(ReverseBlockFetcher.prototype.fetch(), { delay: 100, times: 3 }).thenResolve(undefined) + td.when(ReverseBlockFetcher.prototype.fetch(), { delay: 100, times: 3 }).thenResolve(false) ;(skeleton as any).status.progress.subchains = [ { head: BigInt(10), tail: BigInt(6) }, { head: BigInt(4), tail: BigInt(2) }, @@ -158,17 +158,17 @@ describe('[BeaconSynchronizer]', async () => { const pool = new PeerPool() as any const chain = await Chain.create({ config }) const skeleton = new Skeleton({ chain, config, metaDB: new MemoryLevel() }) - skeleton['getSyncStatus'] = td.func() + skeleton['getSyncStatus'] = td.func<(typeof skeleton)['getSyncStatus']>() await skeleton.open() const sync = new BeaconSynchronizer({ config, pool, chain, execution, skeleton }) - sync.best = td.func() - sync.latest = td.func() + sync.best = td.func<(typeof sync)['best']>() + sync.latest = td.func<(typeof sync)['latest']>() td.when(sync.best()).thenResolve('peer') td.when(sync.latest('peer' as any)).thenResolve({ number: BigInt(2), hash: () => new Uint8Array(0), }) - td.when(ReverseBlockFetcher.prototype.fetch(), { delay: 100, times: 1 }).thenResolve(undefined) + td.when(ReverseBlockFetcher.prototype.fetch(), { delay: 100, times: 1 }).thenResolve(false) ;(skeleton as any).status.progress.subchains = [{ head: BigInt(10), tail: BigInt(6) }] ;(sync as any).chain = { // Make height > tail so that skeletonSubchainMergeMinimum is triggered diff --git a/packages/client/test/sync/fetcher/accountfetcher.spec.ts b/packages/client/test/sync/fetcher/accountfetcher.spec.ts index 3f492b9a2..507094524 100644 --- a/packages/client/test/sync/fetcher/accountfetcher.spec.ts +++ b/packages/client/test/sync/fetcher/accountfetcher.spec.ts @@ -249,7 +249,7 @@ describe('[AccountFetcher]', async () => { }) it('should verify zero-element proof correctly', async () => { - const config = new Config({ transports: [], accountCache: 10000, storageCache: 1000 }) + const config = new Config({ accountCache: 10000, storageCache: 1000 }) const pool = new PeerPool() as any const fetcher = new AccountFetcher({ config, @@ -280,7 +280,7 @@ describe('[AccountFetcher]', async () => { }) it('should reject zero-element proof if elements still remain to right of requested range', async () => { - const config = new Config({ transports: [], accountCache: 10000, storageCache: 1000 }) + const config = new Config({ accountCache: 10000, storageCache: 1000 }) const pool = new PeerPool() as any // calculate new root with a key all the way to the right of the trie diff --git a/packages/client/test/sync/fetcher/bytecodefetcher.spec.ts b/packages/client/test/sync/fetcher/bytecodefetcher.spec.ts index db9410cd3..654a77666 100644 --- a/packages/client/test/sync/fetcher/bytecodefetcher.spec.ts +++ b/packages/client/test/sync/fetcher/bytecodefetcher.spec.ts @@ -1,5 +1,4 @@ import { RLP } from '@ethereumjs/rlp' -import { Trie } from '@ethereumjs/trie' import { hexToBytes } from '@ethereumjs/util' import { utf8ToBytes } from 'ethereum-cryptography/utils' import { assert, describe, it, vi } from 'vitest' @@ -13,7 +12,6 @@ import { _accountRangeRLP } from './accountfetcher.spec' const _byteCodesRLP = '0xf89e1af89b9e60806040526004361061003f5760003560e01c806301ffc9a714610044579e60806040526004361061003f5760003560e01c806301ffc9a714610044589e60806040526004361061003f5760003560e01c806301ffc9a714610044599e60806040526004361061003f5760003560e01c806301ffc9a714610044609e60806040526004361061003f5760003560e01c806301ffc9a71461004461' -const useKeyHashing = true describe('[ByteCodeFetcher]', async () => { class PeerPool { @@ -31,7 +29,6 @@ describe('[ByteCodeFetcher]', async () => { const fetcher = new ByteCodeFetcher({ config, pool, - trie: new Trie({ useKeyHashing }), hashes: [hexToBytes('0x2034f79e0e33b0ae6bef948532021baceb116adf2616478703bec6b17329f1cc')], }) fetcher.next = () => false @@ -60,7 +57,6 @@ describe('[ByteCodeFetcher]', async () => { const fetcher = new ByteCodeFetcher({ config, pool, - trie: new Trie({ useKeyHashing }), hashes: [], }) @@ -88,7 +84,6 @@ describe('[ByteCodeFetcher]', async () => { const fetcher = new ByteCodeFetcher({ config, pool, - trie: new Trie({ useKeyHashing }), hashes: [], }) const ByteCodeResponse: any = [utf8ToBytes(''), utf8ToBytes('')] @@ -117,7 +112,6 @@ describe('[ByteCodeFetcher]', async () => { const fetcher = new ByteCodeFetcher({ config, pool, - trie: new Trie({ useKeyHashing }), hashes: [], }) @@ -169,7 +163,6 @@ describe('[ByteCodeFetcher]', async () => { const fetcher = new ByteCodeFetcher({ config, pool, - trie: new Trie({ useKeyHashing }), hashes: [utf8ToBytes('')], }) assert.equal(fetcher.peer(), 'peer0' as any, 'found peer') diff --git a/packages/client/test/sync/fetcher/fetcher.spec.ts b/packages/client/test/sync/fetcher/fetcher.spec.ts index b66186e16..4081f46fb 100644 --- a/packages/client/test/sync/fetcher/fetcher.spec.ts +++ b/packages/client/test/sync/fetcher/fetcher.spec.ts @@ -1,5 +1,5 @@ import * as td from 'testdouble' -import { assert, describe, it } from 'vitest' +import { assert, describe, it, vi } from 'vitest' import { Config } from '../../../src/config' import { Fetcher } from '../../../src/sync/fetcher/fetcher' @@ -12,7 +12,8 @@ class FetcherTest extends Fetcher { return res } async request(_job: any, _peer: any) { - return + console.trace(_job) + return _job } async store(_store: any) {} // Just return any via _error @@ -51,36 +52,41 @@ it('should handle failure', () => { }) describe('should handle expiration', async () => { - const config = new Config({ accountCache: 10000, storageCache: 1000 }) - const fetcher = new FetcherTest({ - config, - pool: td.object(), - timeout: 5, - }) - const job = { index: 0 } - const peer = { idle: true } - fetcher.peer = td.func() - fetcher.request = td.func() - td.when(fetcher.peer()).thenReturn(peer) - td.when(fetcher.request(td.matchers.anything(), { idle: false }), { delay: 10 }).thenReject( - new Error('err0') - ) - td.when(fetcher['pool'].contains({ idle: false } as any)).thenReturn(true) - fetcher['in'].insert(job as any) - fetcher['_readableState'] = [] - fetcher['running'] = true - fetcher['total'] = 10 - fetcher.next() - await new Promise((resolve) => { - setTimeout(resolve, 10) - }) - it('should expire', () => { + it('should expire', async () => { + const config = new Config({ accountCache: 10000, storageCache: 1000 }) + const fetcher = new FetcherTest({ + config, + pool: { + contains(peer: any) { + if (peer.idle === false) return true + return false + }, + ban: vi.fn(), + } as any, + timeout: 5, + }) + const job = { index: 0 } + const peer = { idle: true } + fetcher.peer = vi.fn().mockReturnValue(() => peer) + fetcher.request = vi.fn().mockImplementationOnce(async (job, peer) => { + await new Promise((resolve) => { + setTimeout(resolve, 1000) + }) + if (peer.idle === false) throw new Error('err0') + return + }) + + fetcher['in'].insert(job as any) + fetcher['_readableState'] = [] + fetcher['running'] = true + fetcher['total'] = 10 + fetcher.next() + await new Promise((resolve) => { + setTimeout(resolve, 10) + }) + assert.equal((fetcher as any).in.length, 1, 'enqueued job') - assert.deepEqual( - job as any, - { index: 0, peer: { idle: false }, state: 'expired' }, - 'expired job' - ) + assert.deepEqual((job as any).state, 'expired', 'expired job') }) }) diff --git a/packages/client/test/sync/fetcher/headerfetcher.spec.ts b/packages/client/test/sync/fetcher/headerfetcher.spec.ts index 9e08f4782..efbfb0c23 100644 --- a/packages/client/test/sync/fetcher/headerfetcher.spec.ts +++ b/packages/client/test/sync/fetcher/headerfetcher.spec.ts @@ -23,12 +23,13 @@ describe('[HeaderFetcher]', async () => { const fetcher = new HeaderFetcher({ config, pool, flow }) const headers = [{ number: 1 }, { number: 2 }] assert.deepEqual( - //@ts-ignore - fetcher.process({ task: { count: 2 }, peer: 'peer0' }, { headers, bv: BigInt(1) }), + fetcher.process( + { task: { count: 2 }, peer: 'peer0' } as any, + { headers, bv: BigInt(1) } as any + ), headers as any, 'got results' ) - //@ts-ignore assert.notOk( fetcher.process({ task: { count: 2 } } as any, { headers: [], bv: BigInt(1) } as any), 'bad results' diff --git a/packages/client/test/sync/fetcher/storagefetcher.spec.ts b/packages/client/test/sync/fetcher/storagefetcher.spec.ts index 911ca8a24..6c344d34a 100644 --- a/packages/client/test/sync/fetcher/storagefetcher.spec.ts +++ b/packages/client/test/sync/fetcher/storagefetcher.spec.ts @@ -16,6 +16,8 @@ import { _zeroElementProofRoot, } from './accountfetcher.spec' +import type { StorageFetcherOptions } from '../../../src/sync/fetcher/storagefetcher' + const _storageRangesRLP = '0xf83e0bf83af838f7a0290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5639594053cd080a26cb03d5e6d2956cebb31c56e7660cac0' @@ -52,7 +54,7 @@ describe('[StorageFetcher]', async () => { count: BigInt(2) ** BigInt(256) - BigInt(1), }, ], - }) + } as StorageFetcherOptions) fetcher.next = () => false assert.notOk((fetcher as any).running, 'not started') assert.equal((fetcher as any).in.length, 0, 'No jobs have yet been added') @@ -91,7 +93,7 @@ describe('[StorageFetcher]', async () => { root: utf8ToBytes(''), first: BigInt(1), count: BigInt(10), - }) + } as StorageFetcherOptions) const fullResult: any = [ [ [{ hash: utf8ToBytes(''), body: utf8ToBytes('') }], @@ -120,7 +122,7 @@ describe('[StorageFetcher]', async () => { ], } ;(fetcher as any).running = true - fetcher.enqueueTask(task) + fetcher.enqueueTask(task as any) const job = (fetcher as any).in.peek() assert.deepEqual( (fetcher.process(job, StorageDataResponse) as any)[0], @@ -139,7 +141,7 @@ describe('[StorageFetcher]', async () => { root: utf8ToBytes(''), first: BigInt(1), count: BigInt(10), - }) + } as StorageFetcherOptions) const accountHashString = '0xe9a5016cb1a53dbc750d06e725514ac164231d71853cafdcbff42f5adb6ca6f1' const highestReceivedhash = '10' @@ -177,8 +179,6 @@ describe('[StorageFetcher]', async () => { JSON.stringify(utf8ToBytes(highestReceivedhash)), 'should set new highest known hash' ) - - // @ts-ignore ;(job.task.storageRequests[0] as any).first = BigInt(3) ;(job.task.storageRequests[0] as any).count = BigInt(4) const result = (await fetcher.request(job as any)) as any @@ -203,7 +203,7 @@ describe('[StorageFetcher]', async () => { config, pool, root: utf8ToBytes(''), - }) + } as StorageFetcherOptions) const StorageDataResponse: any = [ [ [{ hash: utf8ToBytes(''), body: utf8ToBytes('') }], @@ -226,7 +226,7 @@ describe('[StorageFetcher]', async () => { ], } ;(fetcher as any).running = true - fetcher.enqueueTask(task) + fetcher.enqueueTask(task as any) const job = (fetcher as any).in.peek() let results = fetcher.process(job as any, StorageDataResponse) assert.equal((fetcher as any).in.length, 1, 'Fetcher should still have same job') @@ -253,7 +253,7 @@ describe('[StorageFetcher]', async () => { config, pool, root: utf8ToBytes(''), - }) + } as StorageFetcherOptions) const partialResult: any = [ [ [{ hash: utf8ToBytes(''), body: utf8ToBytes('') }], @@ -319,13 +319,13 @@ describe('[StorageFetcher]', async () => { }) it('should verify zero-element proof correctly', async () => { - const config = new Config({ transports: [], accountCache: 10000, storageCache: 1000 }) + const config = new Config({ accountCache: 10000, storageCache: 1000 }) const pool = new PeerPool() as any const fetcher = new StorageFetcher({ config, pool, root: _zeroElementProofRoot, - }) + } as StorageFetcherOptions) const task = { storageRequests: [ { @@ -356,7 +356,7 @@ describe('[StorageFetcher]', async () => { }) it('should reject zero-element proof if elements still remain to right of requested range', async () => { - const config = new Config({ transports: [], accountCache: 10000, storageCache: 1000 }) + const config = new Config({ accountCache: 10000, storageCache: 1000 }) const pool = new PeerPool() as any // calculate new root with a key all the way to the right of the trie @@ -368,7 +368,7 @@ describe('[StorageFetcher]', async () => { config, pool, root: _zeroElementProofRoot, - }) + } as StorageFetcherOptions) const task = { storageRequests: [ { @@ -407,7 +407,7 @@ describe('[StorageFetcher]', async () => { config, pool, root: utf8ToBytes(''), - }) + } as StorageFetcherOptions) const partialResult: any = [ [ [{ hash: utf8ToBytes(''), body: utf8ToBytes('') }], @@ -508,7 +508,7 @@ describe('[StorageFetcher]', async () => { root: utf8ToBytes(''), first: BigInt(1), count: BigInt(10), - }) + } as StorageFetcherOptions) ;(fetcher as any).pool.idle = vi.fn(() => 'peer0') assert.equal(fetcher.peer(), 'peer0' as any, 'found peer') }) diff --git a/packages/client/test/sync/lightsync.spec.ts b/packages/client/test/sync/lightsync.spec.ts index b4bbd5a5e..e04eee71f 100644 --- a/packages/client/test/sync/lightsync.spec.ts +++ b/packages/client/test/sync/lightsync.spec.ts @@ -71,8 +71,8 @@ describe('[LightSynchronizer]', async () => { pool, chain, }) - sync.best = td.func() - sync.latest = td.func() + sync.best = td.func<(typeof sync)['best']>() + sync.latest = td.func<(typeof sync)['latest']>() td.when(sync.best()).thenResolve({ les: { status: { headNum: BigInt(2) } } } as any) td.when(sync.latest(td.matchers.anything())).thenResolve({ number: BigInt(2), @@ -108,8 +108,8 @@ describe('sync errors', async () => { pool, chain, }) - sync.best = td.func() - sync.latest = td.func() + sync.best = td.func<(typeof sync)['best']>() + sync.latest = td.func<(typeof sync)['latest']>() td.when(sync.best()).thenResolve({ les: { status: { headNum: BigInt(2) } } } as any) td.when(sync.latest(td.matchers.anything())).thenResolve({ number: BigInt(2), @@ -131,47 +131,48 @@ describe('sync errors', async () => { }) await sync.sync() }) -describe('import headers', async () => { - td.reset() - HeaderFetcher.prototype.fetch = td.func() - HeaderFetcher.prototype.clear = td.func() - HeaderFetcher.prototype.destroy = td.func() - vi.mock('../../src/sync/fetcher/headerfetcher', () => td.object()) - const { LightSynchronizer } = await import('../../src/sync/lightsync') - const config = new Config({ - accountCache: 10000, - storageCache: 1000, - safeReorgDistance: 0, - }) - const pool = new PeerPool() as any - const chain = await Chain.create({ config }) - const sync = new LightSynchronizer({ - config, - interval: 1, - pool, - chain, - }) - sync.best = td.func() - sync.latest = td.func() - td.when(sync.best()).thenResolve({ les: { status: { headNum: BigInt(2) } } } as any) - td.when(sync.latest(td.matchers.anything())).thenResolve({ - number: BigInt(2), - hash: () => new Uint8Array(0), - }) - td.when(HeaderFetcher.prototype.fetch()).thenResolve(true) - td.when(HeaderFetcher.prototype.fetch()).thenDo(() => - config.events.emit(Event.SYNC_FETCHED_HEADERS, [BlockHeader.fromHeaderData({})]) - ) - config.logger.on('data', async (data) => { - if ((data.message as string).includes('Imported headers count=1')) { - it('should import header', async () => { +describe('import headers', () => { + it('should import header', async () => { + td.reset() + HeaderFetcher.prototype.fetch = td.func() + HeaderFetcher.prototype.clear = td.func() + HeaderFetcher.prototype.destroy = td.func() + vi.mock('../../src/sync/fetcher/headerfetcher', () => td.object()) + const { LightSynchronizer } = await import('../../src/sync/lightsync') + const config = new Config({ + accountCache: 10000, + storageCache: 1000, + safeReorgDistance: 0, + }) + const pool = new PeerPool() as any + const chain = await Chain.create({ config }) + const sync = new LightSynchronizer({ + config, + interval: 1, + pool, + chain, + }) + sync.best = td.func<(typeof sync)['best']>() + sync.latest = td.func<(typeof sync)['latest']>() + td.when(sync.best()).thenResolve({ les: { status: { headNum: BigInt(2) } } } as any) + td.when(sync.latest(td.matchers.anything())).thenResolve({ + number: BigInt(2), + hash: () => new Uint8Array(0), + }) + td.when(HeaderFetcher.prototype.fetch()).thenResolve(true) + td.when(HeaderFetcher.prototype.fetch()).thenDo(() => + config.events.emit(Event.SYNC_FETCHED_HEADERS, [BlockHeader.fromHeaderData({})]) + ) + config.logger.on('data', async (data) => { + if ((data.message as string).includes('Imported headers count=1')) { assert.ok(true, 'successfully imported new header') config.logger.removeAllListeners() await sync.stop() await sync.close() vi.unmock('../../src/sync/fetcher/headerfetcher') - }) - } + } + }) + + await sync.sync() }) - await sync.sync() }) diff --git a/packages/client/test/sync/skeleton.spec.ts b/packages/client/test/sync/skeleton.spec.ts index b23a6994e..89f51c6d1 100644 --- a/packages/client/test/sync/skeleton.spec.ts +++ b/packages/client/test/sync/skeleton.spec.ts @@ -238,16 +238,16 @@ describe('[Skeleton] / initSync', async () => { await skeleton.open() for (const block of testCase.blocks ?? []) { - await (skeleton as any).putBlock(block) + await skeleton['putBlock'](block) } if (testCase.oldState) { - ;(skeleton as any).status.progress.subchains = testCase.oldState + skeleton['status'].progress.subchains = testCase.oldState as any } await skeleton.initSync(testCase.head) - const { progress } = (skeleton as any).status + const { progress } = skeleton['status'] if (progress.subchains.length !== testCase.newState.length) { assert.fail( `test ${testCaseIndex}: subchain count mismatch: have ${progress.subchains.length}, want ${testCase.newState.length}` @@ -354,7 +354,7 @@ describe('[Skeleton] / setHead', async () => { const skeleton = new Skeleton({ chain, config, metaDB: new MemoryLevel() }) await skeleton.open() for (const block of testCase.blocks ?? []) { - await (skeleton as any).putBlock(block) + await skeleton['putBlock'](block) } await skeleton.initSync(testCase.head) @@ -379,7 +379,7 @@ describe('[Skeleton] / setHead', async () => { } } - const { progress } = (skeleton as any).status + const { progress } = skeleton['status'] if (progress.subchains.length !== testCase.newState.length) { assert.fail( `test ${testCaseIndex}: subchain count mismatch: have ${progress.subchains.length}, want ${testCase.newState.length}` @@ -459,12 +459,12 @@ describe('[Skeleton] / setHead', async () => { assert.equal(reorg, false, 'should not reorg on genesis setHead') assert.equal( - (skeleton as any).status.progress.subchains.length, + skeleton['status'].progress.subchains.length, 1, 'trivial subchain0 should have been created' ) assert.equal( - (skeleton as any).status.progress.subchains[0]!.head, + skeleton['status'].progress.subchains[0]!.head, BigInt(0), 'trivial subchain0 should have been created' ) @@ -480,12 +480,12 @@ describe('[Skeleton] / setHead', async () => { reorg = await skeleton.setHead(block1, false) assert.equal(reorg, false, 'should not reorg on valid first block') assert.equal( - (skeleton as any).status.progress.subchains.length, + skeleton['status'].progress.subchains.length, 1, 'trivial subchain should have been created' ) assert.equal( - (skeleton as any).status.progress.subchains[0]!.head, + skeleton['status'].progress.subchains[0]!.head, BigInt(0), 'trivial subchain0 should have been created' ) @@ -493,12 +493,12 @@ describe('[Skeleton] / setHead', async () => { reorg = await skeleton.setHead(block1, true) assert.equal(reorg, false, 'should not reorg on valid first block') assert.equal( - (skeleton as any).status.progress.subchains.length, + skeleton['status'].progress.subchains.length, 1, 'subchain should have been created' ) assert.equal( - (skeleton as any).status.progress.subchains[0].head, + skeleton['status'].progress.subchains[0].head, BigInt(1), 'head should be set to first block' ) @@ -506,9 +506,9 @@ describe('[Skeleton] / setHead', async () => { reorg = await skeleton.setHead(block2, true) assert.equal(reorg, false, 'should not reorg on valid second block') - assert.equal((skeleton as any).status.progress.subchains.length, 1, 'subchain should be same') + assert.equal(skeleton['status'].progress.subchains.length, 1, 'subchain should be same') assert.equal( - (skeleton as any).status.progress.subchains[0].head, + skeleton['status'].progress.subchains[0].head, BigInt(2), 'head should be set to first block' ) @@ -517,9 +517,9 @@ describe('[Skeleton] / setHead', async () => { reorg = await skeleton.setHead(block3, false) assert.equal(reorg, true, 'should not extend on invalid third block') // since its not a forced update so shouldn't affect subchain status - assert.equal((skeleton as any).status.progress.subchains.length, 1, 'subchain should be same') + assert.equal(skeleton['status'].progress.subchains.length, 1, 'subchain should be same') assert.equal( - (skeleton as any).status.progress.subchains[0].head, + skeleton['status'].progress.subchains[0].head, BigInt(2), 'head should be set to second block' ) @@ -528,13 +528,9 @@ describe('[Skeleton] / setHead', async () => { reorg = await skeleton.setHead(block3, true) assert.equal(reorg, true, 'should not extend on invalid third block') // since its not a forced update so shouldn't affect subchain status + assert.equal(skeleton['status'].progress.subchains.length, 2, 'new subchain should be created') assert.equal( - (skeleton as any).status.progress.subchains.length, - 2, - 'new subchain should be created' - ) - assert.equal( - (skeleton as any).status.progress.subchains[0].head, + skeleton['status'].progress.subchains[0].head, BigInt(3), 'head should be set to third block' ) @@ -600,7 +596,7 @@ describe('[Skeleton] / setHead', async () => { ) // unlink the skeleton for the below check to check all blocks cleared - skeleton.status.linked = false + skeleton['status'].linked = false for (const block of [block1, block2, block3, block4, block5]) { assert.equal( (await skeleton.getBlock(block.header.number, true))?.hash(), @@ -678,8 +674,8 @@ describe('[Skeleton] / setHead', async () => { ) // unlink the skeleton for the below check to check all blocks cleared - const prevLinked = skeleton.status.linked - skeleton.status.linked = false + const prevLinked = skeleton['status'].linked + skeleton['status'].linked = false for (const block of [block3, block4, block5]) { assert.equal( (await skeleton.getBlock(block.header.number, true))?.hash(), @@ -695,7 +691,7 @@ describe('[Skeleton] / setHead', async () => { ) } // restore linkedStatus - skeleton.status.linked = prevLinked + skeleton['status'].linked = prevLinked const block41 = Block.fromBlockData( { header: { number: 4, parentHash: block3.hash(), difficulty: 101 } }, @@ -715,13 +711,17 @@ describe('[Skeleton] / setHead', async () => { // should link the chains including the 41, 51 block backfilled from the unfinalized await skeleton.forkchoiceUpdate(block61) - assert.equal(skeleton.status.progress.subchains[0]?.head, BigInt(6), 'head should be correct') assert.equal( - skeleton.status.progress.subchains[0]?.tail, + skeleton['status'].progress.subchains[0]?.head, + BigInt(6), + 'head should be correct' + ) + assert.equal( + skeleton['status'].progress.subchains[0]?.tail, BigInt(4), 'tail should be backfilled' ) - assert.equal(skeleton.status.linked, true, 'should be linked') + assert.equal(skeleton['status'].linked, true, 'should be linked') assert.equal(chain.blocks.height, BigInt(6), 'all blocks should be in chain') const block71 = Block.fromBlockData( @@ -739,10 +739,14 @@ describe('[Skeleton] / setHead', async () => { // lets jump ahead and add the block 81 and 71 with annoucements and trigger tryTailBackfill await skeleton.forkchoiceUpdate(block91) - assert.equal(skeleton.status.progress.subchains.length, 1, '1 subchain with older dropped') - assert.equal(skeleton.status.progress.subchains[0]?.head, BigInt(9), 'head should be correct') + assert.equal(skeleton['status'].progress.subchains.length, 1, '1 subchain with older dropped') assert.equal( - skeleton.status.progress.subchains[0]?.tail, + skeleton['status'].progress.subchains[0]?.head, + BigInt(9), + 'head should be correct' + ) + assert.equal( + skeleton['status'].progress.subchains[0]?.tail, BigInt(9), 'new subchain should be created' ) @@ -750,13 +754,17 @@ describe('[Skeleton] / setHead', async () => { await skeleton.setHead(block71, false) await skeleton.tryTailBackfill() - assert.equal(skeleton.status.progress.subchains[0]?.head, BigInt(9), 'head should be correct') assert.equal( - skeleton.status.progress.subchains[0]?.tail, + skeleton['status'].progress.subchains[0]?.head, + BigInt(9), + 'head should be correct' + ) + assert.equal( + skeleton['status'].progress.subchains[0]?.tail, BigInt(7), 'tail should be backfilled' ) - assert.equal(skeleton.status.linked, true, 'should be linked') + assert.equal(skeleton['status'].linked, true, 'should be linked') // async wait needed here so the async fillCanonicalChain can fill the chain await wait(50) assert.equal(chain.blocks.height, BigInt(9), 'all blocks should be in chain') @@ -778,12 +786,12 @@ describe('[Skeleton] / setHead', async () => { await skeleton.forkchoiceUpdate(block92) assert.equal( - skeleton.status.progress.subchains[0]?.head, + skeleton['status'].progress.subchains[0]?.head, BigInt(9), 'head number should be same' ) assert.equal( - skeleton.status.progress.subchains[0]?.tail, + skeleton['status'].progress.subchains[0]?.tail, BigInt(9), 'tail should be truncated to head' ) @@ -962,7 +970,7 @@ describe('[Skeleton] / setHead', async () => { 'canonical height should stop at block 2 (valid terminal block), since block 3 is invalid (past ttd)' ) assert.equal( - (skeleton as any).status.progress.subchains[0].tail, + skeleton['status'].progress.subchains[0].tail, BigInt(1), `Subchain should have been backstepped to 1` ) diff --git a/packages/client/test/sync/snapsync.spec.ts b/packages/client/test/sync/snapsync.spec.ts index 0448d0ba6..2b5077ff1 100644 --- a/packages/client/test/sync/snapsync.spec.ts +++ b/packages/client/test/sync/snapsync.spec.ts @@ -45,7 +45,7 @@ describe('[SnapSynchronizer]', async () => { const config = new Config({ accountCache: 10000, storageCache: 1000 }) const pool = new PeerPool() as any const chain = await Chain.create({ config }) - const sync = new SnapSynchronizer({ config, pool, chain }) + const sync = new SnapSynchronizer({ config, pool, chain } as any) assert.equal(sync.type, 'snap', 'snap type') }) @@ -53,7 +53,7 @@ describe('[SnapSynchronizer]', async () => { const config = new Config({ accountCache: 10000, storageCache: 1000 }) const pool = new PeerPool() as any const chain = await Chain.create({ config }) - const sync = new SnapSynchronizer({ config, pool, chain }) + const sync = new SnapSynchronizer({ config, pool, chain } as any) ;(sync as any).pool.open = vi.fn().mockResolvedValue(null) ;(sync as any).pool.peers = [] await sync.open() @@ -70,7 +70,7 @@ describe('[SnapSynchronizer]', async () => { interval: 1, pool, chain, - }) + } as any) ;(sync as any).chain = { blocks: { height: 1 } } const getBlockHeaders1 = vi .fn() diff --git a/packages/client/test/sync/txpool.spec.ts b/packages/client/test/sync/txpool.spec.ts index 9fba7e27a..7cbe880a9 100644 --- a/packages/client/test/sync/txpool.spec.ts +++ b/packages/client/test/sync/txpool.spec.ts @@ -10,6 +10,9 @@ import { hexToBytes, privateToAddress, } from '@ethereumjs/util' +import * as http from 'http' +import * as promClient from 'prom-client' +import * as url from 'url' import { assert, describe, it } from 'vitest' import { Config } from '../../src/config' @@ -17,12 +20,11 @@ import { getLogger } from '../../src/logging' import { PeerPool } from '../../src/net/peerpool' import { TxPool } from '../../src/service/txpool' +import type { PrometheusMetrics } from '../../src/types' + +let prometheusMetrics: PrometheusMetrics | undefined + const setup = () => { - const config = new Config({ - accountCache: 10000, - storageCache: 1000, - logger: getLogger({ loglevel: 'info' }), - }) const service: any = { chain: { headers: { height: BigInt(0) }, @@ -38,8 +40,64 @@ const setup = () => { }, }, } + let metricsServer + + if (prometheusMetrics === undefined) { + prometheusMetrics = { + legacyTxGauge: new promClient.Gauge({ + name: 'legacy_transactions_in_transaction_pool', + help: 'Number of legacy transactions in the client transaction pool', + }), + accessListEIP2930TxGauge: new promClient.Gauge({ + name: 'access_list_eip2930_transactions_in_transaction_pool', + help: 'Number of access list EIP 2930 transactions in the client transaction pool', + }), + feeMarketEIP1559TxGauge: new promClient.Gauge({ + name: 'fee_market_eip1559_transactions_in_transaction_pool', + help: 'Number of fee market EIP 1559 transactions in the client transaction pool', + }), + blobEIP4844TxGauge: new promClient.Gauge({ + name: 'blob_eip_4844_transactions_in_transaction_pool', + help: 'Number of blob EIP 4844 transactions in the client transaction pool', + }), + } + + const register = new promClient.Registry() + register.setDefaultLabels({ + app: 'ethereumjs-client', + }) + promClient.collectDefaultMetrics({ register }) + for (const [_, metric] of Object.entries(prometheusMetrics)) { + register.registerMetric(metric) + } + + metricsServer = http.createServer(async (req, res) => { + if (req.url === undefined) { + res.statusCode = 400 + res.end('Bad Request: URL is missing') + return + } + const reqUrl = new url.URL(req.url, `http://${req.headers.host}`) + const route = reqUrl.pathname + + if (route === '/metrics') { + // Return all metrics in the Prometheus exposition format + res.setHeader('Content-Type', register.contentType) + res.end(await register.metrics()) + } + }) + // Start the HTTP server which exposes the metrics on http://localhost:8080/metrics + metricsServer.listen(8080) + } + + const config = new Config({ + prometheusMetrics, + accountCache: 10000, + storageCache: 1000, + logger: getLogger({ loglevel: 'info' }), + }) const pool = new TxPool({ config, service }) - return { pool } + return { pool, metricsServer } } const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }) @@ -158,7 +216,7 @@ describe('[TxPool]', async () => { it('announcedTxHashes() -> add single tx / knownByPeer / getByHash()', async () => { // Safeguard that send() method from peer2 gets called - const { pool } = setup() + const { pool, metricsServer } = setup() pool.open() pool.start() @@ -221,6 +279,24 @@ describe('[TxPool]', async () => { 'should get correct tx by hash' ) + // check if transaction added in metrics + let feeMarketEip1559TransactionCountInPool = undefined + const response = await fetch('http://localhost:8080/metrics') + const pattern = /^fee_market_eip1559_transactions_in_transaction_pool/ + const textLines = (await response.text()).split('\n') + + for (const line of textLines) { + if (pattern.test(line)) { + feeMarketEip1559TransactionCountInPool = parseInt(line.split(' ')[1]) + } + } + + assert.equal( + feeMarketEip1559TransactionCountInPool, + pool.pool.size, + 'pool should contain single eip 1559 transaction' + ) + pool.pool.clear() await pool.handleAnnouncedTxHashes([txA01.hash()], peer, peerPool) assert.equal(pool.pool.size, 0, 'should not add a once handled tx') @@ -237,6 +313,7 @@ describe('[TxPool]', async () => { pool.stop() pool.close() + metricsServer?.close() }) it('announcedTxHashes() -> TX_RETRIEVAL_LIMIT', async () => { diff --git a/packages/client/test/testdata/blocks/kaustinen4.json b/packages/client/test/testdata/blocks/kaustinen4.json new file mode 100644 index 000000000..7e44bdc28 --- /dev/null +++ b/packages/client/test/testdata/blocks/kaustinen4.json @@ -0,0 +1,1932 @@ +{ + "353": { + "parent": { + "parent_hash": "0x8a84f5c1d79544fd589b2c77643ddd12ce0f3a88f16d2b5e7f8b3827160abff5", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x0934f2a29e91581002a8a44685830b15aedb2561b207fdfc523ff818bf9c9f54", + "receipts_root": "0xd95b673818fa493deec414e01e610d97ee287c9421c8eff4102b1647c1a184e4", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0xccf5df6161112a1bc7060cb6e546fb98163d37f6922a99c35ac5ed7e4b21b97f", + "block_number": "352", + "gas_limit": "30000000", + "gas_used": "42000", + "timestamp": "1707219624", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x0a531f8887cc2a64635edd86a2ba83a1db738b9cb66d825554c3da4dcf723a5a", + "transactions": [ + "0xf86d80843b9aca0782f618946177843db3138ae69679a54b95cf345ed759450d870aa87bee5380008083021e7ba0a0efcf44d6c6025e6b609ff3fc3f6a4b6c08902a476649336b2e9848906f68e8a00867d25e4e7cea87f35b17fe240dffac002eb96f77b0ab6aad7733eb483e8ed4", + "0xf86d01843b9aca0782f61894687704db07e902e9a8b3754031d168d46e3d586e870aa87bee5380008083021e7ba06e3af64adb54ae61dd9f4b246324afd13d311554d732c9a816fde0a1fea002cca07c064b396cee9b011535438a85c8b6021db653be84621aaef501a28d32934da9" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "1", + "currentValue": null, + "newValue": "0x008053ee7ba80a00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "95", + "currentValue": null, + "newValue": "0x8a84f5c1d79544fd589b2c77643ddd12ce0f3a88f16d2b5e7f8b3827160abff5" + } + ] + }, + { + "stem": "0x714a8e6f30f0dd821d0eb4064e1b3f96721f60a7fb8c369e36af3299259343", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x000000e83c80d09f3c2e3b030000000000000000000000000000000000000000", + "newValue": "0x90e33f281209bb9f3c2e3b030000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0200000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "1", + "currentValue": null, + "newValue": "0x00a014e332260000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "1", + "currentValue": null, + "newValue": "0x008053ee7ba80a00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": ["0x8d1ed2380e53baf4d77bdb0adaeec334d72569de8e12d371ab2e4d6b131a37"], + "depthExtensionPresent": "0x08120a0910", + "commitmentsByPath": [ + "0x311ffc868fa6132c6bdaf545b74303cf1256780a8cf0bb64ad6a85fce9a2a789", + "0x106aebfb6686fd2d3540c4ffedcc6b6c51d3097b07c75a9ec094f3bfba64d9e4", + "0x0c353f860bf92fcca4e0bfea40de9863bbf7e5b713f409d70f0f63d1f08b4bc4", + "0x00f2c2af75fb32d073540aa153d5dd3a87f7e24b62b3b266b0fcca7bbae77a56", + "0x0ef3fcb96d17a16ee996440fc5bedcb6a82b4ccf7b8b9243228b7bb422f5715b", + "0x12823635f1b4863990e04f17b699b018c8909455710ec2aed425d49d4af58db3", + "0x3c9781a5cc339c771889e698db5baa0766ec750ce7984b329d22b31e62c73bc8" + ], + "d": "0x6da929165ef9ad2226b1847dac459d9a81736549188ff0c9feadafaa504a99ca", + "ipaProof": { + "cl": [ + "0x55687e318b8e3546f8eccb034f41a98707cea66b06188d2df8f4ce45fd42d5c3", + "0x07fb559a46907265ce18cc9d4e9d5c3f7504e0c7f0f94fa33d58346796b428d5", + "0x31d6f7e72049666ab73526f4e52f4e3b54324ac25cd5e30d272dccb3153cd472", + "0x5c61ede0e1173d31b9e5f70c13603103fbebc247e3530c42fa6402ba27cce8e8", + "0x62efae1441833ebb35d80524cf92674f177f2d0ce24aa07973049f79c84a966b", + "0x167709b238b6cec3f9a8184d4ea190b3cbca16406b1080a461f4235d5d547fd1", + "0x4835ac8e58de21768fcc9e976e5bfee701d088a1360f128270ccfcd8df3eda44", + "0x5f27527ba3a5ba13702871bf0aaa7a347a95d494f21da193c376f227a41f16c0" + ], + "cr": [ + "0x717e23a9e38f7f1eb8f34f712a021297318067f20074b48422f45fa87ef2bf17", + "0x48e54a0b723db0c6e08c9debe8d8dde631469760d844bf65ab70751dd51fc6e1", + "0x4faacafea943b309bf64765ebae14390576a52546411bf03c1a54cf2a94cfc63", + "0x692ed0331f745cb8a07a28c01e23666753f745a163f391d4f81c421acb25e35c", + "0x6d5e0b3fcdef9fda1ace23e92c82f4d70ce1e62f6119f6b40b2c4e8994616956", + "0x299e3b738b19ec016cb6f6c3ccdc04ff68665b4a58f67926a770ee881e35795e", + "0x07d8e97ed42d2d137b3777bd9186656bc5871f81955da5172fb733ce4f5c398f", + "0x2af8c5ec1c1567790ed794214f1d16d813bc61ec02e0ab5399ec7795727978cd" + ], + "finalEvaluation": "0x014303eadb64303ce8023d26d3263da6b7f3d92487380a3ae27f6d1adbae4ca5" + } + } + } + }, + "execute": { + "parent_hash": "0x0a531f8887cc2a64635edd86a2ba83a1db738b9cb66d825554c3da4dcf723a5a", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x55b040f22b201ebdd5eea670b54234459735ac7453949970c0f241736d5df7e6", + "receipts_root": "0x5b2f749bca0e60495fdbd7b506c4bb2c59be9081974ceaf25221e2412776d34f", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0x5b451e10ef8892ea84dc3d4c141a45e33fc3e907166a61cbf2ec88a105e255dd", + "block_number": "353", + "gas_limit": "30000000", + "gas_used": "250077", + "timestamp": "1707219636", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x5de0a59f1cd16bbed49121fb62edada658160f64a042a9851a162c175460043b", + "transactions": [ + "0x02f8db83010f2c80843b9aca00843b9aca07830186a08080b8807f72a9cbb547ff9820ccbb11d67a2c6f8f37c6bc0199e6f0250176d64eaa2cdda76098527ffd93725e7989d1cf1fe9b67a3de84cacd2be8cb00b5a9aa0b4365c251dfdbacb60b8527f387cb2529bb8994b249380bf2b5b9e55805082167e46e5ef6a9ab06a420cd91c60d8527f230fe32437bb856991ede8290a57616e834febc001a0b84c74931f72a03624b3475a4a97476a8fa521f29f10c5f0e48838daf7865491a0645ff1c323a117e4720524d6df2c457e7eb09e4f94edf3ef6bce5b417ec8bc88", + "0xf8e801843b9aca07830186a094fad312a228afdf83326ebd9bb269a7afa73f5d0980b8807f6945659ec69ecf390670e01359ab326d4fcbc102e44d4625d0623991c18a11db6011527fb90d30e21eb976258031c205196376dd89eccc71a20b55e97aa52d6388d7084b6031527f2445a8b6bce66640bf991dc292f5993cd9df2cbd35f59d39a63c5e3db7a52ff16051527f8f0ad2ee91fa7c79b756299acd6ab17062e23f83021e7ca0a59c93d265aa51127733aef2e1ff36906e376178dd67fba38f3e3b26c43bfb3da002b082aee7797a4d58e7ccec4c6fd7749017ac72aed3ee235b4e7756779388a9", + "0x01f8d683010f2c80843b9aca07830186a08080b88041954174f0c46c60006020555e6000602c556d2cb27ff4d0ed43fb9a0d9a8331dc88593a0c956cbc95ac001f107d51c4dd181eca1a3860a9527f9c82198bc6adb33266eac7e4125011a6a2481dab9b3b3fbf6ecc56a07ed9b6d860c9527f8b6494f5ad82840091c2108882967c496afcb61bee4996ca85075049442c14f460e9c001a08411c4a81b9681a447fe6cbb9e2ecf788e555f0543d7b3865fd525ff5704929aa05e761fc4c3770a2955d5f0ab8afce0172b8309673849696c9ca8e77d36ff3b34", + "0x01f8d683010f2c01843b9aca07830186a08080b8807fb10cccd2a290f776f7637c0783c61db0cecd725b10136ed58c9d69f2d45fce8160eb527fe57fd57cfe34ec42775253c6561eedb2d4180e7eb7afbc6b39f5acea346f1eed61010b527fb3aec74fe6e08df64fb948f0a82e473ead8e03121fa928dd5405e7231349dbac61012b527ffe02214e8a90c10b35cfe22e04f64c4d8ac080a02d3f2fea29db9cb02e88db3e1eb00ea5af63eeffefc526947ce045b3c61e6381a03e3c056a486f5f1046a3a00278cc6074b0b9b2c667c8230943998a0f6e04c4c3" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x008053ee7ba80a00000000000000000000000000000000000000000000000000", + "newValue": "0xc75259b2c3130a00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0200000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "96", + "currentValue": null, + "newValue": "0x0a531f8887cc2a64635edd86a2ba83a1db738b9cb66d825554c3da4dcf723a5a" + } + ] + }, + { + "stem": "0x5c05ab1885e88db43b38be8bdea0bf71994ca00d223578b8c988bdec482728", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "1", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x6bf71ec2fc8c834f85f4dff1939a1b5feb2e32f11e4f792dd89ae35a4363ce", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "1", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x00a014e332260000000000000000000000000000000000000000000000000000", + "newValue": "0x0002d579a4090100000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb24fa84f214459af17d6e3f604811f252cac93146f02d67d7811bbcdfa448b", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x008053ee7ba80a00000000000000000000000000000000000000000000000000", + "newValue": "0x2e957293c2590a00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0200000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xec78fe9022e567c01657a4e2428c0edd395f9a6cdbb85e1d5d2f51f6e5fba3", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "1", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [ + "0x6bb00641f2bc1e2e94cdcb23e8dd0434f99bd98115e85b5bfb7fb15fa0d306", + "0xb2a54bab47cec001dab58dfda9379489917383dbe713d291c21f2752e9cee9" + ], + "depthExtensionPresent": "0x0a12100912091208", + "commitmentsByPath": [ + "0x0d47eafd5ae38de78a583182e6f1d30a8477a9a15ca6a428e8a037c132f7edf8", + "0x53ad003f1bc1ee79305585df184aa0cf24fe37709265d1bb79f6446d664e3500", + "0x49266343ed7b381a130c0ba998b7409cacecea13c5d9cd83028778a22a77c767", + "0x15da7c75ddbc63cbca1cc6a360ad68cfb6cbaff5a785056988c8143900085ede", + "0x0aa52e70da5110993ebf6e8c6c26b3ed6a7bb746db988cc800657b7cdbbd7b35", + "0x5215e74c1985e2b304ffca0fab7d38c686f2c03b115d771faec39d1a86edbc4f", + "0x195b18574dd48ec7e7151c4a9faf8f7ef6f2d88f524365dcd5c91f69d9a4c21e", + "0x61fbfd3272ba1af96bdd3a6f60e77fec758e9b4af067c4cb372d2e0eea5e3db6", + "0x43b48dab293c8a94b728a1ebba0afb24e94f8709967c3ae2231f49ea43e5596a", + "0x30a0df5164748494788f4f693ab3af09af88f478c27ba828d3403e806adf51be", + "0x24659128b664d9432ebfd4262709ac4d842da92ddd72517078096ef727e96cf0", + "0x06aa19e28e6663a21c95f7f96574f59848d771436282068656866a79dcb18d30", + "0x1a1ade58c60a9b0dfb3f8eb3deb523bdbcd02d9a09b644dea611b8d3bc475201", + "0x53ad003f1bc1ee79305585df184aa0cf24fe37709265d1bb79f6446d664e3500" + ], + "d": "0x5d080be62a3df7f80b155e416b042bed662abbbd5004d0833126492617298029", + "ipaProof": { + "cl": [ + "0x6519493beb0b62aef57937069c42bb74bfe425fb538d2e10c425576f6ca5bf69", + "0x027641a3882bfbcdf60fb478ea307899963723033bea0699ba0ee375c6c249c6", + "0x3a4d804ddad9c05b0c16826d2001660751886abe9c87fa5b74a645beea6ff7ce", + "0x07fb88a05256082b685a132433807c537a97806f09095a6c120baff367339f14", + "0x2da44067562387298d36686081ed5989c7cea0ba4bc4e77f290705ccdaf9d17f", + "0x4a64b50801e803fdfc2b1494ec61cc47adafebff540d8489f0070e98bda9d012", + "0x709703d96e0cd7ebe0484e4b6f93ea66ea609f1ca71cd2b499b53f17fe73bbdf", + "0x0d834ca4e44f5bb9d09f98333011d966cb9209552c65bdc729dcf85aeae66de0" + ], + "cr": [ + "0x04f42d2f0afdd8d25955e7000beb2908d44cfa20356d427905c7d56a29bf6bec", + "0x6f34915e2cc9b10ae0ae9ed4bc3424be85c812ae9e110e9d3710df9c5c483c9f", + "0x0fe3e5b63ecb08a7867612fc702138f7722668df7e91c54050a42611d3dc82b2", + "0x3959174c019c2afd504055732973b554a01a5282d5def6b6354b7e5eb4e06b0b", + "0x606f358cd5b126cf375876d5fd7195decac94bb1f6d826b63a06a5085ead27df", + "0x09b94d9c3e6557fa314495c57141ea89fd5c74e3b114dd3894b358ea6da9ac45", + "0x1df8395d6ba2e47763c0deaad3d1c1a25b136c38c402a4afdf4b82a3b030c604", + "0x46cef9485829f4c33e4ea33ff2ce0550305bf4fddaa8cffd21e979fed1e7b51f" + ], + "finalEvaluation": "0x1a5060cf60ab11c6d6a1c61727663ab1684fbce297bd8986c966df9b59643419" + } + } + } + } + }, + "368": { + "parent": { + "parent_hash": "0x9d1fd4d57f13a6c78dd20b0c0531327a64ebf6fc8680b7ae2f2d31379408cbc6", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x5aac591364a85ed58957d79b8624f1c50e73581da0af573172bec672e818f608", + "receipts_root": "0xd95b673818fa493deec414e01e610d97ee287c9421c8eff4102b1647c1a184e4", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0xd3f3e052603ff009333f44caf7900c3516188bef9169df3036c2fae8a4d549fe", + "block_number": "367", + "gas_limit": "30000000", + "gas_used": "42000", + "timestamp": "1707219804", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x2ed51d728b4b3bb7d3111a14dc80ad349f1bc02f56a1b198bcfd7da3a59ad078", + "transactions": [ + "0xf86d0a843b9aca0782f618946177843db3138ae69679a54b95cf345ed759450d870aa87bee5380008083021e7ca093d7d6617cbdf8231b451cdbaf791a74a3879960556de9c35e17c92073837d50a007d17af2ead06e37ee091236583e87478ea84bc0306c8132022c2bc807c55373", + "0xf86d0b843b9aca0782f61894687704db07e902e9a8b3754031d168d46e3d586e870aa87bee5380008083021e7ca02d4391ec203797154799e6b2fe9e6092e314731c0deb6061faa594477535bd8ca05fe02c0bb3dc8d98f39cb508c9a814b874cee013885c6a5299b52aa844c36ee1" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x1910283e78ea3200000000000000000000000000000000000000000000000000", + "newValue": "0x19907b2cf4923d00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0a00000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "110", + "currentValue": null, + "newValue": "0x9d1fd4d57f13a6c78dd20b0c0531327a64ebf6fc8680b7ae2f2d31379408cbc6" + } + ] + }, + { + "stem": "0x714a8e6f30f0dd821d0eb4064e1b3f96721f60a7fb8c369e36af3299259343", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0xd0713f29672c659f3c2e3b030000000000000000000000000000000000000000", + "newValue": "0x60557f693cb54f9f3c2e3b030000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0a00000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0c00000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x0050d609e7c50400000000000000000000000000000000000000000000000000", + "newValue": "0x00f0eaec19ec0400000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0xdfad327676a33300000000000000000000000000000000000000000000000000", + "newValue": "0xdf2d8664f24b3e00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0a00000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [], + "depthExtensionPresent": "0x0a120a1212", + "commitmentsByPath": [ + "0x528189633493146c857220ea5efbe92304dab0e91b1e786cd84b81c5b4fc4530", + "0x673e68c3cc7746a8e851fab93d56be5c61636ebea98a0cc7486c03df2e08c5bf", + "0x17a67e4e85b9b348107b4510eddb1f866fdeaf4c89c0c7e02a85b39a6f2a65f1", + "0x1b48ba8533230bd1e45be0286ccc9040c573d7eba92664937a519db8d4ccb325", + "0x71f5c426f7ce554fde4bcc646c11929422876d8f9738f293ebe746d87fcbd30e", + "0x1fb6ab4e3b677f2f25c8924e4e20dae6dabd9d31ddfa3d2a20bcd47b04ae7a6f", + "0x494fe85dc0680882146366242ab27e9bf263631a2837aaa2baefb3ca5cb91000", + "0x20a366a6dda268918a0989f7f573f468d6ce896f2aa22a40e823c0a762d6bf00", + "0x5fe4f6ffb1f6f84b301b332cb236ebba78a466acb18e3e6d5847c554f7cf1dd2", + "0x1709422aca4583be169b0db6b7a9c8841e405c22c3e4762153e7d5f2059137a4", + "0x40c09e0107ec698a518a59d4cabf334c15fffa76b76d9f9a8061fa6f3dd03a92", + "0x324f73aff87f312da8e893f49dd482a1d837beb76613ff69bd3e8dd27b7878af", + "0x496cc261478884802835c98447528b22f171547f8fe8db9e24bc22322d54b100" + ], + "d": "0x23c470ec69f4b1dad6a6a9d9502b23d33c41bafef3b9956d1313a5c970495707", + "ipaProof": { + "cl": [ + "0x113a1c87b14d7838a16fdbae0df5882b703d6d5fc992041871dcac62a6027e23", + "0x56130d2f349705eb535b94b1e78933e0aca31564e04982310524dfe9164dbd77", + "0x5e8ae03cf2a7b31e69f4e409a24f026defcae17ecefb08c6662e531ab9e44950", + "0x42b08f1f670e8207ba22d28e288dbcc53bef7540c86fef7cbda9089713b9c988", + "0x30962646020dd659f42a41d26377b5300e46d29411c82449e10029fe03117f12", + "0x6a22256030787f9f80c668f445b969df536afe278fe95e7f703818b215496a62", + "0x66363dcd7c92d1a16e0f9ee9ebfbac574520173a84cd4cf44e1f3e102ea19948", + "0x27557ffd45ee3daa01ba6f888d224ded79cc05ebe86a979b3cc734c7dc382310" + ], + "cr": [ + "0x52be5db4e2d7920916011257addd5533b894f01f1ff0a8f6ff47984ad767a673", + "0x2d19e07a2a2c959b5fcb32428223f12391c6c573f58bf20bd70c7c63c37c0509", + "0x4a81e76e9ca55a4e446c4c1731415c1a721b70ebeb08838b98dd2d19371a5693", + "0x5c2229159f0361deb096886115b1cec5ee08a22fc50e1497c8569c0d98c03f70", + "0x4a19343d27fd18097ad4f650ec224d9f14226de5c433d09ae43179151421f3ed", + "0x4cd5ac628206480d28273095213159c5146dd3722d5ea1ecea4ada05309d1096", + "0x72e3d94454d3c80e9feb3c4e35f0686c72f34683a0269cb4265ee03d76e243b9", + "0x0107f7a87133798ed84a1a566b5f31ea428f6a911fcf3c85a04509aa2823b0e2" + ], + "finalEvaluation": "0x0e4a49687d4de3fffac759ea03572114b33c86717c09a17d8bddf2940b27f90b" + } + } + } + }, + "execute": { + "parent_hash": "0x2ed51d728b4b3bb7d3111a14dc80ad349f1bc02f56a1b198bcfd7da3a59ad078", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x368f9c82e3827dc5c6b474eb45aac6928a6b25c58c2a3de451723861714393f8", + "receipts_root": "0xfe7097b8c0dc1da90d2b78164e19f20b7c6b606e433c404561c0c6f4f4de485d", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0x7ed3f2a0b9e4c173e013a337feca42c460cb825dbc918f625f6df0b1e300dca0", + "block_number": "368", + "gas_limit": "30000000", + "gas_used": "286510", + "timestamp": "1707219816", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x6252819442ade95e28effa0661f10457254859b7a14e813aef9c41376825d5b6", + "transactions": [ + "0x01f8d683010f2c0a843b9aca07830186a08080b8807f942c764d8d9ce77e124f582f2b03a7d95dbc4d9fa300dbd95d9d38158fe935ad6031527f57ec7776f3476957aabe145716b733ede0cd871b29f55263e1e7735f3328f11a605152603e607153603960725360ac60735360b5607453fe6000604155dc6049607753603660785360c06079536000602055186000601655600060c080a0202cae40297a8cb3937c9641c54f37bb05ba138bfa2c0eb1ef1c88250697e8fca01ecee07207caf6c9d1e4fe965ab86a0ff5fa525beeb663fd2061c2a145130f97", + "0x01f8d683010f2c0a843b9aca07830186a08080b88056ed6000601055600060e155e562600060a9559fcc60e7604553608d6046536032604753601860485360ca6049536061604a536092604b536090604c5360ad604d536075604e53602b604f53601f60505360a8605153609160525360646053536024605453605560555360f160565360df60575360b06058536061607e53603ac001a0c111fea00c4a2fb8f764d1e8287891f8c69ed206af59fbfeb9ca389bf0af558da06bfbb0d0fa9437124c41fcdca6999b0bc884e66cc1267291be6cfa9702a439fd", + "0x01f8ea83010f2c0b843b9aca07830186a094a5aa342a9e95d7a5d700d7db3114f1d20a24055b80b8806000608c55c7bf60006029557f41479b4bae7c4575be771dab2783288e9b96ae9e34208f01c10118790f743f6a60b0527f9a1c3c912ce5397c6651201fea1353ecf3425b5d1265d067a4e26c235252b5c860d0527fa1d94621f73823f145a7aa03064f985fe8e528eb7978dd2c368e47291ee5b03960f0527f3c34e52a8c78c3c080a09cb40601f651207e753d42dc55ef2cad5a184789576c9219178158cc423f77c9a05359a297c8ac11664c490f55c661b03af8c2912c315c0b831348e128dedb9fb9", + "0x02f8db83010f2c0b843b9aca00843b9aca07830186a08080b8807f2ec995de5307c9e2fe1b6a211c145122fa1da6fdbfc4b1cec3a909c267cda9356018527f6d376976c08f654abb0b41616848ce9d9112424c48156fae764ac75559a770f96038527f1d7894b31a56c2dad1dae32de24631a7cd6ccd63c2c9959ee61cdd42e291ae466058527f6c2d4668b53d8b4b00868935ec3e998b1bb7b4c080a09769c5ec5cf50cd066f14f11e0640445498f4c50a2d657c7ebf987b3538ee3e8a025483e964b9c7648bf593a66fbe6926ffcf673e10772065bc7999c4cf5a3590c" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x19907b2cf4923d00000000000000000000000000000000000000000000000000", + "newValue": "0x29cc9c6a10233d00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0a00000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0c00000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "111", + "currentValue": null, + "newValue": "0x2ed51d728b4b3bb7d3111a14dc80ad349f1bc02f56a1b198bcfd7da3a59ad078" + } + ] + }, + { + "stem": "0x304efb8e3854089925372279dd83da60913da1c52c622af44e5107edc599f1", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x393c14b7b040ca251e391ffb219bd5ea89a83d210a6ce7767556d0d5292f76", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "1", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x42a7f80fe0438f2084f63c70f06a77b93acb5154e081857712b74b1b8044ea", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "1", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x00f0eaec19ec0400000000000000000000000000000000000000000000000000", + "newValue": "0x003cb13baef00500000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0xdf2d8664f24b3e00000000000000000000000000000000000000000000000000", + "newValue": "0x8d0b80d741b73d00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0a00000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0c00000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xee2e0d9598a53c35bebccb01dde68b07ad1d5748e7bb222867004cd8ef4f3d", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [ + "0x39b59d3d2fa4aed4e2f9380bed63f2baeb3b9255742780d83077860758658b", + "0x42a498bb50ba81284b584b7929551fca8b88f83d5dd76e798eadebb15c89d8", + "0xee2647db77806197fbe352a7a7319a0adff905c455f16e0cf6138db9449e4b" + ], + "depthExtensionPresent": "0x0a12100909121209", + "commitmentsByPath": [ + "0x4838be68b2378981157589aabca420fdb026ebd9be2c8d3b48f5e1f5aa83a5fe", + "0x061a9c868a0aa5514e37d26eddc2ea7ebf06362b0131c716fbad65d0653bf01d", + "0x4d2a9ec40a6fa70fa87d1f7e2285912145ff69e5e9f183255eba55d8d7bdfbe6", + "0x4076d5c7d634504bfe857f39c06a71523f5631ba202dc523295188f2742f8769", + "0x4334484cb115682b184940f54193ebff2214ad744e5fcd06d42d6b1e0edfeee6", + "0x3f11739ce8eb6431e2a40fa2a6d0f0ee4a910e478dc74f8563657e2254d56d64", + "0x436af9ef47e8a561f33078a81974ac2150ba3298fdcd099a18d221b6b2add1f4", + "0x682c1724c5b351d0c6b85399156308f69dc1aafb1b1aa03b61a1c8b9632ad036", + "0x3f60462ea0e4dc7e09c207c8767f67ad74419f77982d7a0f1d18485ee6542b68", + "0x4dea86a9e06a56a1e1300e4b4f1025bbf79a41eee80a556906b97dcda55740b4", + "0x2ba087b45a179b09b04a633fa8d44b722d540765d50dc89a3c142bb2be7de6ff", + "0x5bb7373e79b71da9c122bb904a79814f02f5b4c15f5b65826b7a7e81d27b1a16", + "0x1cb2d6231a4f7d29d09a0cacc6706f7d63437ea2926f9e12624d20f947e4af5f", + "0x485006ad68f0ce2ad1034e4d911aa50b6d3097f792b5d4f1dd2c08588e99926e", + "0x4a3ba40ee5a67c4a102e57f9916a628c8e5f847515a4410bfb6caae442e8ccf7" + ], + "d": "0x5d5f99614a0f3b83b675c5cfcfb5e6f73668afa3b572ad573c3eec0e77c5ffd4", + "ipaProof": { + "cl": [ + "0x5353df99316f4fbe768b1ce2236054d6f879a32ce706068a4879c7b6f3669beb", + "0x6667ccfeb4512457c04029344a285be88fc476cc994688035c6b514696a458ca", + "0x0f4aedfd6635ba780cedbc903d6e167632ea08bd436eedff6c1f47cd8671fa03", + "0x6b9544ed35245652620842d88a135dcb5d114ab1b457111378319570189fc0c3", + "0x1989a37cbf603307cf61af6246dbf6419416a47d203fb549a4517023d294ea76", + "0x00bfdcaee4c285b1b48943336e4abc74a57df5d6d360512f24a69f5a773a6446", + "0x4b50f48d3315520f34bb89864b2e31b4e8cc85bd8d60ce5de651727f6870e084", + "0x1e08869064add61475768cf956eec57091a051ebd28c0204492bcd15f6a02a43" + ], + "cr": [ + "0x30fb79a8abeb0ffa6f5ba29ac2476dc5632a590f369269dbc7dcc339d4959f4a", + "0x603a056a26e1dc0d7302fb74d8f2145e77a0aac84ea6e931b64d65d2e6998ee4", + "0x591c8d904f1669e9248c1da11a7bdd1ef63bfd8e106240d0a55380a2da7947f2", + "0x5d7bb8f4a235f83c1bdf996d4468437bc7a9730732379eeb35ea0a68ad10a351", + "0x078bab22e39131d3e160f638cd0430880c10629f927dd7fab15b329d6feeaf13", + "0x576913245d383f4749577b856d884439f4d705354e0f2d82513ce03f3bd2b2bc", + "0x1a065c7d2758efc7d53d623ee786fe4057d971b81c1480b1d17cd70d406f2807", + "0x1e80b0c6b041054a0f3b18a4493c4a1dc4d1c2ef160b83da5467552b26beeacc" + ], + "finalEvaluation": "0x01e864fb02182db54746396414f07e8022525cf75b81064158018ebff7bcc286" + } + } + } + } + }, + "374": { + "parent": { + "parent_hash": "0xc0cf14013fd322d4c3694db1827c4b052ae3fddfc2111508073849badf2ede1c", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x506d115a30bf1f15e138e68e68a8f64d880fa140a53977ca6dba955cacb021e1", + "receipts_root": "0xd95b673818fa493deec414e01e610d97ee287c9421c8eff4102b1647c1a184e4", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0x36c8b8a71982fb6335056be6ac3ab7ff8c1ff0ef7b76769388a538f2a1ddc4a6", + "block_number": "373", + "gas_limit": "30000000", + "gas_used": "42000", + "timestamp": "1707219876", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x89649c2c518339138db54d4cccfa1d7378fac84d5661c7e76572f9e9e1e8b94f", + "transactions": [ + "0xf86d0e843b9aca0782f618946177843db3138ae69679a54b95cf345ed759450d870aa87bee5380008083021e7ca08ada77926c327ce62ed1f797e311078466c5b7d9cf54e2b612d9bd960550361da0342e423ff6f447b35cf495743c11f878fa6c98aa84727df9fd26c365290fe23b", + "0xf86d0f843b9aca0782f61894687704db07e902e9a8b3754031d168d46e3d586e870aa87bee5380008083021e7ba05e77ddb162d0de1b8015a1102ff0d680212cb2bbf8622eba56318bc88f0abf8da03e36277a6bd88e05fdcd60e4757dc7e8ad0d1f8b42b2f136f98c76008e45d9cb" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x660771edf8574700000000000000000000000000000000000000000000000000", + "newValue": "0x6687c4db74005200000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0e00000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "116", + "currentValue": null, + "newValue": "0xc0cf14013fd322d4c3694db1827c4b052ae3fddfc2111508073849badf2ede1c" + } + ] + }, + { + "stem": "0x714a8e6f30f0dd821d0eb4064e1b3f96721f60a7fb8c369e36af3299259343", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0xf038bfa9113e3a9f3c2e3b030000000000000000000000000000000000000000", + "newValue": "0x801cffe9e6c6249f3c2e3b030000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0e00000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x1000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x000e2cab5a400700000000000000000000000000000000000000000000000000", + "newValue": "0x00ae408e8d660700000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0xcdaec9a4d7a94700000000000000000000000000000000000000000000000000", + "newValue": "0xcd2e1d9353525200000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0e00000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [], + "depthExtensionPresent": "0x0a120a1212", + "commitmentsByPath": [ + "0x6b977916f8ceb0553a1e6644e40678c85ac1c551533361376505fd8c968a53b1", + "0x6455ac4f7ab8bb09ea66071087d4e657669927ec3f0e31f922eded4c6a68083d", + "0x5df9228d0c3c5de2543a7ad14122550ce2a3b8ba9a74a9dafd21da94f2933c18", + "0x4c8dd826e2d3f3d38e10558a3fd839b472ca3ea8e648c76b5f9af3caca140e6b", + "0x1b04d431579c86a50e81034e32d1289d37f5bb1345aecadf79b78fc75105f6ba", + "0x3009074ba52eb8d6d2414afe35c47ed09e3de3ff94d680fa85ed5df3503f2a24", + "0x72b08615d289a128290cc7c5a191f8b7b877d8641b24b68d3b84144c022c6cca", + "0x4eaae504b9fcf4a26a827355e64f2a495aad0e391e819efa54cef5d51a3775e9", + "0x0eade16d79fe8c400a69229cd62d7f2dc4290a81bd24e9de863616c2247b6b2f", + "0x47566ed0b077280931c057f2bed25b4241ba7af9532d80cbe055065d1335ed06", + "0x0d9553ae616a0e1d3a70cef223ccb89278315e1e15f7b136881291f22b06b719", + "0x09fd2de16ce7f6323089a201fac8ea9c3042b9a5372133fc43953f9b616a6b94", + "0x0aaba1997b9590b6d64f9e773686d114c849a8cd404caba96b0b0ecf84aa4668" + ], + "d": "0x6deac3a872b5ff23835ca6c0e7be1919e63d35d53c3838efcf14e12e5ad3df60", + "ipaProof": { + "cl": [ + "0x55ceaa2ce3ddad6be8b304f964dbf99f95daba45ddabca5d5b54e70521dddea9", + "0x13c237aaf6cbf99d9b8ed15a92d21c3028073139a2e0543e97a9f0513b001d4e", + "0x02651d8999e53d94973554e2e17dd365d20dee1d38afaebc2a235dbeedf239f6", + "0x4a57b76987a31910fd7faeab9702887841103975509f9c7b6c8118d84bb1849f", + "0x143282e911d2c2b8e2e37701a550fefec831aff4d264dab961d9b028c65a6592", + "0x4a8472a10146312ae1b38765eefaac917cf97f68d5af78004678b70449027dae", + "0x5988cfbfaa46058f7560c73c84ccc6f435191829a8bc7d7fa7fcd343a9287c74", + "0x5045334319be145594014bc61dd25a5583787e3c942e53016f951b16c43af615" + ], + "cr": [ + "0x5ee85ea5bb6cad61e87056ef03e541aa6455615155b57ae27d704a9269280b3a", + "0x0ffc51cf7704f60a116c0da69b417e8a4c876db88348b84da848c15e2b0c83e5", + "0x4b8c8c4a47ce967b3d565996de9e504c177172945877e9f5c50f4837b30b5e4d", + "0x118981f6dab3c1095ed63abecb115dab18d19526b87e430bf8977469be6ae833", + "0x4e2338fc0f29df8a12ba1833dfb23817447c86dfb4c71f79c6a04021d5c2a902", + "0x394127eea68ffb00c481f4b6fe39c15dbabdaf78c08aade9608be3f313d2cb49", + "0x3a9cc20f6e2cd110e64885e13d1fbca807d80a457e852d2374df756c66c20d67", + "0x72d3bef7862fb9af28841676b0924e486c60481a4362246ce0453ca8b6700326" + ], + "finalEvaluation": "0x01956a4afc06d740bac5c1e554f505eb01adb7d94c9bb80904b3503277bbd1f4" + } + } + } + }, + "execute": { + "parent_hash": "0x89649c2c518339138db54d4cccfa1d7378fac84d5661c7e76572f9e9e1e8b94f", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x5d2204b6d6e672c0c16c0dfbc430f52d81837beaf9c348f54cd08ab1ebd55a21", + "receipts_root": "0xf9c2f189e7ca9f58637760806eceaad0844d4c4cf63cff9aafcbf963bb07e88b", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0xdd2598dedd86b768fe7c86f82408a64ce909983a91422a2e7de931ed8a524d72", + "block_number": "374", + "gas_limit": "30000000", + "gas_used": "286525", + "timestamp": "1707219888", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x452ed5b63b5090eba6ffca5ddd11c8249c1b059189a5ae13779768138ac5bc5a", + "transactions": [ + "0x02f8ef83010f2c0e843b9aca00843b9aca07830186a094588b84692d032cbf75cf311ab29ca0157296786380b8803460006029556000603855600060f0557fb1f53095440a961e4b7e35afc4f85d03a106ac5f8a23180b33ef3383dc7b812a6014527f6009581756bc1ee777b7fa0e35798067b47d635dbc7bba5a16859d51c85daeb26034527f7702fd5da1aefe2f8d48e36bbf60a57fec49932158977909d32b71d4a57c9a516054527f716f8dc080a0848a5ac5c1fbb3393abcd079c5d8561e5ea7fa2d93a072d7c874abd0b2441651a00e7696c1447574b2a23f2ffe7ffbee15370396b78c0bb33ad1c25fc989053071", + "0xf8d40e843b9aca07830186a08080b88060d160b65360a960b753608260b853b66000605b556000605355c2ea6000604355600060c255cec3e260006040557fcef6a0d9523a2004222f52006fffbb3f240d5cc19c36f470102a0848e20eeaa8609c527f70239540828bd4b93636e785da67bf7d1bc7b2d1552b7a1ec157c503b2f3984560bc527fecc3b237c45349507283021e7ca078d5b55f845d924ed16f89041557b61869525991d3bc36bed415f1e684141467a005e0474659ea9f4f03390a72ec2ee18be84c4d932ea8fe8ddda5e3b5b1a3a0a2", + "0xf8d40f843b9aca07830186a08080b880676000607e556000606d55600060ce55b5600060b955367f3b40a8854add7333ccbfbbe251d506992ee4032c827dd62b3c3870615d7b617c6024527fb7e472be5e9efb328da6b9313a6c4231313ef42dfda8c4af37e1618d8f8fccbd6044527f7c86f22f77a3871d7e3169fea29c38000afc9416bbf063494acffef42b1f70d083021e7ba00cc27a1c5ac296ef0591a663bb641c6fb9c93dba57e0df29bdeb03c9f67c94c9a024a8c7238afd91a97bfbb7fef24dfd1bc1ef0d8acfb6e2579b734a00d64298ab", + "0x02f8db83010f2c0f843b9aca00843b9aca07830186a08080b8807fdb8a31d55a5277c994cd0667698cfeb3a0750b21d49beb4f68cec5173988bcce60ab527f9eb429ba5e58e2b8ef01172a44e755b75cace472e2cef7296760328d8f3d1ae360cb527f1177350a75b38364951ed24b236e0262c1d8dcafc3e8bc09a7c75e3356f332de60eb527f77c4b9694005cbb06071496d6d6318d8ff812ec001a0e7c3b23403ff0ac3a1100485ea5d90e1eb9f51c75efb244f539ea4ed4d1cf94ca0509a2b79afab1e905384a6dc3bf682a9e3cc707edc8e0749eb26fbb31c267de4" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x6687c4db74005200000000000000000000000000000000000000000000000000", + "newValue": "0xa6aababa8e4a5100000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0e00000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x1000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "117", + "currentValue": null, + "newValue": "0x89649c2c518339138db54d4cccfa1d7378fac84d5661c7e76572f9e9e1e8b94f" + } + ] + }, + { + "stem": "0x3aec23227ab35a0d8054c86c657d81c731d09d55f54778511798ba72f85345", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "1", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x3e710b6b16cb5ac917cbaa66d4680d32bda66ec694ef06124dd07bbf04b851", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5630f3d06fb67bbd27d2a024896b5db037d0ac15f6b3330f3c7d81801baa76", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "1", + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x00ae408e8d660700000000000000000000000000000000000000000000000000", + "newValue": "0x00d0185b256b0800000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x97f2911f5efe08b74c28727d004e36d260225e73525fe2a300c8f58c7ffd76", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0xcd2e1d9353525200000000000000000000000000000000000000000000000000", + "newValue": "0xe24e30e7a1035200000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0e00000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x1000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc7d7d597ba772a1a065e870e275384030ce763950a2698b465581dde6f98f3", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xfab4401465559d97a37a5a1dd9feafe388d93f5b28e00274d42ea122f70144", + "suffixDiffs": [ + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [ + "0x3e72e77043e8d873c8e767787e43af531246069cb9531d19dd8d0080b1388b", + "0x5621b09f58e9b50709f0d876853041856b6b6a11389190f03d93b0e1112475" + ], + "depthExtensionPresent": "0x0a121009091212120808", + "commitmentsByPath": [ + "0x05ce4dc220c30763f06a1e0fa77f029f85b60b869ed559e05fae833ff3364653", + "0x5758bcc8f5206f10dd28c07b18abb5b42b69a70eb9d2dcb12adefa7258a4cb1a", + "0x23b7cfe20ae9e080952a4cc0b9c645c02eb07e48d4a792e2a6283cbaf6b88e0a", + "0x0d37b937050c223ddeceb15bc78c34034f479fb1d5908b7593fd7c6b5835d3ca", + "0x6d3d0f69481c7403b88f5393fe8ea0ab256bb0fbde6a51602414d0352714080d", + "0x6364513da3de3b28caeca8e8a6a1b4e8a81acc7c63188d6677d15506b9fe72de", + "0x263a4dbfc622b07620571077e08079917075782746498ad6b054dfcaaba8736b", + "0x064f5996f003619db7e493dd4d47e2e40da71f67190587e14a3fadcf45ef763a", + "0x11c53c33c6b37d72249cbb1004955728f94c2516291f69939288cd74ce3e36fa", + "0x5060f5f64f7000bec9c7224e9a950d8aa0c20dbc0ea4390ea9713a6e28cacb9d", + "0x1957c5cc45832722e02fc8c0f60dee0aa0bbc67615fdefd2fef5be03f0a5d167", + "0x11c2c623821ca552df75abbd524bcec3ec7f2c5d022f839e4be5c5e21437fc24", + "0x05f85088f2d7c72fcf02c5ebc0d45819b7f3d6b1c8612b6208af39518518e5e8", + "0x61ac3eee48e37825f8bdfdd1d90d0f581291ae84c8c134bd336aba6e4d540431", + "0x4e981be45c51706a7243fb0fca0da5adbb02517ef278c33792e7fa1cd00997da", + "0x2cfbcdde6509e649a7ea9154071650146565277fbefce11066d4e98b516216a4", + "0x5217417fa548faefb991efc5f86356b74879274bb7de7ed6a745cd22dbc203d3" + ], + "d": "0x1c4809f43524d628654834406df30fd3e4f2d80767db76f84ed393104b9011d6", + "ipaProof": { + "cl": [ + "0x46025ada926eacf6db824fa1e5892b5f9bab91d172cba59ec407d1d5bb372c31", + "0x36b73ca794df31a5325ed3761194ba6db6e02676b229b66ee3ffc8c9d6637e72", + "0x660f0075b88b115240567d07fdc8d5526ea2f34ebd30ada00a0b83ed1cc64ce3", + "0x4227fd07f554aa092aa02e6a89061c84162ffa7b16c197e2fd9009a8512438da", + "0x7266cd9ef9d489adcbf1f2c9e388d46104eb12c487f43fde3638d9dc63a7c68e", + "0x0231b328932b9559c20fa8aca5c4935edad72cbce0f554d883c26973a4062645", + "0x65fc2ba7630c9f4f13ef5ea32fa0a569687e80bcc7ea8b908eec5fd1b058cd0b", + "0x22d75c0308fe25e189b0fb27f64a50d92dceca682cbd15cab98013f7c9090761" + ], + "cr": [ + "0x6aeea8170acff955fa93848f525be3ee1fd99278423af82853b10c9337828b16", + "0x481bd143763db4eeceaece022c43172261d116a472d88cd417198d2f2bb4eef8", + "0x3122f29fd7c5b392da0ae8a17b835500740ae27c0d64d805f085f11015f465ab", + "0x672a61ab9fdd484996429c68e4f03cd2dc38de5f3b041922f19dcb7d3e18260e", + "0x3b779e1238644bdab8f086197b529d3a56250502238b5bd443b7e4f2aa2cfb90", + "0x1956b68b3b44c5648ddf279f2c85864e95d93137376f8b9b56a817a094446386", + "0x497f97ee275610f3fcf1c45532479eeccd046c734c6582a6d02dd7e2798470aa", + "0x0c6c4c83bc83db2e4e1b9c2f99b440f4e62448eef42ba503cc224a032a8c1d42" + ], + "finalEvaluation": "0x1b8d5a87dee93a08a6344516aaa6408a688a89c6813e0c598f8d74adf402b59c" + } + } + } + } + }, + "479": { + "parent": { + "parent_hash": "0x4e8ac3c4b1d4198edc7aa4e9a0cb7cebab5653dff21f4904f32337619c0c9c80", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x7196c42cb6cdd1d5939234b64568525e3c62a22825180fc2af0589ad161bfb44", + "receipts_root": "0xd95b673818fa493deec414e01e610d97ee287c9421c8eff4102b1647c1a184e4", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0x4481414454c8b100196d8ab6bc3e2a90af7c9a0072fa9771cbc381864e07dfc2", + "block_number": "478", + "gas_limit": "30000000", + "gas_used": "42000", + "timestamp": "1707221136", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x8088c77ef982d5ae3de724661c6f2b9e7558f128768435d1c0efba06752c9a60", + "transactions": [ + "0xf86d54843b9aca0782f618946177843db3138ae69679a54b95cf345ed759450d870aa87bee5380008083021e7ba0c30cc392f1bf1aaf2eec6ac47e263dc2eb4cb0e15f0fb937977e6f876689e566a02ed31e0e3f030706cd5d4c0500c07a03480277642284d971f915442d86aeda1a", + "0xf86d55843b9aca0782f61894687704db07e902e9a8b3754031d168d46e3d586e870aa87bee5380008083021e7ba07f9c3d3690782a61fe74191a780924f2eaf9c5840d58c7957ada013b1d2a3167a03b51740e51d9a5520bf46931cf883156cfbd1a16d54031121d23c419555fa4ab" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x10aa91879a6cad01000000000000000000000000000000000000000000000000", + "newValue": "0x102ae5751615b801000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x5400000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "221", + "currentValue": null, + "newValue": "0x4e8ac3c4b1d4198edc7aa4e9a0cb7cebab5653dff21f4904f32337619c0c9c80" + } + ] + }, + { + "stem": "0x714a8e6f30f0dd821d0eb4064e1b3f96721f60a7fb8c369e36af3299259343", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0xa0557b7239f34a9c3c2e3b030000000000000000000000000000000000000000", + "newValue": "0x3039bbb20e7c359c3c2e3b030000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x5400000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x5600000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x00561c7e7b322a00000000000000000000000000000000000000000000000000", + "newValue": "0x00f63061ae582a00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x2704e26aededad01000000000000000000000000000000000000000000000000", + "newValue": "0x278435596996b801000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x5400000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [], + "depthExtensionPresent": "0x0a120a1212", + "commitmentsByPath": [ + "0x2a0221c79eff6439b60e146344eadd6f06051174729962f36952334c9cdd4ada", + "0x545b762f33bed2026ac66c6217f15cb6776f1c6f107f5bf63d15e1e98e85be29", + "0x6298d9d26b75d85f1255481e1f978befeb173eb8f6a92bbeb55f9bcd9cd9a96c", + "0x58224275e6eab5c485b3b28f7250f9526b738eb22c74fdab3ba0c62d39f2c661", + "0x6ba816bb78314fe51b7aa6f18a2df3b880ecc9a59a4c3f9ce197f9349de745f4", + "0x2dd5ad89d137049ee6ffe70cdcf883a2a93c9e49cd368694fb09d92c5621bfd1", + "0x65a318d4aa83ea7db7582a6c3da51466a3cae2a14797f045045ac70cfaafaf71", + "0x31ef1aabbee3b45f7304b645676a899421eb70be741a02a8db53c43a7650981c", + "0x50348e6e831fc4e388a5aa9fc00b177e378820d26be8f4e22ada670badf1240c", + "0x3e3bde6d7d53490504161662aa7811a9303ebd0445eac336c1055908d69a51a7", + "0x17c5e6f6ada4100d0d067253db29133cde343aee9de6b406c9a05cb43390006a", + "0x49d0fbd34493a97643bd641611394a029c6dc3f3bbc5ba9b16445ee494bbb9dd", + "0x1c16351e22674e70db93542de2ac2ecf612d11c392b375cd3358154f5d74b43b" + ], + "d": "0x289dd5511f5bc14d64ce15fea33b5bae3bd4fea8f374a15b6d3ab547a909e9f4", + "ipaProof": { + "cl": [ + "0x15c509006d52b7dc7db077a353e8f2866ceda550daf4228b767664bee490494d", + "0x62bfdda99d212902d7f9163f207c9f67cea3dd514d7872ed585de7e96d44451b", + "0x3258d1872d9c0a91a7463dd5ec2c0ed1304f42f8afe365b33c3ec8fb79f0ef5e", + "0x47d7c1a2363c4d84ad9a1babcf6c955978ecdf747779613fea18c80c062bdcbd", + "0x467b8b0176d55faa7c8baf6757c851423f6a2d0ab831cc547a134687d51d06aa", + "0x68cad2ab76055d9a003fa05b014eda9b5ee78e0d6a85a58ec4914830ef719289", + "0x5cc944e5c7c8e189d1e44b277e64c53291254817c724c25c35460b7c09d9c726", + "0x5024fc15473dc253f44914350c430f9601862783b968bce776c3d1864d79fe20" + ], + "cr": [ + "0x4457a232030b51cd6ea2c3e7bf9dd1cbaa956ce8fe4fcde0d6ce090b393d7deb", + "0x54dbd11ab77121bb590c2e6d52245319f94829bfeba6eaed9c396a019968819f", + "0x5ebd3eaac8ef062c0004f24e9dc7d34676092febbfa3642448fc95a6c6e21845", + "0x307601db7759429b521325eda614857993ff486deb86d771bb697b56e066ca7e", + "0x270606ce93a8ab22c55de92b4af12e9d39780c7a0f4a7c0bf6d9ead75bca2bea", + "0x2bd520c980378e2a0e5c070b4abe83c46012edf0fe5c1130443e756c58bae52e", + "0x5d2a07a8b50ef8627638f144d36884c33d712f63de8e339116a8522d4ea954ae", + "0x12a6a9a4f0c1fc9e8e69d68431426abfe204b2d7cb5d4f8e4608aebc2ec3a981" + ], + "finalEvaluation": "0x05d762c8cc2495b3cf377604c3844c071c13efbe6169a168801b7237aa828263" + } + } + } + }, + "execute": { + "parent_hash": "0x8088c77ef982d5ae3de724661c6f2b9e7558f128768435d1c0efba06752c9a60", + "fee_recipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "state_root": "0x2bd1afbcb845a40cd0c0f373c2c6b83b05eb30d87492fa91f0ed6913e884ad89", + "receipts_root": "0xb8e1761f3a4618889d5539875f4c223d4a4eb25f2b2e5a7c4505bfb4c313935b", + "logs_bloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "prev_randao": "0x456d62d73ccae3d893b29a32ddb667a6b067155fc8429e1f47a6808a13dbaf17", + "block_number": "479", + "gas_limit": "30000000", + "gas_used": "246072", + "timestamp": "1707221148", + "extra_data": "0xd983010c01846765746889676f312e32302e3133856c696e7578", + "base_fee_per_gas": "7", + "block_hash": "0x090ce51c3ff012db395aae7736632b6af81ccf54b73203967c7e63cec4f3f118", + "transactions": [ + "0x01f8ea83010f2c54843b9aca07830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8806000602c557f5659093771be98d90b3153ef34d47196934b5da11b02c19345ed8486e3a0a7e86062527ff316e65fa9362d4c0d96ba52a548fc1965991ba1e120f7e52e05c79fd20331436082527f3ba0ba146a6ff6e10f6c662045f1109c38f311c72122795b592cb79f2ce00d4560a2527fdbb77906331571300ca784777f34c080a05e2e88e669928692b539814bb52015f32903ed638c87249e0aae20db01d407f9a002dad1ac083f55c74e9c79f1df717cf0daa168bb79ffa35eab399d2901871f2c", + "0xf85c54843b9aca07830186a0808089b686600060245577c883021e7ba04f7f6f373ab8560716553e4a108e4545d09d7340858df0dc062664a41b211af2a04dd5b24e77b92e9c001c1a74bb776b70f270c9d89ced6fb522d2e26ecebe4b69", + "0xf8d455843b9aca07830186a08080b8806000605a557260006090557fb181c2d6f7a532f9683555de893f0412dd8548be3245dec1138c33b02146290160ad527f9461856b8ce0af77001ebf331f9eeb948090a8d26cfec28e980d6ff55670875060cd527ff42efa4b3a062d9aa9b8afd4c1500070cdc1fa783505be3d7fce7a95952a8e3760ed527f38dcad7c7686034883021e7ba0334f8dac5c7cc95824f8a5057723655e1bf0da28786160dd600a4e2627398d0ca078551e80543e441eff0ce3dea434fa327bc1ec8ef46e82f06c10d7deba508741", + "0xf8e855843b9aca07830186a094bb4a8cca4a95a57247e10e93d003cd216e6e5d6c80b88060006072557f8be7f95d4e03128a5e53d4de7f6646f30bf16c86adadb309b38f2855f5d4472760ef527fa0f2f88d3d04c5cfb0a875115c9c10965ebba58e83f5af77f269801e46b7f5c061010f527f24da8e8305d5c8354760cabdcdfb9770480d80e1b31ffd1c0838ea20b580248961012f527f7f10ec5fb879a716f16bc71a83021e7ca0e2c0a9ffd9b1c9f15ea1bae7d84358ff90338243729bf2f72f6a7bff4601c504a035ba102c3380d95af533708ef98f9fc2fd146f736715f03e18bf13954e7b2fdd" + ], + "withdrawals": [], + "execution_witness": { + "stateDiff": [ + { + "stem": "0x0e88cc6bf033a3ff779335e720d5a7edf907cc70ab7ff31375cd485db779fc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x102ae5751615b801000000000000000000000000000000000000000000000000", + "newValue": "0x504ddb54305fb701000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x5400000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x5600000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x117b67dd491b9e11d9cde84ef3c02f11ddee9e18284969dc7d496d43c300e5", + "suffixDiffs": [ + { + "suffix": "222", + "currentValue": null, + "newValue": "0x8088c77ef982d5ae3de724661c6f2b9e7558f128768435d1c0efba06752c9a60" + } + ] + }, + { + "stem": "0x2313c47f3c7da2c2434ce909697681c6e9ef92a090822bceab5690ccb3274c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "1", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x00f63061ae582a00000000000000000000000000000000000000000000000000", + "newValue": "0x0026577b7b382b00000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb61281c06cd7fe53ec880acae946ea1c95cc7849a1aef24dfcfcc8d2907efc", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc1ed0007b2bf97aa5750105b201f56176a775278e1d54c7086da356a99f926", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc484e43d783cf4f4eded1a8cee57e046e1ac2aaf6937ca4821263f0dbc759e", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": "1", + "currentValue": "0x278435596996b801000000000000000000000000000000000000000000000000", + "newValue": "0x5fe8fe5f826cb801000000000000000000000000000000000000000000000000" + }, + { + "suffix": "2", + "currentValue": "0x5400000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x5600000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": "3", + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd0039a86600c421b915e29dad08e4095115cb9d0839b951e82c99d04e96209", + "suffixDiffs": [ + { + "suffix": "90", + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xee9707ef2846473a6fe4e10781a3b8b225ea950a7c89fb88f01c3544a41dfb", + "suffixDiffs": [ + { + "suffix": "0", + "currentValue": null, + "newValue": null + }, + { + "suffix": "1", + "currentValue": null, + "newValue": null + }, + { + "suffix": "2", + "currentValue": null, + "newValue": null + }, + { + "suffix": "3", + "currentValue": null, + "newValue": null + }, + { + "suffix": "4", + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [ + "0x23471509d9d1251c1973e2eedbc7d26993e60e1dd572f6249e64d8e5f7d745", + "0xc137383df7b1bb109bdda4dc0a53c274eb4328fe9105fbc4967e6b73c7d8d5", + "0xee2647db77806197fbe352a7a7319a0adff905c455f16e0cf6138db9449e4b" + ], + "depthExtensionPresent": "0x0a1209121009121009", + "commitmentsByPath": [ + "0x5a49f40fca1a8a3e6325233153cc800a42a6f0a4b454bc9bad4ef6470472f8e2", + "0x2ef171a3dbc685f9e7aea939bd442688d2fcd1fc0c7d5d466f1a5178f879d827", + "0x5e2deb19897d5f7aed7f71cd69004b07d051fa0b8ad9dbb6d8bd0ad847bbc023", + "0x43044d67db966be595346f3c2959996cce825ef7b4b7367aff41e9431aa84789", + "0x6309e6155373ea559d6694f839c57f0d1a2ede50e3f7ff1b7aeaf5e0e326693f", + "0x6b712b902561b52e411dd1d32903f0a2d48531f7b10a50efc122c94c480cd203", + "0x632262896436b692932aa00ccf5dd1f9aa08c6f7eb3a06f6b427ae9864e75ff5", + "0x269e1975197d539132cf971ad4c356ffdc67a6aac6417c46e75e6a11c205fdbc", + "0x2d05754997d8503566f500e9c228038e2ba63010d7015a2f4e79485fe3039c60", + "0x43bbcd464027100e4fc6bccfcdc0aacee60312b8c7cdc554b76525ccf50a936d", + "0x0d7f13949dce75a72448412a79e4845a32e8b35bd6cf7a4397947e348ecc6838", + "0x6da35bd02c1e6450c57baf49bb774f7b21c9797c591e75747210552a00cfeab4", + "0x1484563a0f59a47b40d548ccfddd7928cc90345fc904cce5ab639adc765d9402", + "0x6b308682111548a6d71aa92e403efceaad1316b95062de3951a54e9b277bcaa7", + "0x6a78076ffa2c3287a1946285b80c481ed46091b8b559ec2f1f012b635c88a2a3", + "0x4a3ba40ee5a67c4a102e57f9916a628c8e5f847515a4410bfb6caae442e8ccf7" + ], + "d": "0x215c3409231a5a954c392df0254d91851dcc51f9c44e461492dd244141874752", + "ipaProof": { + "cl": [ + "0x285a67985880d58a2237657e0fceb6a9b646436308a354e65bf5652e34972980", + "0x4b4fd83bb45a92cbe0d5478a28f5bed79ed6d7450e349ee31adb28c3ee642549", + "0x23deb3a653f53e80d5af3e093de87cedc6ef843faf0de50542e2d51a3ed0264d", + "0x496dc1da4f158b25838d234b4e899e39d0a1ab1e406ad3aa3b8ccf30480ae0f7", + "0x20ff6c82f528059548317af666adfe56a3f10c01cb16fa8cef2dbda3dd0c8d6f", + "0x41b1978c417390cf15cc162ae84258b70ec635ade8a6383b4ff2956b4c2b1614", + "0x14264caa663dd1e87bf88a83987ed0c3589f0e458129745ad2364594ec5dd6b2", + "0x18ddbc363e1f46d0596a258346809537eccc80770bf8fc3b875c9925b3f94ef7" + ], + "cr": [ + "0x1c2875500973061b11c818782a9c3ba07139b4546f164b18f81335b3895d2241", + "0x137754af4a782866c8fc50143bd954573014790582f42a380e8ed741eed2df96", + "0x6a3533a7cd5ad0673f1c74e603e91831eef260f7830a784bceb4e7fd90771d6d", + "0x23c1ce7cf636e150a952acf88a8f10c42282609bd98572f59f16615f094e5b92", + "0x08a6cff4f32a9e91536ef1b30e48e5602aac33f7a3d7f64c2cfb3328868d9c59", + "0x68e0ebc0f8e5e9f9d5902e438c17585a9ea602fe3af052ac95c39ef2497235b0", + "0x470ea2f370e8f2ca4c920bce33f8c384d9c75d72a6057ff6e4e25910bcbd3155", + "0x262a58dd144986b66d97eea1b6aede262eb5b758f0f2df23749edeb1b551f51e" + ], + "finalEvaluation": "0x124954e8919e5a95dd3c3e5ee4223361b59d51bca6d9c37b95f3d413e9063885" + } + } + } + } + } +} diff --git a/packages/client/test/testdata/geth-genesis/kaustinen6.json b/packages/client/test/testdata/geth-genesis/kaustinen6.json new file mode 100644 index 000000000..040691942 --- /dev/null +++ b/packages/client/test/testdata/geth-genesis/kaustinen6.json @@ -0,0 +1,901 @@ +{ + "config": { + "chainId": 69420, + "homesteadBlock": 0, + "eip150Block": 0, + "eip155Block": 0, + "eip158Block": 0, + "byzantiumBlock": 0, + "constantinopleBlock": 0, + "petersburgBlock": 0, + "istanbulBlock": 0, + "berlinBlock": 0, + "londonBlock": 0, + "mergeNetsplitBlock": 0, + "terminalTotalDifficulty": 0, + "terminalTotalDifficultyPassed": true, + "shanghaiTime": 0, + "pragueTime": 0, + "proofInBlocks": true + }, + "alloc": { + "0x0000000000000000000000000000000000000000": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000001": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000002": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000003": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000004": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000005": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000006": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000007": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000008": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000009": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000010": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000011": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000012": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000013": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000014": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000015": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000016": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000017": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000018": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000019": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000001f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000020": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000021": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000022": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000023": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000024": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000025": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000026": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000027": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000028": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000029": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000002f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000030": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000031": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000032": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000033": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000034": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000035": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000036": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000037": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000038": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000039": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000003f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000040": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000041": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000042": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000043": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000044": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000045": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000046": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000047": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000048": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000049": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000004f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000050": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000051": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000052": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000053": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000054": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000055": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000056": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000057": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000058": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000059": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000005f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000060": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000061": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000062": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000063": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000064": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000065": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000066": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000067": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000068": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000069": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000006f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000070": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000071": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000072": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000073": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000074": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000075": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000076": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000077": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000078": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000079": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000007f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000080": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000081": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000082": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000083": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000084": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000085": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000086": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000087": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000088": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000089": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000008f": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000090": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000091": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000092": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000093": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000094": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000095": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000096": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000097": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000098": { + "balance": "1" + }, + "0x0000000000000000000000000000000000000099": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009a": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009b": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009c": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009d": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009e": { + "balance": "1" + }, + "0x000000000000000000000000000000000000009f": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000a9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000aa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ab": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ac": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ad": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ae": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000af": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000b9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ba": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000be": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000bf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000c9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ca": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ce": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000cf": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000d9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000da": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000db": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000dd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000de": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000df": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000e9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ea": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000eb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ec": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ed": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ee": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ef": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f0": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f1": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f2": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f3": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f4": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f5": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f6": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f7": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f8": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000f9": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fa": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fb": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fc": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fd": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000fe": { + "balance": "1" + }, + "0x00000000000000000000000000000000000000ff": { + "balance": "1" + }, + "0x000000000000000000000000000000000000000b": { + "balance": "0", + "nonce": "1", + "code": "0x3373fffffffffffffffffffffffffffffffffffffffe14604457602036146024575f5ffd5b620180005f350680545f35146037575f5ffd5b6201800001545f5260205ff35b42620180004206555f3562018000420662018000015500" + }, + "0x6f22fFbC56eFF051aECF839396DD1eD9aD6BBA9D": { + "balance": "0", + "code": "0x60806040526004361061003f5760003560e01c806301ffc9a71461004457806322895118146100a4578063621fd130146101ba578063c5f2892f14610244575b600080fd5b34801561005057600080fd5b506100906004803603602081101561006757600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661026b565b604080519115158252519081900360200190f35b6101b8600480360360808110156100ba57600080fd5b8101906020810181356401000000008111156100d557600080fd5b8201836020820111156100e757600080fd5b8035906020019184600183028401116401000000008311171561010957600080fd5b91939092909160208101903564010000000081111561012757600080fd5b82018360208201111561013957600080fd5b8035906020019184600183028401116401000000008311171561015b57600080fd5b91939092909160208101903564010000000081111561017957600080fd5b82018360208201111561018b57600080fd5b803590602001918460018302840111640100000000831117156101ad57600080fd5b919350915035610304565b005b3480156101c657600080fd5b506101cf6110b5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102095781810151838201526020016101f1565b50505050905090810190601f1680156102365780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025057600080fd5b506102596110c7565b60408051918252519081900360200190f35b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a70000000000000000000000000000000000000000000000000000000014806102fe57507fffffffff0000000000000000000000000000000000000000000000000000000082167f8564090700000000000000000000000000000000000000000000000000000000145b92915050565b6030861461035d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118056026913960400191505060405180910390fd5b602084146103b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603681526020018061179c6036913960400191505060405180910390fd5b6060821461040f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806118786029913960400191505060405180910390fd5b670de0b6b3a7640000341015610470576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806118526026913960400191505060405180910390fd5b633b9aca003406156104cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806117d26033913960400191505060405180910390fd5b633b9aca00340467ffffffffffffffff811115610535576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061182b6027913960400191505060405180910390fd5b6060610540826114ba565b90507f649bbc62d0e31342afea4e5cd82d4049e7e1ee912fc0889aa790803be39038c589898989858a8a6105756020546114ba565b6040805160a0808252810189905290819060208201908201606083016080840160c085018e8e80828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910187810386528c815260200190508c8c808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920188810386528c5181528c51602091820193918e019250908190849084905b83811015610648578181015183820152602001610630565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b5086810383528881526020018989808284376000838201819052601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018881038452895181528951602091820193918b019250908190849084905b838110156106ef5781810151838201526020016106d7565b50505050905090810190601f16801561071c5780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a1600060028a8a600060801b604051602001808484808284377fffffffffffffffffffffffffffffffff0000000000000000000000000000000090941691909301908152604080517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0818403018152601090920190819052815191955093508392506020850191508083835b602083106107fc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016107bf565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610859573d6000803e3d6000fd5b5050506040513d602081101561086e57600080fd5b5051905060006002806108846040848a8c6116fe565b6040516020018083838082843780830192505050925050506040516020818303038152906040526040518082805190602001908083835b602083106108f857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016108bb565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610955573d6000803e3d6000fd5b5050506040513d602081101561096a57600080fd5b5051600261097b896040818d6116fe565b60405160009060200180848480828437919091019283525050604080518083038152602092830191829052805190945090925082918401908083835b602083106109f457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016109b7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610a51573d6000803e3d6000fd5b5050506040513d6020811015610a6657600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610ada57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610a9d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610b37573d6000803e3d6000fd5b5050506040513d6020811015610b4c57600080fd5b50516040805160208101858152929350600092600292839287928f928f92018383808284378083019250505093505050506040516020818303038152906040526040518082805190602001908083835b60208310610bd957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610b9c565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610c36573d6000803e3d6000fd5b5050506040513d6020811015610c4b57600080fd5b50516040518651600291889160009188916020918201918291908601908083835b60208310610ca957805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610c6c565b6001836020036101000a0380198251168184511680821785525050505050509050018367ffffffffffffffff191667ffffffffffffffff1916815260180182815260200193505050506040516020818303038152906040526040518082805190602001908083835b60208310610d4e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610d11565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610dab573d6000803e3d6000fd5b5050506040513d6020811015610dc057600080fd5b5051604080516020818101949094528082019290925280518083038201815260609092019081905281519192909182918401908083835b60208310610e3457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610df7565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015610e91573d6000803e3d6000fd5b5050506040513d6020811015610ea657600080fd5b50519050858114610f02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260548152602001806117486054913960600191505060405180910390fd5b60205463ffffffff11610f60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806117276021913960400191505060405180910390fd5b602080546001019081905560005b60208110156110a9578160011660011415610fa0578260008260208110610f9157fe5b0155506110ac95505050505050565b600260008260208110610faf57fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061102557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610fe8565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa158015611082573d6000803e3d6000fd5b5050506040513d602081101561109757600080fd5b50519250600282049150600101610f6e565b50fe5b50505050505050565b60606110c26020546114ba565b905090565b6020546000908190815b60208110156112f05781600116600114156111e6576002600082602081106110f557fe5b01548460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061116b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161112e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156111c8573d6000803e3d6000fd5b5050506040513d60208110156111dd57600080fd5b505192506112e2565b600283602183602081106111f657fe5b015460405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831061126b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161122e565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa1580156112c8573d6000803e3d6000fd5b5050506040513d60208110156112dd57600080fd5b505192505b6002820491506001016110d1565b506002826112ff6020546114ba565b600060401b6040516020018084815260200183805190602001908083835b6020831061135a57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161131d565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790527fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000095909516920191825250604080518083037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8018152601890920190819052815191955093508392850191508083835b6020831061143f57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611402565b51815160209384036101000a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01801990921691161790526040519190930194509192505080830381855afa15801561149c573d6000803e3d6000fd5b5050506040513d60208110156114b157600080fd5b50519250505090565b60408051600880825281830190925260609160208201818036833701905050905060c082901b8060071a60f81b826000815181106114f457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060061a60f81b8260018151811061153757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060051a60f81b8260028151811061157a57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060041a60f81b826003815181106115bd57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060031a60f81b8260048151811061160057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060021a60f81b8260058151811061164357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060011a60f81b8260068151811061168657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508060001a60f81b826007815181106116c957fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535050919050565b6000808585111561170d578182fd5b83861115611719578182fd5b505082019391909203915056fe4465706f736974436f6e74726163743a206d65726b6c6520747265652066756c6c4465706f736974436f6e74726163743a207265636f6e7374727563746564204465706f7369744461746120646f6573206e6f74206d6174636820737570706c696564206465706f7369745f646174615f726f6f744465706f736974436f6e74726163743a20696e76616c6964207769746864726177616c5f63726564656e7469616c73206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c7565206e6f74206d756c7469706c65206f6620677765694465706f736974436f6e74726163743a20696e76616c6964207075626b6579206c656e6774684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f20686967684465706f736974436f6e74726163743a206465706f7369742076616c756520746f6f206c6f774465706f736974436f6e74726163743a20696e76616c6964207369676e6174757265206c656e677468a26469706673582212201dd26f37a621703009abf16e77e69c93dc50c79db7f6cc37543e3e0e3decdc9764736f6c634300060b0033", + "storage": { + "0x0000000000000000000000000000000000000000000000000000000000000022": "0xf5a5fd42d16a20302798ef6ed309979b43003d2320d9f0e8ea9831a92759fb4b", + "0x0000000000000000000000000000000000000000000000000000000000000023": "0xdb56114e00fdd4c1f85c892bf35ac9a89289aaecb1ebd0a96cde606a748b5d71", + "0x0000000000000000000000000000000000000000000000000000000000000024": "0xc78009fdf07fc56a11f122370658a353aaa542ed63e44c4bc15ff4cd105ab33c", + "0x0000000000000000000000000000000000000000000000000000000000000025": "0x536d98837f2dd165a55d5eeae91485954472d56f246df256bf3cae19352a123c", + "0x0000000000000000000000000000000000000000000000000000000000000026": "0x9efde052aa15429fae05bad4d0b1d7c64da64d03d7a1854a588c2cb8430c0d30", + "0x0000000000000000000000000000000000000000000000000000000000000027": "0xd88ddfeed400a8755596b21942c1497e114c302e6118290f91e6772976041fa1", + "0x0000000000000000000000000000000000000000000000000000000000000028": "0x87eb0ddba57e35f6d286673802a4af5975e22506c7cf4c64bb6be5ee11527f2c", + "0x0000000000000000000000000000000000000000000000000000000000000029": "0x26846476fd5fc54a5d43385167c95144f2643f533cc85bb9d16b782f8d7db193", + "0x000000000000000000000000000000000000000000000000000000000000002a": "0x506d86582d252405b840018792cad2bf1259f1ef5aa5f887e13cb2f0094f51e1", + "0x000000000000000000000000000000000000000000000000000000000000002b": "0xffff0ad7e659772f9534c195c815efc4014ef1e1daed4404c06385d11192e92b", + "0x000000000000000000000000000000000000000000000000000000000000002c": "0x6cf04127db05441cd833107a52be852868890e4317e6a02ab47683aa75964220", + "0x000000000000000000000000000000000000000000000000000000000000002d": "0xb7d05f875f140027ef5118a2247bbb84ce8f2f0f1123623085daf7960c329f5f", + "0x000000000000000000000000000000000000000000000000000000000000002e": "0xdf6af5f5bbdb6be9ef8aa618e4bf8073960867171e29676f8b284dea6a08a85e", + "0x000000000000000000000000000000000000000000000000000000000000002f": "0xb58d900f5e182e3c50ef74969ea16c7726c549757cc23523c369587da7293784", + "0x0000000000000000000000000000000000000000000000000000000000000030": "0xd49a7502ffcfb0340b1d7885688500ca308161a7f96b62df9d083b71fcc8f2bb", + "0x0000000000000000000000000000000000000000000000000000000000000031": "0x8fe6b1689256c0d385f42f5bbe2027a22c1996e110ba97c171d3e5948de92beb", + "0x0000000000000000000000000000000000000000000000000000000000000032": "0x8d0d63c39ebade8509e0ae3c9c3876fb5fa112be18f905ecacfecb92057603ab", + "0x0000000000000000000000000000000000000000000000000000000000000033": "0x95eec8b2e541cad4e91de38385f2e046619f54496c2382cb6cacd5b98c26f5a4", + "0x0000000000000000000000000000000000000000000000000000000000000034": "0xf893e908917775b62bff23294dbbe3a1cd8e6cc1c35b4801887b646a6f81f17f", + "0x0000000000000000000000000000000000000000000000000000000000000035": "0xcddba7b592e3133393c16194fac7431abf2f5485ed711db282183c819e08ebaa", + "0x0000000000000000000000000000000000000000000000000000000000000036": "0x8a8d7fe3af8caa085a7639a832001457dfb9128a8061142ad0335629ff23ff9c", + "0x0000000000000000000000000000000000000000000000000000000000000037": "0xfeb3c337d7a51a6fbf00b9e34c52e1c9195c969bd4e7a0bfd51d5c5bed9c1167", + "0x0000000000000000000000000000000000000000000000000000000000000038": "0xe71f0aa83cc32edfbefa9f4d3e0174ca85182eec9f3a09f6a6c0df6377a510d7", + "0x0000000000000000000000000000000000000000000000000000000000000039": "0x31206fa80a50bb6abe29085058f16212212a60eec8f049fecb92d8c8e0a84bc0", + "0x000000000000000000000000000000000000000000000000000000000000003a": "0x21352bfecbeddde993839f614c3dac0a3ee37543f9b412b16199dc158e23b544", + "0x000000000000000000000000000000000000000000000000000000000000003b": "0x619e312724bb6d7c3153ed9de791d764a366b389af13c58bf8a8d90481a46765", + "0x000000000000000000000000000000000000000000000000000000000000003c": "0x7cdd2986268250628d0c10e385c58c6191e6fbe05191bcc04f133f2cea72c1c4", + "0x000000000000000000000000000000000000000000000000000000000000003d": "0x848930bd7ba8cac54661072113fb278869e07bb8587f91392933374d017bcbe1", + "0x000000000000000000000000000000000000000000000000000000000000003e": "0x8869ff2c22b28cc10510d9853292803328be4fb0e80495e8bb8d271f5b889636", + "0x000000000000000000000000000000000000000000000000000000000000003f": "0xb5fe28e79f1b850f8658246ce9b6a1e7b49fc06db7143e8fe0b4f2b0c5523a5c", + "0x0000000000000000000000000000000000000000000000000000000000000040": "0x985e929f70af28d0bdd1a90a808f977f597c7c778c489e98d3bd8910d31ac0f7" + } + }, + "0x454b0EA7d8aD3C56D0CF2e44Ed97b2Feab4D7AF2": { + "balance": "1000000000000000000000000000" + }, + "0xd3248BA3E5492D767F8e427Cb9C7B9D5C3972D7B": { + "balance": "1000000000000000000000000000" + }, + "0xAD01b55d7c3448B8899862eb335FBb17075d8DE2": { + "balance": "1000000000000000000000000000" + }, + "0x7e454a14B8e7528465eeF86f0DC1da4f235d9D79": { + "balance": "1000000000000000000000000000" + }, + "0x7a40026A3b9A41754a95EeC8c92C6B99886f440C": { + "balance": "1000000000000000000000000000" + }, + "0x8c4D8CDD1f474510Dd70D66F2785a3a38a29AC1A": { + "balance": "1000000000000000000000000000" + }, + "0xfC7360b3b28cf4204268A8354dbEc60720d155D2": { + "balance": "1000000000000000000000000000" + }, + "0x2F7626bBDb8c0f9071bC98046Ef6fDed2167F97F": { + "balance": "1000000000000000000000000000" + }, + "0x752CE31Dec0dde7D1563CdF6438d892De2D4FBee": { + "balance": "1000000000000000000000000000" + }, + "0x455f42d91096c4Aa708D7Cbcb2DC499dE89C402c": { + "balance": "1000000000000000000000000000" + }, + "0x85154341488732D57a97F54AB9706Bc4B71B8636": { + "balance": "1000000000000000000000000000" + }, + "0x6a9CcA73d4Ff3a249fa778C7651f4Df8B9fFa0Df": { + "balance": "1000000000000000000000000000" + }, + "0xee2d0567AAe8080CA269b7908F4aF8BBb59A6804": { + "balance": "1000000000000000000000000000" + }, + "0xDd8D4027078a471816e4Ef7F69aFc0A5d2947dDc": { + "balance": "1000000000000000000000000000" + }, + "0x20466E9A67f299F6056bE52A50ea324FA6Bd05D5": { + "balance": "1000000000000000000000000000" + }, + "0x03F24BB0C9cfb30217Ff992A36ae9230F2A1697f": { + "balance": "1000000000000000000000000000" + }, + "0x032d8372C519c3927b87BDe4479E846a81EF2d10": { + "balance": "1000000000000000000000000000" + }, + "0xF863DF14954df73804b3150F3754a8F98CBB1D0d": { + "balance": "1000000000000000000000000000" + }, + "0xbe918A6aef1920F3706E23d153146aA6C5982620": { + "balance": "1000000000000000000000000000" + }, + "0xA0c7edA3CE474BC670A11EA9537cBEfd36331123": { + "balance": "1000000000000000000000000000" + }, + "0xF03b43BeB861044492Eb43E247bEE2AC6C80c651": { + "balance": "1000000000000000000000000000" + } + }, + "coinbase": "0x0000000000000000000000000000000000000000", + "difficulty": "0x01", + "extraData": "", + "gasLimit": "0x17D7840", + "nonce": "0x1234", + "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "timestamp": "1712918460" +} diff --git a/packages/client/test/testdata/gethk5vecs/block0.rlp.hex b/packages/client/test/testdata/gethk5vecs/block0.rlp.hex new file mode 100644 index 000000000..ac70bcfac --- /dev/null +++ b/packages/client/test/testdata/gethk5vecs/block0.rlp.hex @@ -0,0 +1 @@ +f9021ff90219a00000000000000000000000000000000000000000000000000000000000000000a01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a03b8c134d342aa849e6d7c54d2f348ddff8afab4e1b929a4b97d0db0a3433cbf0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000083020000808347e7c4808080a00000000000000000000000000000000000000000000000000000000000000000880000000000000000843b9aca00a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421c0c0c0 \ No newline at end of file diff --git a/packages/client/test/testdata/gethk5vecs/block1.rlp.hex b/packages/client/test/testdata/gethk5vecs/block1.rlp.hex new file mode 100644 index 000000000..bf7b3b162 --- /dev/null +++ b/packages/client/test/testdata/gethk5vecs/block1.rlp.hex @@ -0,0 +1 @@ +f90353f90218a0b6972519182a58359ea082793c0f2f8bf13516ad7b247fa86b31666b9978872ba01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a02b9e086dad8fa5f094d05377540c910bd200ebc2ddde9cbdf556edf01fbe571ea05bc6adb39ea9aa931ff304798334ca7079af7338ae6c0aa5fa309acb3d0a5b15a0251f2cb798e965c5d9b11c882f37c69fd2c42b314fabe64d2b4998c76eb93ae8b901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080018347e7c482f6180a80a0000000000000000000000000000000000000000000000000000000000000000088000000000000000084342770c0a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f90133f8658084342770c08252089400020300000000000000000000000000000000008203e78026a012b305f880108f997fba308aed436c3f9579cc3cd974fbba42d4dbed5eb5bf28a04bfb28644ea72bd4f6d668fbbed3a0352c3318cee582eec7933dbd06380eaa9ff8650184342770c08252089400000000000000000000000000000000000000008203e78025a035084f770e2443be85a5c774532dbacda1f5d0161876cec312e08008833f0a52a028c346755226a6f34f8c83dd9634ce232f71930ed3d56beb660877ee1400244bf8630284342770c0825208940000000000000000000000000000000000000000808026a0eb6949fa8562003ad7492e200b7b73a0c68de8c84998683863c87335d7f7ad28a054f2f110f801036824d6952471d3e3959dd58e639d9169b26632ea1bb814cfecc0c0 \ No newline at end of file diff --git a/packages/client/test/testdata/gethk5vecs/block2.rlp.hex b/packages/client/test/testdata/gethk5vecs/block2.rlp.hex new file mode 100644 index 000000000..0553448e5 --- /dev/null +++ b/packages/client/test/testdata/gethk5vecs/block2.rlp.hex @@ -0,0 +1 @@ +f90b57f90219a08e7e37a7664e1d835638e774cc86cf76c10c205057761512066ca88155e6d8aca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347940000000000000000000000000000000000000000a055642da29f7dc1fc26acc9402343ba000849ec7c0e4f4f4305a9a07ce5cd4c60a002010f59e092529d1f2b457e7c1911a08cdf728a14ac1088ea9615dce3b87447a013f13a8cb9b8b9ad01f1b891c6b56b212f86b01f61541167d30cd2fd23d27bedb901000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080028347e7c48303ea631480a00000000000000000000000000000000000000000000000000000000000000000880000000000000000842dcf2261a056e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421f90936f8650384342770c08252089401020300000000000000000000000000000000008203e78026a0b1dc957ad929efeadb591bd77121aea2a1808c8a82e460d671aaccce2e96855aa038de06965d668cfaeb7d33d97e3c8e03380aac057741afa265756b32d07c43b0f8650484342770c08252089400000000000000000000000000000000000000008203e78025a013c16fdd3018f4cdd2db8cd0cdf694973de65df7179bbb0c10de42583acaed7aa0633d469034029959d960c23d3b028ae68360c1a4a66663f4d841aaca69b0c6ebf8630584342770c0825208940000000000000000000000000000000000000000808025a0640b2c69c75bedf0b9388e5b60e40ea6f4ea0a084b6660ab27ace0c66dfc04c7a052dc3febc7ca404f37b267a961de42ea35e6de362fcefc6f6928a830837f0ce5f86a0684342770c0832dc6c080109a6060604052600a8060106000396000f360606040526008565b0026a0e909f28a02715713732d38899d8dfe97688ffa3dc7a96a5072b367bac35badcba061e24f56eab4f791158b16ca771b7914d85d401f549618329624be3d546adef9f907940784342770c0832dc6c08080b9074260806040526040516100109061017b565b604051809103906000f08015801561002c573d6000803e3d6000fd5b506000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561007857600080fd5b5060008067ffffffffffffffff8111156100955761009461024a565b5b6040519080825280601f01601f1916602001820160405280156100c75781602001600182028036833780820191505090505b50905060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506020600083833c81610101906101e3565b60405161010d90610187565b61011791906101a3565b604051809103906000f080158015610133573d6000803e3d6000fd5b50600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061029b565b60d58061046783390190565b6102068061053c83390190565b61019d816101d9565b82525050565b60006020820190506101b86000830184610194565b92915050565b6000819050602082019050919050565b600081519050919050565b6000819050919050565b60006101ee826101ce565b826101f8846101be565b905061020381610279565b925060208210156102435761023e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080261028e565b831692505b5050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600061028582516101d9565b80915050919050565b600082821b905092915050565b6101bd806102aa6000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d565b60405180910390f35b60006001905090565b6057816076565b82525050565b6000602082019050607060008301846050565b92915050565b600081905091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddda3e553245a99afc4eeefb2fbae5327aa64736f6c63430008070033608060405234801561001057600080fd5b5060405161020638038061020683398181016040528101906100329190610063565b60018160001c6100429190610090565b60008190555050610145565b60008151905061005d8161012e565b92915050565b60006020828403121561007957610078610129565b5b60006100878482850161004e565b91505092915050565b600061009b826100f0565b91506100a6836100f0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156100db576100da6100fa565b5b828201905092915050565b6000819050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b610137816100e6565b811461014257600080fd5b50565b60b3806101536000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806381ca91d314602d575b600080fd5b60336047565b604051603e9190605a565b60405180910390f35b60005481565b6054816073565b82525050565b6000602082019050606d6000830184604d565b92915050565b600081905091905056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b74a413036d6063ca6a0998ca4264736f6c6343000807003326a0e910089d33abf2c4fbc11ae870a94928bceb63362c2df12d88769e40132c69aba04c148c16c0b06a51ccf2f9644552a4510cce5dda2626c1912b0ddb8a738020a2c0c0 \ No newline at end of file diff --git a/packages/client/test/testdata/gethk5vecs/statediffs.json b/packages/client/test/testdata/gethk5vecs/statediffs.json new file mode 100644 index 000000000..d81d1e300 --- /dev/null +++ b/packages/client/test/testdata/gethk5vecs/statediffs.json @@ -0,0 +1,457 @@ +[ + [ + { + "stem": "0x274cde18dd9dbb04caf16ad5ee969c19fe6ca764d5688b5e1d419f4ac6cd16", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 1, + "currentValue": "0x000064a7b3b6e00d000000000000000000000000000000000000000000000000", + "newValue": "0x32e658dd9084e00d000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0300000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { "suffix": 4, "currentValue": null, "newValue": null } + ] + }, + { + "stem": "0x87b1ab04d20704398264fcc43eb9e9b1839b1595fcb8e9cd3b8071694658bf", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0xe703000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { "suffix": 4, "currentValue": null, "newValue": null } + ] + }, + { + "stem": "0x97f2911f5efe08b74c28727d004e36d260225e73525fe2a300c8f58c7ffd76", + "suffixDiffs": [ + { + "suffix": 64, + "currentValue": null, + "newValue": "0xb6972519182a58359ea082793c0f2f8bf13516ad7b247fa86b31666b9978872b" + } + ] + }, + { + "stem": "0xbf101a6e1c8e83c11bd203a582c7981b91097ec55cbd344ce09005c1f26d19", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0xe703000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { "suffix": 4, "currentValue": null, "newValue": null } + ] + } + ], + [ + { + "stem": "0x0785762a8d643f3892d163f783fe1d37e4e5cf63d2b08dff0dead8cdf0b7ce", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc13691f74686a63a183168600bde00cbd5748529bbb12949e384b17398e4557a" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": "0xb600000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 128, + "currentValue": null, + "newValue": "0x006080604052348015600f57600080fd5b506004361060285760003560e01c80" + }, + { + "suffix": 129, + "currentValue": null, + "newValue": "0x0063ab5ed15014602d575b600080fd5b60336047565b604051603e9190605d56" + }, + { + "suffix": 130, + "currentValue": null, + "newValue": "0x005b60405180910390f35b60006001905090565b6057816076565b8252505056" + }, + { + "suffix": 131, + "currentValue": null, + "newValue": "0x005b6000602082019050607060008301846050565b92915050565b6000819050" + }, + { + "suffix": 132, + "currentValue": null, + "newValue": "0x0091905056fea26469706673582212203a14eb0d5cd07c277d3e24912f110ddd" + }, + { + "suffix": 133, + "currentValue": null, + "newValue": "0x14a3e553245a99afc4eeefb2fbae5327aa64736f6c6343000807003300000000" + } + ] + }, + { + "stem": "0x274cde18dd9dbb04caf16ad5ee969c19fe6ca764d5688b5e1d419f4ac6cd16", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 1, + "currentValue": "0x32e658dd9084e00d000000000000000000000000000000000000000000000000", + "newValue": "0x14c4c8525ab8df0d000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": "0x0300000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x0800000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { "suffix": 4, "currentValue": null, "newValue": null } + ] + }, + { + "stem": "0x97f2911f5efe08b74c28727d004e36d260225e73525fe2a300c8f58c7ffd76", + "suffixDiffs": [ + { + "suffix": 65, + "currentValue": null, + "newValue": "0x8e7e37a7664e1d835638e774cc86cf76c10c205057761512066ca88155e6d8ac" + } + ] + }, + { + "stem": "0xa839ecb4f7e5dca80cd0b9e8590d3cde88af8042c418a459c7539b3d318b99", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0x59580f918eb81909c7f6139444354459095c3588e72895bcf6f4192dc412998d" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": "0xb300000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 64, + "currentValue": null, + "newValue": "0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac" + }, + { + "suffix": 128, + "currentValue": null, + "newValue": "0x006080604052348015600f57600080fd5b506004361060285760003560e01c80" + }, + { + "suffix": 129, + "currentValue": null, + "newValue": "0x006381ca91d314602d575b600080fd5b60336047565b604051603e9190605a56" + }, + { + "suffix": 130, + "currentValue": null, + "newValue": "0x005b60405180910390f35b60005481565b6054816073565b82525050565b6000" + }, + { + "suffix": 131, + "currentValue": null, + "newValue": "0x00602082019050606d6000830184604d565b92915050565b6000819050919050" + }, + { + "suffix": 132, + "currentValue": null, + "newValue": "0x0056fea26469706673582212209bff7098a2f526de1ad499866f27d6d0d6f17b" + }, + { + "suffix": 133, + "currentValue": null, + "newValue": "0x0174a413036d6063ca6a0998ca4264736f6c6343000807003300000000000000" + } + ] + }, + { + "stem": "0xbf101a6e1c8e83c11bd203a582c7981b91097ec55cbd344ce09005c1f26d19", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 1, + "currentValue": "0xe703000000000000000000000000000000000000000000000000000000000000", + "newValue": "0x8b2ce616d8180000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { "suffix": 4, "currentValue": null, "newValue": null } + ] + }, + { + "stem": "0xcac9a3e8dd152c9b5f8abcd254f1abe57d4acde35cfe0f919b43e6f0930714", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0xe703000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { "suffix": 4, "currentValue": null, "newValue": null } + ] + }, + { + "stem": "0xd141d84155cf135593f0ac888e4af96c360bbc4d82dd9164311b3932ab9b9b", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x1000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xd1d29ee74a6d03244189ddb39239adc2a5f77ba91a8df459f17a172dbd96213d" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": "0x0a00000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 128, + "currentValue": null, + "newValue": "0x0060606040526008565b00000000000000000000000000000000000000000000" + } + ] + }, + { + "stem": "0xddb1869fe308ddab3660375687fd2a3f94434c961ed68fc8beb6fc8459771c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0300000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0x855d6153e73150a38cab4b29ba925205be4f569cc2b5e049dfe5aca12d8ed260" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": "0xbd01000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 64, + "currentValue": null, + "newValue": "0x0000000000000000000000000f2cc432c8892c12eede08774adfd63df6f49282" + }, + { + "suffix": 65, + "currentValue": null, + "newValue": "0x00000000000000000000000074b186f98c406a19aaf31b542b2b2353fb1577f6" + }, + { + "suffix": 128, + "currentValue": null, + "newValue": "0x00608060405234801561001057600080fd5b506004361061002b5760003560e0" + }, + { + "suffix": 129, + "currentValue": null, + "newValue": "0x001c8063f566852414610030575b600080fd5b61003861004e565b6040516100" + }, + { + "suffix": 130, + "currentValue": null, + "newValue": "0x01459190610146565b60405180910390f35b6000600160009054906101000a90" + }, + { + "suffix": 131, + "currentValue": null, + "newValue": "0x000473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffff" + }, + { + "suffix": 132, + "currentValue": null, + "newValue": "0x0dffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e0" + }, + { + "suffix": 133, + "currentValue": null, + "newValue": "0x001b815260040160206040518083038186803b1580156100b857600080fd5b50" + }, + { + "suffix": 134, + "currentValue": null, + "newValue": "0x005afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f1960" + }, + { + "suffix": 135, + "currentValue": null, + "newValue": "0x011f820116820180604052508101906100f0919061010a565b905090565b6000" + }, + { + "suffix": 136, + "currentValue": null, + "newValue": "0x008151905061010481610170565b92915050565b600060208284031215610120" + }, + { + "suffix": 137, + "currentValue": null, + "newValue": "0x005761011f61016b565b5b600061012e848285016100f5565b91505092915050" + }, + { + "suffix": 138, + "currentValue": null, + "newValue": "0x00565b61014081610161565b82525050565b600060208201905061015b600083" + }, + { + "suffix": 139, + "currentValue": null, + "newValue": "0x000184610137565b92915050565b6000819050919050565b600080fd5b610179" + }, + { + "suffix": 140, + "currentValue": null, + "newValue": "0x0081610161565b811461018457600080fd5b5056fea2646970667358221220a6" + }, + { + "suffix": 141, + "currentValue": null, + "newValue": "0x00a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f1" + }, + { + "suffix": 142, + "currentValue": null, + "newValue": "0x1064736f6c634300080700330000000000000000000000000000000000000000" + } + ] + } + ] +] diff --git a/packages/client/test/testdata/gethk5vecs/traces.jsonl b/packages/client/test/testdata/gethk5vecs/traces.jsonl new file mode 100644 index 000000000..1089e35e1 --- /dev/null +++ b/packages/client/test/testdata/gethk5vecs/traces.jsonl @@ -0,0 +1,529 @@ +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"output":"","gasUsed":"0x0"} +{"pc":0,"op":96,"gas":"0x2cdae2","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2cdadf","gasCost":"0x3","memSize":0,"stack":["0x60"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2cdadc","gasCost":"0xc","memSize":0,"stack":["0x60","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":96,"gas":"0x2cdad0","gasCost":"0x3","memSize":96,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":7,"op":128,"gas":"0x2cdacd","gasCost":"0x3","memSize":96,"stack":["0xa"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":8,"op":96,"gas":"0x2cdaca","gasCost":"0x3","memSize":96,"stack":["0xa","0xa"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":10,"op":96,"gas":"0x2cdac7","gasCost":"0x3","memSize":96,"stack":["0xa","0xa","0x10"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":12,"op":57,"gas":"0x2cdac4","gasCost":"0x6","memSize":96,"stack":["0xa","0xa","0x10","0x0"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":13,"op":96,"gas":"0x2cdabe","gasCost":"0x3","memSize":96,"stack":["0xa"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":15,"op":243,"gas":"0x2cdabb","gasCost":"0x0","memSize":96,"stack":["0xa","0x0"],"depth":1,"refund":0,"opName":"RETURN"} +{"output":"60606040526008565b00","gasUsed":"0x85b"} +{"pc":0,"op":96,"gas":"0x2c72ba","gasCost":"0x3","memSize":0,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2c72b7","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2c72b4","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":96,"gas":"0x2c72a8","gasCost":"0x3","memSize":96,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":7,"op":81,"gas":"0x2c72a5","gasCost":"0x3","memSize":96,"stack":["0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":8,"op":97,"gas":"0x2c72a2","gasCost":"0x3","memSize":96,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":11,"op":144,"gas":"0x2c729f","gasCost":"0x3","memSize":96,"stack":["0x80","0x10"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":12,"op":97,"gas":"0x2c729c","gasCost":"0x3","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":15,"op":86,"gas":"0x2c7299","gasCost":"0x8","memSize":96,"stack":["0x10","0x80","0x17b"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":379,"op":91,"gas":"0x2c7291","gasCost":"0x1","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":380,"op":96,"gas":"0x2c7290","gasCost":"0x3","memSize":96,"stack":["0x10","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":382,"op":128,"gas":"0x2c728d","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":383,"op":97,"gas":"0x2c728a","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5","0xd5"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":386,"op":131,"gas":"0x2c7287","gasCost":"0x3","memSize":96,"stack":["0x10","0x80","0xd5","0xd5","0x467"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":387,"op":57,"gas":"0x2c7284","gasCost":"0x30","memSize":96,"stack":["0x10","0x80","0xd5","0xd5","0x467","0x80"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":388,"op":1,"gas":"0x2c7254","gasCost":"0x3","memSize":352,"stack":["0x10","0x80","0xd5"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":389,"op":144,"gas":"0x2c7251","gasCost":"0x3","memSize":352,"stack":["0x10","0x155"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":390,"op":86,"gas":"0x2c724e","gasCost":"0x8","memSize":352,"stack":["0x155","0x10"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":16,"op":91,"gas":"0x2c7246","gasCost":"0x1","memSize":352,"stack":["0x155"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":17,"op":96,"gas":"0x2c7245","gasCost":"0x3","memSize":352,"stack":["0x155"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":19,"op":81,"gas":"0x2c7242","gasCost":"0x3","memSize":352,"stack":["0x155","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":20,"op":128,"gas":"0x2c723f","gasCost":"0x3","memSize":352,"stack":["0x155","0x80"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":21,"op":145,"gas":"0x2c723c","gasCost":"0x3","memSize":352,"stack":["0x155","0x80","0x80"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":22,"op":3,"gas":"0x2c7239","gasCost":"0x3","memSize":352,"stack":["0x80","0x80","0x155"],"depth":1,"refund":0,"opName":"SUB"} +{"pc":23,"op":144,"gas":"0x2c7236","gasCost":"0x3","memSize":352,"stack":["0x80","0xd5"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":24,"op":96,"gas":"0x2c7233","gasCost":"0x3","memSize":352,"stack":["0xd5","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":26,"op":240,"gas":"0x2c7230","gasCost":"0x3f6","memSize":352,"stack":["0xd5","0x80","0x0"],"depth":1,"refund":0,"opName":"CREATE"} +{"pc":0,"op":96,"gas":"0x2bbc82","gasCost":"0x3","memSize":0,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2bbc7f","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2bbc7c","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":52,"gas":"0x2bbc70","gasCost":"0x2","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"CALLVALUE"} +{"pc":6,"op":128,"gas":"0x2bbc6e","gasCost":"0x3","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":7,"op":21,"gas":"0x2bbc6b","gasCost":"0x3","memSize":96,"stack":["0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":8,"op":97,"gas":"0x2bbc68","gasCost":"0x3","memSize":96,"stack":["0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":11,"op":87,"gas":"0x2bbc65","gasCost":"0xa","memSize":96,"stack":["0x0","0x1","0x10"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":16,"op":91,"gas":"0x2bbc5b","gasCost":"0x1","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":17,"op":80,"gas":"0x2bbc5a","gasCost":"0x2","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":18,"op":96,"gas":"0x2bbc58","gasCost":"0x3","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":20,"op":128,"gas":"0x2bbc55","gasCost":"0x3","memSize":96,"stack":["0xb6"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":21,"op":97,"gas":"0x2bbc52","gasCost":"0x3","memSize":96,"stack":["0xb6","0xb6"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":24,"op":96,"gas":"0x2bbc4f","gasCost":"0x3","memSize":96,"stack":["0xb6","0xb6","0x1f"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":26,"op":57,"gas":"0x2bbc4c","gasCost":"0x1e","memSize":96,"stack":["0xb6","0xb6","0x1f","0x0"],"depth":2,"refund":0,"opName":"CODECOPY"} +{"pc":27,"op":96,"gas":"0x2bbc2e","gasCost":"0x3","memSize":192,"stack":["0xb6"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":29,"op":243,"gas":"0x2bbc2b","gasCost":"0x0","memSize":192,"stack":["0xb6","0x0"],"depth":2,"refund":0,"opName":"RETURN"} +{"pc":27,"op":128,"gas":"0x2c3cab","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":28,"op":21,"gas":"0x2c3ca8","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":29,"op":128,"gas":"0x2c3ca5","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":30,"op":21,"gas":"0x2c3ca2","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":31,"op":97,"gas":"0x2c3c9f","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":34,"op":87,"gas":"0x2c3c9c","gasCost":"0xa","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x2c"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":44,"op":91,"gas":"0x2c3c92","gasCost":"0x1","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":45,"op":80,"gas":"0x2c3c91","gasCost":"0x2","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":46,"op":96,"gas":"0x2c3c8f","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":48,"op":128,"gas":"0x2c3c8c","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":49,"op":97,"gas":"0x2c3c89","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":52,"op":10,"gas":"0x2c3c86","gasCost":"0xa","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} +{"pc":53,"op":129,"gas":"0x2c3c7c","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":54,"op":84,"gas":"0x2c3c79","gasCost":"0xc8","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"SLOAD"} +{"pc":55,"op":129,"gas":"0x2c3bb1","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":56,"op":115,"gas":"0x2c3bae","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":77,"op":2,"gas":"0x2c3bab","gasCost":"0x5","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":78,"op":25,"gas":"0x2c3ba6","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"NOT"} +{"pc":79,"op":22,"gas":"0x2c3ba3","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0","0xffffffffffffffffffffffff0000000000000000000000000000000000000000"],"depth":1,"refund":0,"opName":"AND"} +{"pc":80,"op":144,"gas":"0x2c3ba0","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x1","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":81,"op":131,"gas":"0x2c3b9d","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":82,"op":115,"gas":"0x2c3b9a","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":103,"op":22,"gas":"0x2c3b97","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} +{"pc":104,"op":2,"gas":"0x2c3b94","gasCost":"0x5","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":105,"op":23,"gas":"0x2c3b8f","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"OR"} +{"pc":106,"op":144,"gas":"0x2c3b8c","gasCost":"0x3","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":107,"op":85,"gas":"0x2c3b89","gasCost":"0x1f4","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"SSTORE"} +{"pc":108,"op":80,"gas":"0x2c3995","gasCost":"0x2","memSize":352,"stack":["0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"POP"} +{"pc":109,"op":52,"gas":"0x2c3993","gasCost":"0x2","memSize":352,"stack":[],"depth":1,"refund":0,"opName":"CALLVALUE"} +{"pc":110,"op":128,"gas":"0x2c3991","gasCost":"0x3","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":111,"op":21,"gas":"0x2c398e","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":112,"op":97,"gas":"0x2c398b","gasCost":"0x3","memSize":352,"stack":["0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":115,"op":87,"gas":"0x2c3988","gasCost":"0xa","memSize":352,"stack":["0x0","0x1","0x78"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":120,"op":91,"gas":"0x2c397e","gasCost":"0x1","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":121,"op":80,"gas":"0x2c397d","gasCost":"0x2","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":122,"op":96,"gas":"0x2c397b","gasCost":"0x3","memSize":352,"stack":[],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":124,"op":128,"gas":"0x2c3978","gasCost":"0x3","memSize":352,"stack":["0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":125,"op":103,"gas":"0x2c3975","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH8"} +{"pc":134,"op":129,"gas":"0x2c3972","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0xffffffffffffffff"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":135,"op":17,"gas":"0x2c396f","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0xffffffffffffffff","0x0"],"depth":1,"refund":0,"opName":"GT"} +{"pc":136,"op":21,"gas":"0x2c396c","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":137,"op":97,"gas":"0x2c3969","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":140,"op":87,"gas":"0x2c3966","gasCost":"0xa","memSize":352,"stack":["0x0","0x0","0x1","0x95"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":149,"op":91,"gas":"0x2c395c","gasCost":"0x1","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":150,"op":96,"gas":"0x2c395b","gasCost":"0x3","memSize":352,"stack":["0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":152,"op":81,"gas":"0x2c3958","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":153,"op":144,"gas":"0x2c3955","gasCost":"0x3","memSize":352,"stack":["0x0","0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":154,"op":128,"gas":"0x2c3952","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":155,"op":130,"gas":"0x2c394f","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":156,"op":82,"gas":"0x2c394c","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x80"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":157,"op":128,"gas":"0x2c3949","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":158,"op":96,"gas":"0x2c3946","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":160,"op":1,"gas":"0x2c3943","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x1f"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":161,"op":96,"gas":"0x2c3940","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":163,"op":25,"gas":"0x2c393d","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f","0x1f"],"depth":1,"refund":0,"opName":"NOT"} +{"pc":164,"op":22,"gas":"0x2c393a","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1f","0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"],"depth":1,"refund":0,"opName":"AND"} +{"pc":165,"op":96,"gas":"0x2c3937","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":167,"op":1,"gas":"0x2c3934","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0","0x20"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":168,"op":130,"gas":"0x2c3931","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":169,"op":1,"gas":"0x2c392e","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x20","0x80"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":170,"op":96,"gas":"0x2c392b","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":172,"op":82,"gas":"0x2c3928","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0xa0","0x40"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":173,"op":128,"gas":"0x2c3925","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":174,"op":21,"gas":"0x2c3922","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":175,"op":97,"gas":"0x2c391f","gasCost":"0x3","memSize":352,"stack":["0x0","0x80","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":178,"op":87,"gas":"0x2c391c","gasCost":"0xa","memSize":352,"stack":["0x0","0x80","0x0","0x1","0xc7"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":199,"op":91,"gas":"0x2c3912","gasCost":"0x1","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":200,"op":80,"gas":"0x2c3911","gasCost":"0x2","memSize":352,"stack":["0x0","0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":201,"op":144,"gas":"0x2c390f","gasCost":"0x3","memSize":352,"stack":["0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":202,"op":80,"gas":"0x2c390c","gasCost":"0x2","memSize":352,"stack":["0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":203,"op":96,"gas":"0x2c390a","gasCost":"0x3","memSize":352,"stack":["0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":205,"op":128,"gas":"0x2c3907","gasCost":"0x3","memSize":352,"stack":["0x80","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":206,"op":96,"gas":"0x2c3904","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":208,"op":144,"gas":"0x2c3901","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":209,"op":84,"gas":"0x2c38fe","gasCost":"0x64","memSize":352,"stack":["0x80","0x0","0x0","0x0"],"depth":1,"refund":0,"opName":"SLOAD"} +{"pc":210,"op":144,"gas":"0x2c389a","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":211,"op":97,"gas":"0x2c3897","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":214,"op":10,"gas":"0x2c3894","gasCost":"0xa","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} +{"pc":215,"op":144,"gas":"0x2c388a","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0x1"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":216,"op":4,"gas":"0x2c3887","gasCost":"0x5","memSize":352,"stack":["0x80","0x0","0x1","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DIV"} +{"pc":217,"op":115,"gas":"0x2c3882","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":238,"op":22,"gas":"0x2c387f","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} +{"pc":239,"op":144,"gas":"0x2c387c","gasCost":"0x3","memSize":352,"stack":["0x80","0x0","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":240,"op":80,"gas":"0x2c3879","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":241,"op":96,"gas":"0x2c3877","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":243,"op":96,"gas":"0x2c3874","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":245,"op":131,"gas":"0x2c3871","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":246,"op":131,"gas":"0x2c386e","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0","0x80"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":247,"op":60,"gas":"0x2c386b","gasCost":"0x67","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x20","0x0","0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"EXTCODECOPY"} +{"pc":248,"op":129,"gas":"0x2c3804","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":249,"op":97,"gas":"0x2c3801","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":252,"op":144,"gas":"0x2c37fe","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80","0x101"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":253,"op":97,"gas":"0x2c37fb","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":256,"op":86,"gas":"0x2c37f8","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x1e3"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":483,"op":91,"gas":"0x2c37f0","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":484,"op":96,"gas":"0x2c37ef","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":486,"op":97,"gas":"0x2c37ec","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":489,"op":130,"gas":"0x2c37e9","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":490,"op":97,"gas":"0x2c37e6","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":493,"op":86,"gas":"0x2c37e3","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x1ce"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":462,"op":91,"gas":"0x2c37db","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":463,"op":96,"gas":"0x2c37da","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":465,"op":129,"gas":"0x2c37d7","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":466,"op":81,"gas":"0x2c37d4","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0","0x80"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":467,"op":144,"gas":"0x2c37d1","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":468,"op":80,"gas":"0x2c37ce","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":469,"op":145,"gas":"0x2c37cc","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x1ee","0x80","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":470,"op":144,"gas":"0x2c37c9","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1ee"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":471,"op":80,"gas":"0x2c37c6","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x1ee","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":472,"op":86,"gas":"0x2c37c4","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x1ee"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":494,"op":91,"gas":"0x2c37bc","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":495,"op":130,"gas":"0x2c37bb","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":496,"op":97,"gas":"0x2c37b8","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":499,"op":132,"gas":"0x2c37b5","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8"],"depth":1,"refund":0,"opName":"DUP5"} +{"pc":500,"op":97,"gas":"0x2c37b2","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":503,"op":86,"gas":"0x2c37af","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x1be"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":446,"op":91,"gas":"0x2c37a7","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":447,"op":96,"gas":"0x2c37a6","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":449,"op":129,"gas":"0x2c37a3","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":450,"op":144,"gas":"0x2c37a0","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x0","0x80"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":451,"op":80,"gas":"0x2c379d","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":452,"op":96,"gas":"0x2c379b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":454,"op":130,"gas":"0x2c3798","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":455,"op":1,"gas":"0x2c3795","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0x20","0x80"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":456,"op":144,"gas":"0x2c3792","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":457,"op":80,"gas":"0x2c378f","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0xa0","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":458,"op":145,"gas":"0x2c378d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0x1f8","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":459,"op":144,"gas":"0x2c378a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x80","0x1f8"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":460,"op":80,"gas":"0x2c3787","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x1f8","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":461,"op":86,"gas":"0x2c3785","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0","0x1f8"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":504,"op":91,"gas":"0x2c377d","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":505,"op":144,"gas":"0x2c377c","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0x80","0xa0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":506,"op":80,"gas":"0x2c3779","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":507,"op":97,"gas":"0x2c3777","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":510,"op":129,"gas":"0x2c3774","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":511,"op":97,"gas":"0x2c3771","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":514,"op":86,"gas":"0x2c376e","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x279"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":633,"op":91,"gas":"0x2c3766","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":634,"op":96,"gas":"0x2c3765","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":636,"op":97,"gas":"0x2c3762","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":639,"op":130,"gas":"0x2c375f","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":640,"op":81,"gas":"0x2c375c","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0xa0"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":641,"op":97,"gas":"0x2c3759","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":644,"op":86,"gas":"0x2c3756","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1d9"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":473,"op":91,"gas":"0x2c374e","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":474,"op":96,"gas":"0x2c374d","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":476,"op":129,"gas":"0x2c374a","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":477,"op":144,"gas":"0x2c3747","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":478,"op":80,"gas":"0x2c3744","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":479,"op":145,"gas":"0x2c3742","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":480,"op":144,"gas":"0x2c373f","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":481,"op":80,"gas":"0x2c373c","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":482,"op":86,"gas":"0x2c373a","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x285"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":645,"op":91,"gas":"0x2c3732","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":646,"op":128,"gas":"0x2c3731","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":647,"op":145,"gas":"0x2c372e","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":648,"op":80,"gas":"0x2c372b","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":649,"op":80,"gas":"0x2c3729","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":650,"op":145,"gas":"0x2c3727","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x203","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":651,"op":144,"gas":"0x2c3724","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x203"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":652,"op":80,"gas":"0x2c3721","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x203","0xa0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":653,"op":86,"gas":"0x2c371f","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x203"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":515,"op":91,"gas":"0x2c3717","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":516,"op":146,"gas":"0x2c3716","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x0","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP3"} +{"pc":517,"op":80,"gas":"0x2c3713","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":518,"op":96,"gas":"0x2c3711","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":520,"op":130,"gas":"0x2c370e","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":521,"op":16,"gas":"0x2c370b","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x20","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"LT"} +{"pc":522,"op":21,"gas":"0x2c3708","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":523,"op":97,"gas":"0x2c3705","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":526,"op":87,"gas":"0x2c3702","gasCost":"0xa","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0","0x1","0x243"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":579,"op":91,"gas":"0x2c36f8","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":580,"op":80,"gas":"0x2c36f7","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063","0xa0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":581,"op":80,"gas":"0x2c36f5","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063"],"depth":1,"refund":0,"opName":"POP"} +{"pc":582,"op":145,"gas":"0x2c36f3","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x101","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":583,"op":144,"gas":"0x2c36f0","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80","0x101"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":584,"op":80,"gas":"0x2c36ed","gasCost":"0x2","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x101","0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":585,"op":86,"gas":"0x2c36eb","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x101"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":257,"op":91,"gas":"0x2c36e3","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":258,"op":96,"gas":"0x2c36e2","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":260,"op":81,"gas":"0x2c36df","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":261,"op":97,"gas":"0x2c36dc","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":264,"op":144,"gas":"0x2c36d9","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x10d"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":265,"op":97,"gas":"0x2c36d6","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":268,"op":86,"gas":"0x2c36d3","gasCost":"0x8","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x187"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":391,"op":91,"gas":"0x2c36cb","gasCost":"0x1","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":392,"op":97,"gas":"0x2c36ca","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":395,"op":128,"gas":"0x2c36c7","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":396,"op":97,"gas":"0x2c36c4","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":399,"op":131,"gas":"0x2c36c1","gasCost":"0x3","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206","0x53c"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":400,"op":57,"gas":"0x2c36be","gasCost":"0x57","memSize":352,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206","0x206","0x53c","0xa0"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":401,"op":1,"gas":"0x2c3667","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0xa0","0x206"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":402,"op":144,"gas":"0x2c3664","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x10d","0x2a6"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":403,"op":86,"gas":"0x2c3661","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x10d"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":269,"op":91,"gas":"0x2c3659","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":270,"op":97,"gas":"0x2c3658","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":273,"op":145,"gas":"0x2c3655","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x117"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":274,"op":144,"gas":"0x2c3652","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":275,"op":97,"gas":"0x2c364f","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":278,"op":86,"gas":"0x2c364c","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x1a3"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":419,"op":91,"gas":"0x2c3644","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":420,"op":96,"gas":"0x2c3643","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":422,"op":96,"gas":"0x2c3640","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":424,"op":130,"gas":"0x2c363d","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x20"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":425,"op":1,"gas":"0x2c363a","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x20","0x2a6"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":426,"op":144,"gas":"0x2c3637","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x0","0x2c6"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":427,"op":80,"gas":"0x2c3634","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":428,"op":97,"gas":"0x2c3632","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":431,"op":96,"gas":"0x2c362f","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":433,"op":131,"gas":"0x2c362c","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x0"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":434,"op":1,"gas":"0x2c3629","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x0","0x2a6"],"depth":1,"refund":0,"opName":"ADD"} +{"pc":435,"op":132,"gas":"0x2c3626","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6"],"depth":1,"refund":0,"opName":"DUP5"} +{"pc":436,"op":97,"gas":"0x2c3623","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":439,"op":86,"gas":"0x2c3620","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x194"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":404,"op":91,"gas":"0x2c3618","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":405,"op":97,"gas":"0x2c3617","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":408,"op":129,"gas":"0x2c3614","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":409,"op":97,"gas":"0x2c3611","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":412,"op":86,"gas":"0x2c360e","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1d9"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":473,"op":91,"gas":"0x2c3606","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":474,"op":96,"gas":"0x2c3605","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":476,"op":129,"gas":"0x2c3602","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":477,"op":144,"gas":"0x2c35ff","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":478,"op":80,"gas":"0x2c35fc","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":479,"op":145,"gas":"0x2c35fa","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":480,"op":144,"gas":"0x2c35f7","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":481,"op":80,"gas":"0x2c35f4","gasCost":"0x2","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":482,"op":86,"gas":"0x2c35f2","gasCost":"0x8","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x19d"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":413,"op":91,"gas":"0x2c35ea","gasCost":"0x1","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":414,"op":130,"gas":"0x2c35e9","gasCost":"0x3","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"DUP3"} +{"pc":415,"op":82,"gas":"0x2c35e6","gasCost":"0x7","memSize":704,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6"],"depth":1,"refund":0,"opName":"MSTORE"} +{"pc":416,"op":80,"gas":"0x2c35df","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":417,"op":80,"gas":"0x2c35dd","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8","0x2a6"],"depth":1,"refund":0,"opName":"POP"} +{"pc":418,"op":86,"gas":"0x2c35db","gasCost":"0x8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6","0x1b8"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":440,"op":91,"gas":"0x2c35d3","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":441,"op":146,"gas":"0x2c35d2","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x117","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x2c6"],"depth":1,"refund":0,"opName":"SWAP3"} +{"pc":442,"op":145,"gas":"0x2c35cf","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x2a6","0x117"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":443,"op":80,"gas":"0x2c35cc","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117","0x2a6","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":1,"refund":0,"opName":"POP"} +{"pc":444,"op":80,"gas":"0x2c35ca","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117","0x2a6"],"depth":1,"refund":0,"opName":"POP"} +{"pc":445,"op":86,"gas":"0x2c35c8","gasCost":"0x8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x117"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":279,"op":91,"gas":"0x2c35c0","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":280,"op":96,"gas":"0x2c35bf","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":282,"op":81,"gas":"0x2c35bc","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0x40"],"depth":1,"refund":0,"opName":"MLOAD"} +{"pc":283,"op":128,"gas":"0x2c35b9","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0xa0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":284,"op":145,"gas":"0x2c35b6","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x2c6","0xa0","0xa0"],"depth":1,"refund":0,"opName":"SWAP2"} +{"pc":285,"op":3,"gas":"0x2c35b3","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0xa0","0xa0","0x2c6"],"depth":1,"refund":0,"opName":"SUB"} +{"pc":286,"op":144,"gas":"0x2c35b0","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0xa0","0x226"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":287,"op":96,"gas":"0x2c35ad","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x226","0xa0"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":289,"op":240,"gas":"0x2c35aa","gasCost":"0x40c","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x226","0xa0","0x0"],"depth":1,"refund":0,"opName":"CREATE"} +{"pc":0,"op":96,"gas":"0x2b80d8","gasCost":"0x3","memSize":0,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":2,"op":96,"gas":"0x2b80d5","gasCost":"0x3","memSize":0,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":4,"op":82,"gas":"0x2b80d2","gasCost":"0xc","memSize":0,"stack":["0x80","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} +{"pc":5,"op":52,"gas":"0x2b80c6","gasCost":"0x2","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"CALLVALUE"} +{"pc":6,"op":128,"gas":"0x2b80c4","gasCost":"0x3","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":7,"op":21,"gas":"0x2b80c1","gasCost":"0x3","memSize":96,"stack":["0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":8,"op":97,"gas":"0x2b80be","gasCost":"0x3","memSize":96,"stack":["0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":11,"op":87,"gas":"0x2b80bb","gasCost":"0xa","memSize":96,"stack":["0x0","0x1","0x10"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":16,"op":91,"gas":"0x2b80b1","gasCost":"0x1","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":17,"op":80,"gas":"0x2b80b0","gasCost":"0x2","memSize":96,"stack":["0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":18,"op":96,"gas":"0x2b80ae","gasCost":"0x3","memSize":96,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":20,"op":81,"gas":"0x2b80ab","gasCost":"0x3","memSize":96,"stack":["0x40"],"depth":2,"refund":0,"opName":"MLOAD"} +{"pc":21,"op":97,"gas":"0x2b80a8","gasCost":"0x3","memSize":96,"stack":["0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":24,"op":56,"gas":"0x2b80a5","gasCost":"0x2","memSize":96,"stack":["0x80","0x206"],"depth":2,"refund":0,"opName":"CODESIZE"} +{"pc":25,"op":3,"gas":"0x2b80a3","gasCost":"0x3","memSize":96,"stack":["0x80","0x206","0x226"],"depth":2,"refund":0,"opName":"SUB"} +{"pc":26,"op":128,"gas":"0x2b80a0","gasCost":"0x3","memSize":96,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":27,"op":97,"gas":"0x2b809d","gasCost":"0x3","memSize":96,"stack":["0x80","0x20","0x20"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":30,"op":131,"gas":"0x2b809a","gasCost":"0x3","memSize":96,"stack":["0x80","0x20","0x20","0x206"],"depth":2,"refund":0,"opName":"DUP4"} +{"pc":31,"op":57,"gas":"0x2b8097","gasCost":"0xc","memSize":96,"stack":["0x80","0x20","0x20","0x206","0x80"],"depth":2,"refund":0,"opName":"CODECOPY"} +{"pc":32,"op":129,"gas":"0x2b808b","gasCost":"0x3","memSize":160,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":33,"op":129,"gas":"0x2b8088","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":34,"op":1,"gas":"0x2b8085","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80","0x20"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":35,"op":96,"gas":"0x2b8082","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0xa0"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":37,"op":82,"gas":"0x2b807f","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0xa0","0x40"],"depth":2,"refund":0,"opName":"MSTORE"} +{"pc":38,"op":129,"gas":"0x2b807c","gasCost":"0x3","memSize":160,"stack":["0x80","0x20"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":39,"op":1,"gas":"0x2b8079","gasCost":"0x3","memSize":160,"stack":["0x80","0x20","0x80"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":40,"op":144,"gas":"0x2b8076","gasCost":"0x3","memSize":160,"stack":["0x80","0xa0"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":41,"op":97,"gas":"0x2b8073","gasCost":"0x3","memSize":160,"stack":["0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":44,"op":145,"gas":"0x2b8070","gasCost":"0x3","memSize":160,"stack":["0xa0","0x80","0x32"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":45,"op":144,"gas":"0x2b806d","gasCost":"0x3","memSize":160,"stack":["0x32","0x80","0xa0"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":46,"op":97,"gas":"0x2b806a","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":49,"op":86,"gas":"0x2b8067","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x63"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":99,"op":91,"gas":"0x2b805f","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":100,"op":96,"gas":"0x2b805e","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":102,"op":96,"gas":"0x2b805b","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":104,"op":130,"gas":"0x2b8058","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":105,"op":132,"gas":"0x2b8055","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x80"],"depth":2,"refund":0,"opName":"DUP5"} +{"pc":106,"op":3,"gas":"0x2b8052","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x80","0xa0"],"depth":2,"refund":0,"opName":"SUB"} +{"pc":107,"op":18,"gas":"0x2b804f","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x20","0x20"],"depth":2,"refund":0,"opName":"SLT"} +{"pc":108,"op":21,"gas":"0x2b804c","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":109,"op":97,"gas":"0x2b8049","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":112,"op":87,"gas":"0x2b8046","gasCost":"0xa","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x1","0x79"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":121,"op":91,"gas":"0x2b803c","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":122,"op":96,"gas":"0x2b803b","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":124,"op":97,"gas":"0x2b8038","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":127,"op":132,"gas":"0x2b8035","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87"],"depth":2,"refund":0,"opName":"DUP5"} +{"pc":128,"op":130,"gas":"0x2b8032","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":129,"op":133,"gas":"0x2b802f","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x0"],"depth":2,"refund":0,"opName":"DUP6"} +{"pc":130,"op":1,"gas":"0x2b802c","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x0","0x80"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":131,"op":97,"gas":"0x2b8029","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":134,"op":86,"gas":"0x2b8026","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x4e"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":78,"op":91,"gas":"0x2b801e","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":79,"op":96,"gas":"0x2b801d","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":81,"op":129,"gas":"0x2b801a","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":82,"op":81,"gas":"0x2b8017","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0","0x80"],"depth":2,"refund":0,"opName":"MLOAD"} +{"pc":83,"op":144,"gas":"0x2b8014","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":84,"op":80,"gas":"0x2b8011","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":85,"op":97,"gas":"0x2b800f","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":88,"op":129,"gas":"0x2b800c","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":89,"op":97,"gas":"0x2b8009","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":92,"op":86,"gas":"0x2b8006","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x12e"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":302,"op":91,"gas":"0x2b7ffe","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":303,"op":97,"gas":"0x2b7ffd","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":306,"op":129,"gas":"0x2b7ffa","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":307,"op":97,"gas":"0x2b7ff7","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":310,"op":86,"gas":"0x2b7ff4","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xe6"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":230,"op":91,"gas":"0x2b7fec","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":231,"op":96,"gas":"0x2b7feb","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":233,"op":129,"gas":"0x2b7fe8","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":234,"op":144,"gas":"0x2b7fe5","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":235,"op":80,"gas":"0x2b7fe2","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":236,"op":145,"gas":"0x2b7fe0","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":237,"op":144,"gas":"0x2b7fdd","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":238,"op":80,"gas":"0x2b7fda","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":239,"op":86,"gas":"0x2b7fd8","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x137"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":311,"op":91,"gas":"0x2b7fd0","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":312,"op":129,"gas":"0x2b7fcf","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":313,"op":20,"gas":"0x2b7fcc","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"EQ"} +{"pc":314,"op":97,"gas":"0x2b7fc9","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":317,"op":87,"gas":"0x2b7fc6","gasCost":"0xa","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x142"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":322,"op":91,"gas":"0x2b7fbc","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":323,"op":80,"gas":"0x2b7fbb","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":324,"op":86,"gas":"0x2b7fb9","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x5d"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":93,"op":91,"gas":"0x2b7fb1","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":94,"op":146,"gas":"0x2b7fb0","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x87","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":95,"op":145,"gas":"0x2b7fad","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x80","0x87"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":96,"op":80,"gas":"0x2b7faa","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87","0x80","0xa0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":97,"op":80,"gas":"0x2b7fa8","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87","0x80"],"depth":2,"refund":0,"opName":"POP"} +{"pc":98,"op":86,"gas":"0x2b7fa6","gasCost":"0x8","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x87"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":135,"op":91,"gas":"0x2b7f9e","gasCost":"0x1","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":136,"op":145,"gas":"0x2b7f9d","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x0","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":137,"op":80,"gas":"0x2b7f9a","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":138,"op":80,"gas":"0x2b7f98","gasCost":"0x2","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":139,"op":146,"gas":"0x2b7f96","gasCost":"0x3","memSize":160,"stack":["0x32","0xa0","0x80","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":140,"op":145,"gas":"0x2b7f93","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xa0","0x80","0x32"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":141,"op":80,"gas":"0x2b7f90","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32","0x80","0xa0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":142,"op":80,"gas":"0x2b7f8e","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32","0x80"],"depth":2,"refund":0,"opName":"POP"} +{"pc":143,"op":86,"gas":"0x2b7f8c","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x32"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":50,"op":91,"gas":"0x2b7f84","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":51,"op":96,"gas":"0x2b7f83","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":53,"op":129,"gas":"0x2b7f80","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":54,"op":96,"gas":"0x2b7f7d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":56,"op":28,"gas":"0x2b7f7a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"SHR"} +{"pc":57,"op":97,"gas":"0x2b7f77","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":60,"op":145,"gas":"0x2b7f74","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":61,"op":144,"gas":"0x2b7f71","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":62,"op":97,"gas":"0x2b7f6e","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":65,"op":86,"gas":"0x2b7f6b","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x90"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":144,"op":91,"gas":"0x2b7f63","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":145,"op":96,"gas":"0x2b7f62","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":147,"op":97,"gas":"0x2b7f5f","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":150,"op":130,"gas":"0x2b7f5c","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":151,"op":97,"gas":"0x2b7f59","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":154,"op":86,"gas":"0x2b7f56","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0xf0"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":240,"op":91,"gas":"0x2b7f4e","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":241,"op":96,"gas":"0x2b7f4d","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":243,"op":129,"gas":"0x2b7f4a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":244,"op":144,"gas":"0x2b7f47","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":245,"op":80,"gas":"0x2b7f44","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":246,"op":145,"gas":"0x2b7f42","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":247,"op":144,"gas":"0x2b7f3f","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":248,"op":80,"gas":"0x2b7f3c","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":249,"op":86,"gas":"0x2b7f3a","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x9b"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":155,"op":91,"gas":"0x2b7f32","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":156,"op":145,"gas":"0x2b7f31","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":157,"op":80,"gas":"0x2b7f2e","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":158,"op":97,"gas":"0x2b7f2c","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":161,"op":131,"gas":"0x2b7f29","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6"],"depth":2,"refund":0,"opName":"DUP4"} +{"pc":162,"op":97,"gas":"0x2b7f26","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":165,"op":86,"gas":"0x2b7f23","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0xf0"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":240,"op":91,"gas":"0x2b7f1b","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":241,"op":96,"gas":"0x2b7f1a","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":243,"op":129,"gas":"0x2b7f17","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":244,"op":144,"gas":"0x2b7f14","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x0","0x1"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":245,"op":80,"gas":"0x2b7f11","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x1","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":246,"op":145,"gas":"0x2b7f0f","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xa6","0x1","0x1"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":247,"op":144,"gas":"0x2b7f0c","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0x1","0xa6"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":248,"op":80,"gas":"0x2b7f09","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xa6","0x1"],"depth":2,"refund":0,"opName":"POP"} +{"pc":249,"op":86,"gas":"0x2b7f07","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xa6"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":166,"op":91,"gas":"0x2b7eff","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":167,"op":146,"gas":"0x2b7efe","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":168,"op":80,"gas":"0x2b7efb","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"POP"} +{"pc":169,"op":130,"gas":"0x2b7ef9","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":170,"op":127,"gas":"0x2b7ef6","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH32"} +{"pc":203,"op":3,"gas":"0x2b7ef3","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"],"depth":2,"refund":0,"opName":"SUB"} +{"pc":204,"op":130,"gas":"0x2b7ef0","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":205,"op":17,"gas":"0x2b7eed","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"GT"} +{"pc":206,"op":21,"gas":"0x2b7eea","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x0"],"depth":2,"refund":0,"opName":"ISZERO"} +{"pc":207,"op":97,"gas":"0x2b7ee7","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":210,"op":87,"gas":"0x2b7ee4","gasCost":"0xa","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0xdb"],"depth":2,"refund":0,"opName":"JUMPI"} +{"pc":219,"op":91,"gas":"0x2b7eda","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":220,"op":130,"gas":"0x2b7ed9","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":221,"op":130,"gas":"0x2b7ed6","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1"],"depth":2,"refund":0,"opName":"DUP3"} +{"pc":222,"op":1,"gas":"0x2b7ed3","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"ADD"} +{"pc":223,"op":144,"gas":"0x2b7ed0","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":224,"op":80,"gas":"0x2b7ecd","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"POP"} +{"pc":225,"op":146,"gas":"0x2b7ecb","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP3"} +{"pc":226,"op":145,"gas":"0x2b7ec8","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x1","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x42"],"depth":2,"refund":0,"opName":"SWAP2"} +{"pc":227,"op":80,"gas":"0x2b7ec5","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x1"],"depth":2,"refund":0,"opName":"POP"} +{"pc":228,"op":80,"gas":"0x2b7ec3","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":229,"op":86,"gas":"0x2b7ec1","gasCost":"0x8","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x42"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":66,"op":91,"gas":"0x2b7eb9","gasCost":"0x1","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":67,"op":96,"gas":"0x2b7eb8","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":69,"op":129,"gas":"0x2b7eb5","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"DUP2"} +{"pc":70,"op":144,"gas":"0x2b7eb2","gasCost":"0x3","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"SWAP1"} +{"pc":71,"op":85,"gas":"0x2b7eaf","gasCost":"0x2bc","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac","0x0"],"depth":2,"refund":0,"opName":"SSTORE"} +{"pc":72,"op":80,"gas":"0x2b7bf3","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab","0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ac"],"depth":2,"refund":0,"opName":"POP"} +{"pc":73,"op":80,"gas":"0x2b7bf1","gasCost":"0x2","memSize":160,"stack":["0x80604052348015600f57600080fd5b506004361060285760003560e01c8063ab"],"depth":2,"refund":0,"opName":"POP"} +{"pc":74,"op":97,"gas":"0x2b7bef","gasCost":"0x3","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":77,"op":86,"gas":"0x2b7bec","gasCost":"0x8","memSize":160,"stack":["0x145"],"depth":2,"refund":0,"opName":"JUMP"} +{"pc":325,"op":91,"gas":"0x2b7be4","gasCost":"0x1","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"JUMPDEST"} +{"pc":326,"op":96,"gas":"0x2b7be3","gasCost":"0x3","memSize":160,"stack":[],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":328,"op":128,"gas":"0x2b7be0","gasCost":"0x3","memSize":160,"stack":["0xb3"],"depth":2,"refund":0,"opName":"DUP1"} +{"pc":329,"op":97,"gas":"0x2b7bdd","gasCost":"0x3","memSize":160,"stack":["0xb3","0xb3"],"depth":2,"refund":0,"opName":"PUSH2"} +{"pc":332,"op":96,"gas":"0x2b7bda","gasCost":"0x3","memSize":160,"stack":["0xb3","0xb3","0x153"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":334,"op":57,"gas":"0x2b7bd7","gasCost":"0x18","memSize":160,"stack":["0xb3","0xb3","0x153","0x0"],"depth":2,"refund":0,"opName":"CODECOPY"} +{"pc":335,"op":96,"gas":"0x2b7bbf","gasCost":"0x3","memSize":192,"stack":["0xb3"],"depth":2,"refund":0,"opName":"PUSH1"} +{"pc":337,"op":243,"gas":"0x2b7bbc","gasCost":"0x0","memSize":192,"stack":["0xb3","0x0"],"depth":2,"refund":0,"opName":"RETURN"} +{"pc":290,"op":128,"gas":"0x2bfb4a","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":291,"op":21,"gas":"0x2bfb47","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":292,"op":128,"gas":"0x2bfb44","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":293,"op":21,"gas":"0x2bfb41","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x0"],"depth":1,"refund":0,"opName":"ISZERO"} +{"pc":294,"op":97,"gas":"0x2bfb3e","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":297,"op":87,"gas":"0x2bfb3b","gasCost":"0xa","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0","0x1","0x133"],"depth":1,"refund":0,"opName":"JUMPI"} +{"pc":307,"op":91,"gas":"0x2bfb31","gasCost":"0x1","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":308,"op":80,"gas":"0x2bfb30","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x0"],"depth":1,"refund":0,"opName":"POP"} +{"pc":309,"op":96,"gas":"0x2bfb2e","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":311,"op":96,"gas":"0x2bfb2b","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":313,"op":97,"gas":"0x2bfb28","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":316,"op":10,"gas":"0x2bfb25","gasCost":"0xa","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x100"],"depth":1,"refund":0,"opName":"EXP"} +{"pc":317,"op":129,"gas":"0x2bfb1b","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":318,"op":84,"gas":"0x2bfb18","gasCost":"0xc8","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x1"],"depth":1,"refund":0,"opName":"SLOAD"} +{"pc":319,"op":129,"gas":"0x2bfa50","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0"],"depth":1,"refund":0,"opName":"DUP2"} +{"pc":320,"op":115,"gas":"0x2bfa4d","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":341,"op":2,"gas":"0x2bfa4a","gasCost":"0x5","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0x1","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":342,"op":25,"gas":"0x2bfa45","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"NOT"} +{"pc":343,"op":22,"gas":"0x2bfa42","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0","0xffffffffffffffffffffffff0000000000000000000000000000000000000000"],"depth":1,"refund":0,"opName":"AND"} +{"pc":344,"op":144,"gas":"0x2bfa3f","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x1","0x0"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":345,"op":131,"gas":"0x2bfa3c","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1"],"depth":1,"refund":0,"opName":"DUP4"} +{"pc":346,"op":115,"gas":"0x2bfa39","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"PUSH20"} +{"pc":367,"op":22,"gas":"0x2bfa36","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0xffffffffffffffffffffffffffffffffffffffff"],"depth":1,"refund":0,"opName":"AND"} +{"pc":368,"op":2,"gas":"0x2bfa33","gasCost":"0x5","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"MUL"} +{"pc":369,"op":23,"gas":"0x2bfa2e","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x0","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"OR"} +{"pc":370,"op":144,"gas":"0x2bfa2b","gasCost":"0x3","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"SWAP1"} +{"pc":371,"op":85,"gas":"0x2bfa28","gasCost":"0x1f4","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x74b186f98c406a19aaf31b542b2b2353fb1577f6","0x1"],"depth":1,"refund":0,"opName":"SSTORE"} +{"pc":372,"op":80,"gas":"0x2bf834","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282","0x74b186f98c406a19aaf31b542b2b2353fb1577f6"],"depth":1,"refund":0,"opName":"POP"} +{"pc":373,"op":80,"gas":"0x2bf832","gasCost":"0x2","memSize":736,"stack":["0x80","0xf2cc432c8892c12eede08774adfd63df6f49282"],"depth":1,"refund":0,"opName":"POP"} +{"pc":374,"op":80,"gas":"0x2bf830","gasCost":"0x2","memSize":736,"stack":["0x80"],"depth":1,"refund":0,"opName":"POP"} +{"pc":375,"op":97,"gas":"0x2bf82e","gasCost":"0x3","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":378,"op":86,"gas":"0x2bf82b","gasCost":"0x8","memSize":736,"stack":["0x29b"],"depth":1,"refund":0,"opName":"JUMP"} +{"pc":667,"op":91,"gas":"0x2bf823","gasCost":"0x1","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"JUMPDEST"} +{"pc":668,"op":97,"gas":"0x2bf822","gasCost":"0x3","memSize":736,"stack":[],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":671,"op":128,"gas":"0x2bf81f","gasCost":"0x3","memSize":736,"stack":["0x1bd"],"depth":1,"refund":0,"opName":"DUP1"} +{"pc":672,"op":97,"gas":"0x2bf81c","gasCost":"0x3","memSize":736,"stack":["0x1bd","0x1bd"],"depth":1,"refund":0,"opName":"PUSH2"} +{"pc":675,"op":96,"gas":"0x2bf819","gasCost":"0x3","memSize":736,"stack":["0x1bd","0x1bd","0x2aa"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":677,"op":57,"gas":"0x2bf816","gasCost":"0x2d","memSize":736,"stack":["0x1bd","0x1bd","0x2aa","0x0"],"depth":1,"refund":0,"opName":"CODECOPY"} +{"pc":678,"op":96,"gas":"0x2bf7e9","gasCost":"0x3","memSize":736,"stack":["0x1bd"],"depth":1,"refund":0,"opName":"PUSH1"} +{"pc":680,"op":243,"gas":"0x2bf7e6","gasCost":"0x0","memSize":736,"stack":["0x1bd","0x0"],"depth":1,"refund":0,"opName":"RETURN"} +{"output":"608060405234801561001057600080fd5b506004361061002b5760003560e01c8063f566852414610030575b600080fd5b61003861004e565b6040516100459190610146565b60405180910390f35b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166381ca91d36040518163ffffffff1660e01b815260040160206040518083038186803b1580156100b857600080fd5b505afa1580156100cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100f0919061010a565b905090565b60008151905061010481610170565b92915050565b6000602082840312156101205761011f61016b565b5b600061012e848285016100f5565b91505092915050565b61014081610161565b82525050565b600060208201905061015b6000830184610137565b92915050565b6000819050919050565b600080fd5b61017981610161565b811461018457600080fd5b5056fea2646970667358221220a6a0e11af79f176f9c421b7b12f441356b25f6489b83d38cc828a701720b41f164736f6c63430008070033","gasUsed":"0xac0c"} diff --git a/packages/common/CHANGELOG.md b/packages/common/CHANGELOG.md index ee08dbb3d..617fc94de 100644 --- a/packages/common/CHANGELOG.md +++ b/packages/common/CHANGELOG.md @@ -6,6 +6,47 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 4.3.0 - 2024-03-05 + +### Full 4844 Browser Readiness + +#### WASM KZG + +Shortly following the "Dencun Hardfork Support" release round from last month, this is now the first round of releases where the EthereumJS libraries are now fully browser compatible regarding the new 4844 functionality, see PRs [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) and [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296)! 🎉 + +Our WASM wizard @acolytec3 has spent the last two weeks and created a WASM build of the [c-kzg](https://github.com/benjaminion/c-kzg) library which we have released under the `kzg-wasm` name on npm (and you can also use independently for other projects). See the newly created [GitHub repository](https://github.com/ethereumjs/kzg-wasm) for some library-specific documentation. + +This WASM KZG library can now be used for KZG initialization (replacing the old recommended `c-kzg` initialization), see the respective [README section](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/README.md#kzg-initialization) from the tx library for usage instructions (which is also accurate for the other using upstream libraries like block or EVM). + +Note that `kzg-wasm` needs to be added manually to your own dependencies and the KZG initialization code needs to be adopted like the following (which you will likely want to do in most cases, so if you deal with post Dencun EVM bytecode and/or 4844 blob txs in any way): + +```typescript +import { loadKZG } from 'kzg-wasm' +import { Chain, Common, Hardfork } from '@ethereumjs/common' + +const kzg = await loadKZG() + +// Instantiate `common` +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, +}) +``` + +Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. + +Note that passing in the KZG setup file is not necessary anymore, since this is now defaulting to the setup file from the official [KZG ceremony](https://ceremony.ethereum.org/) (which is now bundled with the KZG library). + +#### Trie Node.js Import Bug + +Since this fits well also to be placed here relatively prominently for awareness: we had a relatively nasty bug in the `@ethereumjs/trie` library with a `Node.js` web stream import also affecting browser compatibility, see PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). This bug has been fixed along with these releases and this library now references the updated trie library version. + +### Other Changes + +- TypeScript type fixes leading to build problems with certain tools (Vercel), PR [#3306](https://github.com/ethereumjs/ethereumjs-monorepo/issues/3306) +- Early support for [EIP-2935](https://eips.ethereum.org/EIPS/eip-2935) - "Save historical block hashes in state" (Verkle related, likely subject to change), PRs [#3268](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3268) and [#3327](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3327) + ## 4.2.0 - 2024-02-08 ### Dencun Hardfork Support diff --git a/packages/common/README.md b/packages/common/README.md index e0df248ee..1124468ef 100644 --- a/packages/common/README.md +++ b/packages/common/README.md @@ -126,17 +126,20 @@ to initalize (assuming you are using the `c-kzg` package as your KZG cryptograph ```ts // ./examples/initKzg.ts -import * as kzg from 'c-kzg' +import { loadKZG } from 'kzg-wasm' import { Common, Chain, Hardfork } from '@ethereumjs/common' -import { initKZG } from '@ethereumjs/util' -initKZG(kzg, __dirname + '/../../client/src/trustedSetups/official.txt') -const common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.Cancun, - customCrypto: { kzg: kzg }, -}) -console.log(common.customCrypto.kzg) // Should print the initialized KZG interface +const main = async () => { + const kzg = await loadKZG() + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, + }) + console.log(common.customCrypto.kzg) // Should print the initialized KZG interface +} + +main() ``` ## Browser @@ -406,6 +409,7 @@ The following EIPs are currently supported: - [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537) - BLS precompiles (removed in v4.0.0, see latest v3 release) - [EIP-2565](https://eips.ethereum.org/EIPS/eip-2565) - ModExp gas cost - [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) - Transaction Types +- [EIP-2935](https://eips.ethereum.org/EIPS/eip-2935) - Save historical block hashes in state (`experimental`) - [EIP-2929](https://eips.ethereum.org/EIPS/eip-2929) - gas cost increases for state access opcodes - [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) - Optional access list tx type - [EIP-3074](https://eips.ethereum.org/EIPS/eip-3074) - AUTH and AUTHCALL opcodes diff --git a/packages/common/docs/README.md b/packages/common/docs/README.md index e6bdfb583..d9498dea2 100644 --- a/packages/common/docs/README.md +++ b/packages/common/docs/README.md @@ -47,6 +47,7 @@ - [EIPOrHFConfig](README.md#eiporhfconfig) - [EthashConfig](README.md#ethashconfig) - [HardforkConfig](README.md#hardforkconfig) +- [HardforksDict](README.md#hardforksdict) - [Proof](README.md#proof) - [StorageProof](README.md#storageproof) @@ -150,7 +151,7 @@ ___ #### Defined in -[types.ts:186](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L186) +[types.ts:188](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L188) ___ @@ -173,7 +174,7 @@ ___ #### Defined in -[types.ts:165](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L165) +[types.ts:167](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L167) ___ @@ -193,7 +194,21 @@ ___ #### Defined in -[types.ts:191](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L191) +[types.ts:193](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L193) + +___ + +### HardforksDict + +ÆŦ **HardforksDict**: `Object` + +#### Index signature + +â–Ē [key: `string`]: [`HardforkConfig`](README.md#hardforkconfig) + +#### Defined in + +[types.ts:199](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L199) ___ diff --git a/packages/common/docs/classes/Common.md b/packages/common/docs/classes/Common.md index 1259881e5..6af73488e 100644 --- a/packages/common/docs/classes/Common.md +++ b/packages/common/docs/classes/Common.md @@ -33,6 +33,7 @@ can be created via the main constructor and the [customChains](../interfaces/Com - [copy](Common.md#copy) - [dnsNetworks](Common.md#dnsnetworks) - [eipBlock](Common.md#eipblock) +- [eipTimestamp](Common.md#eiptimestamp) - [eips](Common.md#eips) - [forkHash](Common.md#forkhash) - [genesis](Common.md#genesis) @@ -77,7 +78,7 @@ can be created via the main constructor and the [customChains](../interfaces/Com #### Defined in -[common.ts:236](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L236) +[common.ts:237](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L237) ## Properties @@ -131,7 +132,7 @@ True if HF is active on block number #### Defined in -[common.ts:705](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L705) +[common.ts:703](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L703) ___ @@ -149,7 +150,7 @@ Dict with bootstrap nodes #### Defined in -[common.ts:955](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L955) +[common.ts:975](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L975) ___ @@ -167,7 +168,7 @@ chain Id #### Defined in -[common.ts:979](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L979) +[common.ts:999](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L999) ___ @@ -185,7 +186,7 @@ chain name (lower case) #### Defined in -[common.ts:987](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L987) +[common.ts:1007](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1007) ___ @@ -207,7 +208,7 @@ Note: This value can update along a Hardfork. #### Defined in -[common.ts:1036](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1036) +[common.ts:1056](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1056) ___ @@ -233,7 +234,7 @@ Note: This value can update along a Hardfork. #### Defined in -[common.ts:1062](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1062) +[common.ts:1082](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1082) ___ @@ -252,7 +253,7 @@ Note: This value can update along a Hardfork. #### Defined in -[common.ts:1014](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1014) +[common.ts:1034](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1034) ___ @@ -268,7 +269,7 @@ Returns a deep copy of this [Common](Common.md) instance. #### Defined in -[common.ts:1083](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1083) +[common.ts:1103](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1103) ___ @@ -286,7 +287,7 @@ Array of DNS ENR urls #### Defined in -[common.ts:963](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L963) +[common.ts:983](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L983) ___ @@ -310,7 +311,31 @@ Block number or null if unscheduled #### Defined in -[common.ts:768](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L768) +[common.ts:766](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L766) + +___ + +### eipTimestamp + +▸ **eipTimestamp**(`eip`): ``null`` \| `bigint` + +Returns the scheduled timestamp of the EIP (if scheduled and scheduled by timestamp) + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `eip` | `number` | EIP number | + +#### Returns + +``null`` \| `bigint` + +Scheduled timestamp. If this EIP is unscheduled, or the EIP is scheduled by block number or ttd, then it returns `null`. + +#### Defined in + +[common.ts:784](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L784) ___ @@ -329,7 +354,7 @@ List of EIPs #### Defined in -[common.ts:1004](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1004) +[common.ts:1024](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1024) ___ @@ -352,7 +377,7 @@ Returns an eth/64 compliant fork hash (EIP-2124) #### Defined in -[common.ts:889](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L889) +[common.ts:905](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L905) ___ @@ -370,7 +395,7 @@ Genesis dictionary #### Defined in -[common.ts:939](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L939) +[common.ts:955](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L955) ___ @@ -399,7 +424,7 @@ The name of the HF #### Defined in -[common.ts:328](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L328) +[common.ts:330](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L330) ___ @@ -423,7 +448,7 @@ True if hardfork set is greater than hardfork provided #### Defined in -[common.ts:736](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L736) +[common.ts:734](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L734) ___ @@ -441,7 +466,7 @@ Hardfork name #### Defined in -[common.ts:971](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L971) +[common.ts:991](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L991) ___ @@ -465,7 +490,7 @@ Block number or null if unscheduled #### Defined in -[common.ts:745](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L745) +[common.ts:743](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L743) ___ @@ -487,7 +512,7 @@ Array with hardfork data (name, block, forkHash) #### Defined in -[common.ts:911](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L911) +[common.ts:927](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L927) ___ @@ -512,7 +537,7 @@ True if HF1 gte HF2 #### Defined in -[common.ts:716](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L716) +[common.ts:714](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L714) ___ @@ -537,7 +562,7 @@ True if HF is active on block number #### Defined in -[common.ts:690](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L690) +[common.ts:688](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L688) ___ @@ -561,7 +586,7 @@ Total difficulty or null if no set #### Defined in -[common.ts:786](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L786) +[common.ts:802](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L802) ___ @@ -581,7 +606,7 @@ ___ #### Defined in -[common.ts:754](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L754) +[common.ts:752](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L752) ___ @@ -599,7 +624,7 @@ Array with arrays of hardforks #### Defined in -[common.ts:947](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L947) +[common.ts:963](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L963) ___ @@ -626,7 +651,7 @@ by the [eips](../interfaces/CommonOpts.md#eips) constructor option #### Defined in -[common.ts:677](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L677) +[common.ts:675](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L675) ___ @@ -644,7 +669,7 @@ network Id #### Defined in -[common.ts:995](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L995) +[common.ts:1015](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1015) ___ @@ -668,7 +693,7 @@ Block timestamp, number or null if not available #### Defined in -[common.ts:800](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L800) +[common.ts:816](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L816) ___ @@ -697,7 +722,7 @@ The value requested or `BigInt(0)` if not found #### Defined in -[common.ts:581](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L581) +[common.ts:579](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L579) ___ @@ -726,7 +751,7 @@ The value requested or `BigInt(0)` if not found #### Defined in -[common.ts:657](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L657) +[common.ts:655](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L655) ___ @@ -752,7 +777,7 @@ The value requested or `undefined` if not found #### Defined in -[common.ts:632](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L632) +[common.ts:630](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L630) ___ @@ -778,7 +803,7 @@ The value requested or `BigInt(0)` if not found #### Defined in -[common.ts:601](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L601) +[common.ts:599](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L599) ___ @@ -802,7 +827,7 @@ The dictionary with parameters set as chain #### Defined in -[common.ts:268](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L268) +[common.ts:270](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L270) ___ @@ -824,7 +849,7 @@ Sets the active EIPs #### Defined in -[common.ts:471](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L471) +[common.ts:469](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L469) ___ @@ -846,7 +871,7 @@ Sets any missing forkHashes on the passed-in [Common](Common.md) instance #### Defined in -[common.ts:923](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L923) +[common.ts:939](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L939) ___ @@ -868,7 +893,7 @@ Sets the hardfork to get params for #### Defined in -[common.ts:299](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L299) +[common.ts:301](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L301) ___ @@ -897,7 +922,7 @@ The name of the HF set #### Defined in -[common.ts:448](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L448) +[common.ts:446](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L446) ___ @@ -983,7 +1008,7 @@ ___ #### Defined in -[common.ts:1089](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1089) +[common.ts:1109](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L1109) ___ @@ -1007,4 +1032,4 @@ boolean #### Defined in -[common.ts:208](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L208) +[common.ts:209](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/common.ts#L209) diff --git a/packages/common/docs/interfaces/BootstrapNodeConfig.md b/packages/common/docs/interfaces/BootstrapNodeConfig.md index ef04d8708..e32bc5898 100644 --- a/packages/common/docs/interfaces/BootstrapNodeConfig.md +++ b/packages/common/docs/interfaces/BootstrapNodeConfig.md @@ -22,7 +22,7 @@ #### Defined in -[types.ts:64](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L64) +[types.ts:65](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L65) ___ @@ -32,7 +32,7 @@ ___ #### Defined in -[types.ts:67](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L67) +[types.ts:68](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L68) ___ @@ -42,7 +42,7 @@ ___ #### Defined in -[types.ts:65](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L65) +[types.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L66) ___ @@ -52,7 +52,7 @@ ___ #### Defined in -[types.ts:61](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L61) +[types.ts:62](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L62) ___ @@ -62,7 +62,7 @@ ___ #### Defined in -[types.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L66) +[types.ts:67](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L67) ___ @@ -72,7 +72,7 @@ ___ #### Defined in -[types.ts:63](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L63) +[types.ts:64](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L64) ___ @@ -82,4 +82,4 @@ ___ #### Defined in -[types.ts:62](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L62) +[types.ts:63](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L63) diff --git a/packages/common/docs/interfaces/ChainConfig.md b/packages/common/docs/interfaces/ChainConfig.md index 4c368ddbe..fca3c544c 100644 --- a/packages/common/docs/interfaces/ChainConfig.md +++ b/packages/common/docs/interfaces/ChainConfig.md @@ -10,6 +10,7 @@ - [chainId](ChainConfig.md#chainid) - [comment](ChainConfig.md#comment) - [consensus](ChainConfig.md#consensus) +- [customHardforks](ChainConfig.md#customhardforks) - [defaultHardfork](ChainConfig.md#defaulthardfork) - [dnsNetworks](ChainConfig.md#dnsnetworks) - [genesis](ChainConfig.md#genesis) @@ -26,7 +27,7 @@ #### Defined in -[types.ts:37](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L37) +[types.ts:38](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L38) ___ @@ -56,7 +57,17 @@ ___ #### Defined in -[types.ts:39](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L39) +[types.ts:40](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L40) + +___ + +### customHardforks + +â€ĸ `Optional` **customHardforks**: [`HardforksDict`](../README.md#hardforksdict) + +#### Defined in + +[types.ts:37](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L37) ___ @@ -76,7 +87,7 @@ ___ #### Defined in -[types.ts:38](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L38) +[types.ts:39](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L39) ___ diff --git a/packages/common/docs/interfaces/CommonOpts.md b/packages/common/docs/interfaces/CommonOpts.md index 0aae31c4f..89e88f073 100644 --- a/packages/common/docs/interfaces/CommonOpts.md +++ b/packages/common/docs/interfaces/CommonOpts.md @@ -32,7 +32,7 @@ passed in via [customChains](CommonOpts.md#customchains). #### Defined in -[types.ts:122](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L122) +[types.ts:124](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L124) ___ @@ -52,7 +52,7 @@ const common = new Common({ chain: 'myCustomChain1', customChains: [ myCustomCha #### Defined in -[types.ts:134](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L134) +[types.ts:136](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L136) ___ @@ -75,7 +75,7 @@ BaseOpts.customCrypto #### Defined in -[types.ts:110](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L110) +[types.ts:112](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L112) ___ @@ -92,7 +92,7 @@ BaseOpts.eips #### Defined in -[types.ts:99](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L99) +[types.ts:101](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L101) ___ @@ -110,4 +110,4 @@ BaseOpts.hardfork #### Defined in -[types.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L94) +[types.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L96) diff --git a/packages/common/docs/interfaces/CustomCommonOpts.md b/packages/common/docs/interfaces/CustomCommonOpts.md index 63989a29c..9ade971db 100644 --- a/packages/common/docs/interfaces/CustomCommonOpts.md +++ b/packages/common/docs/interfaces/CustomCommonOpts.md @@ -30,7 +30,7 @@ a standard chain used to base the custom chain params on. #### Defined in -[types.ts:145](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L145) +[types.ts:147](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L147) ___ @@ -53,7 +53,7 @@ BaseOpts.customCrypto #### Defined in -[types.ts:110](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L110) +[types.ts:112](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L112) ___ @@ -70,7 +70,7 @@ BaseOpts.eips #### Defined in -[types.ts:99](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L99) +[types.ts:101](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L101) ___ @@ -88,4 +88,4 @@ BaseOpts.hardfork #### Defined in -[types.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L94) +[types.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L96) diff --git a/packages/common/docs/interfaces/CustomCrypto.md b/packages/common/docs/interfaces/CustomCrypto.md index 659986268..e1d510188 100644 --- a/packages/common/docs/interfaces/CustomCrypto.md +++ b/packages/common/docs/interfaces/CustomCrypto.md @@ -11,6 +11,7 @@ - [ecrecover](CustomCrypto.md#ecrecover) - [ecsign](CustomCrypto.md#ecsign) - [keccak256](CustomCrypto.md#keccak256) +- [kzg](CustomCrypto.md#kzg) - [sha256](CustomCrypto.md#sha256) ## Properties @@ -37,7 +38,7 @@ #### Defined in -[types.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L85) +[types.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L86) ___ @@ -67,7 +68,7 @@ ___ #### Defined in -[types.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L84) +[types.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L85) ___ @@ -95,7 +96,7 @@ ___ #### Defined in -[types.ts:75](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L75) +[types.ts:76](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L76) ___ @@ -121,7 +122,7 @@ ___ #### Defined in -[types.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L83) +[types.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L84) ___ @@ -147,7 +148,17 @@ Interface for providing custom cryptographic primitives in place of `ethereum-cr #### Defined in -[types.ts:74](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L74) +[types.ts:75](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L75) + +___ + +### kzg + +â€ĸ `Optional` **kzg**: `Kzg` + +#### Defined in + +[types.ts:87](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L87) ___ @@ -171,4 +182,4 @@ ___ #### Defined in -[types.ts:82](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L82) +[types.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L83) diff --git a/packages/common/docs/interfaces/EVMStateManagerInterface.md b/packages/common/docs/interfaces/EVMStateManagerInterface.md index 45d4f5217..feaca2daf 100644 --- a/packages/common/docs/interfaces/EVMStateManagerInterface.md +++ b/packages/common/docs/interfaces/EVMStateManagerInterface.md @@ -24,6 +24,7 @@ - [dumpStorageRange](EVMStateManagerInterface.md#dumpstoragerange) - [generateCanonicalGenesis](EVMStateManagerInterface.md#generatecanonicalgenesis) - [getAccount](EVMStateManagerInterface.md#getaccount) +- [getAppliedKey](EVMStateManagerInterface.md#getappliedkey) - [getContractCode](EVMStateManagerInterface.md#getcontractcode) - [getContractStorage](EVMStateManagerInterface.md#getcontractstorage) - [getProof](EVMStateManagerInterface.md#getproof) @@ -52,7 +53,7 @@ #### Defined in -[interfaces.ts:89](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L89) +[interfaces.ts:90](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L90) ## Methods @@ -156,7 +157,7 @@ ___ #### Defined in -[interfaces.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L94) +[interfaces.ts:95](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L95) ___ @@ -178,7 +179,7 @@ ___ #### Defined in -[interfaces.ts:95](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L95) +[interfaces.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L96) ___ @@ -198,7 +199,7 @@ ___ #### Defined in -[interfaces.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L96) +[interfaces.ts:97](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L97) ___ @@ -226,6 +227,30 @@ ___ ___ +### getAppliedKey + +▸ `Optional` **getAppliedKey**(`address`): `Uint8Array` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `address` | `Uint8Array` | + +#### Returns + +`Uint8Array` + +#### Inherited from + +[StateManagerInterface](StateManagerInterface.md).[getAppliedKey](StateManagerInterface.md#getappliedkey) + +#### Defined in + +[interfaces.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L86) + +___ + ### getContractCode ▸ **getContractCode**(`address`): `Promise`<`Uint8Array`\> @@ -296,7 +321,7 @@ ___ #### Defined in -[interfaces.ts:97](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L97) +[interfaces.ts:98](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L98) ___ @@ -506,4 +531,4 @@ ___ #### Defined in -[interfaces.ts:99](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L99) +[interfaces.ts:100](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L100) diff --git a/packages/common/docs/interfaces/GenesisBlockConfig.md b/packages/common/docs/interfaces/GenesisBlockConfig.md index 2c5705c7d..5485ce77f 100644 --- a/packages/common/docs/interfaces/GenesisBlockConfig.md +++ b/packages/common/docs/interfaces/GenesisBlockConfig.md @@ -22,7 +22,7 @@ #### Defined in -[types.ts:48](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L48) +[types.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L49) ___ @@ -32,7 +32,7 @@ ___ #### Defined in -[types.ts:45](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L45) +[types.ts:46](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L46) ___ @@ -42,7 +42,7 @@ ___ #### Defined in -[types.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L49) +[types.ts:50](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L50) ___ @@ -52,7 +52,7 @@ ___ #### Defined in -[types.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L47) +[types.ts:48](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L48) ___ @@ -62,7 +62,7 @@ ___ #### Defined in -[types.ts:44](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L44) +[types.ts:45](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L45) ___ @@ -72,7 +72,7 @@ ___ #### Defined in -[types.ts:46](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L46) +[types.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L47) ___ @@ -82,4 +82,4 @@ ___ #### Defined in -[types.ts:43](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L43) +[types.ts:44](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L44) diff --git a/packages/common/docs/interfaces/GethConfigOpts.md b/packages/common/docs/interfaces/GethConfigOpts.md index 0530b851b..b6752af52 100644 --- a/packages/common/docs/interfaces/GethConfigOpts.md +++ b/packages/common/docs/interfaces/GethConfigOpts.md @@ -27,7 +27,7 @@ #### Defined in -[types.ts:149](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L149) +[types.ts:151](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L151) ___ @@ -50,7 +50,7 @@ BaseOpts.customCrypto #### Defined in -[types.ts:110](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L110) +[types.ts:112](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L112) ___ @@ -67,7 +67,7 @@ BaseOpts.eips #### Defined in -[types.ts:99](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L99) +[types.ts:101](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L101) ___ @@ -77,7 +77,7 @@ ___ #### Defined in -[types.ts:150](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L150) +[types.ts:152](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L152) ___ @@ -95,7 +95,7 @@ BaseOpts.hardfork #### Defined in -[types.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L94) +[types.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L96) ___ @@ -105,4 +105,4 @@ ___ #### Defined in -[types.ts:151](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L151) +[types.ts:153](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L153) diff --git a/packages/common/docs/interfaces/HardforkByOpts.md b/packages/common/docs/interfaces/HardforkByOpts.md index 3d12d7afb..bca998a47 100644 --- a/packages/common/docs/interfaces/HardforkByOpts.md +++ b/packages/common/docs/interfaces/HardforkByOpts.md @@ -18,7 +18,7 @@ #### Defined in -[types.ts:155](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L155) +[types.ts:157](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L157) ___ @@ -28,7 +28,7 @@ ___ #### Defined in -[types.ts:157](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L157) +[types.ts:159](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L159) ___ @@ -38,4 +38,4 @@ ___ #### Defined in -[types.ts:156](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L156) +[types.ts:158](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L158) diff --git a/packages/common/docs/interfaces/HardforkTransitionConfig.md b/packages/common/docs/interfaces/HardforkTransitionConfig.md index 283cc9803..59cdcd6eb 100644 --- a/packages/common/docs/interfaces/HardforkTransitionConfig.md +++ b/packages/common/docs/interfaces/HardforkTransitionConfig.md @@ -20,7 +20,7 @@ #### Defined in -[types.ts:54](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L54) +[types.ts:55](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L55) ___ @@ -30,7 +30,7 @@ ___ #### Defined in -[types.ts:57](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L57) +[types.ts:58](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L58) ___ @@ -40,7 +40,7 @@ ___ #### Defined in -[types.ts:53](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L53) +[types.ts:54](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L54) ___ @@ -50,7 +50,7 @@ ___ #### Defined in -[types.ts:56](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L56) +[types.ts:57](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L57) ___ @@ -60,4 +60,4 @@ ___ #### Defined in -[types.ts:55](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L55) +[types.ts:56](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/types.ts#L56) diff --git a/packages/common/docs/interfaces/StateManagerInterface.md b/packages/common/docs/interfaces/StateManagerInterface.md index dbd7240d3..f3b51db3c 100644 --- a/packages/common/docs/interfaces/StateManagerInterface.md +++ b/packages/common/docs/interfaces/StateManagerInterface.md @@ -17,6 +17,7 @@ - [commit](StateManagerInterface.md#commit) - [deleteAccount](StateManagerInterface.md#deleteaccount) - [getAccount](StateManagerInterface.md#getaccount) +- [getAppliedKey](StateManagerInterface.md#getappliedkey) - [getContractCode](StateManagerInterface.md#getcontractcode) - [getContractStorage](StateManagerInterface.md#getcontractstorage) - [getProof](StateManagerInterface.md#getproof) @@ -120,6 +121,26 @@ ___ ___ +### getAppliedKey + +▸ `Optional` **getAppliedKey**(`address`): `Uint8Array` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `address` | `Uint8Array` | + +#### Returns + +`Uint8Array` + +#### Defined in + +[interfaces.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/common/src/interfaces.ts#L86) + +___ + ### getContractCode ▸ **getContractCode**(`address`): `Promise`<`Uint8Array`\> diff --git a/packages/common/examples/initKzg.ts b/packages/common/examples/initKzg.ts index a8bfd7806..4d6ecdcdf 100644 --- a/packages/common/examples/initKzg.ts +++ b/packages/common/examples/initKzg.ts @@ -1,14 +1,12 @@ -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { Common, Chain, Hardfork } from '@ethereumjs/common' -import { initKZG } from '@ethereumjs/util' const main = async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Cancun, - customCrypto: { kzg: kzg }, + customCrypto: { kzg }, }) console.log(common.customCrypto.kzg) // Should print the initialized KZG interface } diff --git a/packages/common/package.json b/packages/common/package.json index aec931996..4868696a2 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/common", - "version": "4.2.0", + "version": "4.3.0", "description": "Resources common to all Ethereum implementations", "keywords": [ "ethereum", @@ -51,12 +51,12 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --browser.name=chrome --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/util": "^9.0.2" + "@ethereumjs/util": "^9.0.3" }, "devDependencies": { "@polkadot/util": "^12.6.2", diff --git a/packages/common/src/chains.ts b/packages/common/src/chains.ts index 2791829b8..ead59d947 100644 --- a/packages/common/src/chains.ts +++ b/packages/common/src/chains.ts @@ -570,8 +570,8 @@ export const chains: ChainsDict = { 'enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.holesky.ethdisco.net', ], }, - kaustinen: { - name: 'kaustinen', + kaustinen6: { + name: 'kaustinen6', chainId: 69420, networkId: 69420, defaultHardfork: 'prague', @@ -579,14 +579,14 @@ export const chains: ChainsDict = { type: 'pos', algorithm: 'casper', }, - comment: 'Verkle kaustinen testnet 2 (likely temporary, do not hard-wire into production code)', + comment: 'Verkle kaustinen testnet 6 (likely temporary, do not hard-wire into production code)', url: 'https://github.com/eth-clients/kaustinen/', genesis: { difficulty: '0x01', extraData: '0x', gasLimit: '0x17D7840', nonce: '0x0000000000001234', - timestamp: '0x65608a64', + timestamp: '0x66190fbc', }, hardforks: [ { @@ -646,7 +646,7 @@ export const chains: ChainsDict = { { name: 'prague', block: null, - timestamp: '1700825700', + timestamp: '1712848500', }, ], bootstrapNodes: [], diff --git a/packages/common/src/common.ts b/packages/common/src/common.ts index 4eae1b490..8276678db 100644 --- a/packages/common/src/common.ts +++ b/packages/common/src/common.ts @@ -39,7 +39,7 @@ import type { import type { BigIntLike, PrefixedHexString } from '@ethereumjs/util' type HardforkSpecKeys = string // keyof typeof HARDFORK_SPECS -type HardforkSpecValues = typeof HARDFORK_SPECS[HardforkSpecKeys] +type HardforkSpecValues = (typeof HARDFORK_SPECS)[HardforkSpecKeys] type ParamsCacheConfig = Omit @@ -157,8 +157,7 @@ export class Common { chainId: 69, networkId: 69, }, - // Optimism has not implemented the London hardfork yet (targeting Q1.22) - { hardfork: Hardfork.Berlin, ...opts } + opts ) } diff --git a/packages/common/src/eips.ts b/packages/common/src/eips.ts index 95d9750ee..0bf8863cd 100644 --- a/packages/common/src/eips.ts +++ b/packages/common/src/eips.ts @@ -52,27 +52,6 @@ export const EIPs: EIPsDict = { }, }, }, - 2315: { - comment: 'Simple subroutines for the EVM', - url: 'https://eips.ethereum.org/EIPS/eip-2315', - status: Status.Draft, - minimumHardfork: Hardfork.Istanbul, - requiredEIPs: [], - gasPrices: { - beginsub: { - v: 2, - d: 'Base fee of the BEGINSUB opcode', - }, - returnsub: { - v: 5, - d: 'Base fee of the RETURNSUB opcode', - }, - jumpsub: { - v: 10, - d: 'Base fee of the JUMPSUB opcode', - }, - }, - }, 2565: { comment: 'ModExp gas cost', url: 'https://eips.ethereum.org/EIPS/eip-2565', @@ -86,6 +65,50 @@ export const EIPs: EIPsDict = { }, }, }, + 2537: { + comment: 'BLS12-381 precompiles', + url: 'https://eips.ethereum.org/EIPS/eip-2537', + status: 'Draft', + minimumHardfork: Hardfork.Chainstart, + requiredEIPs: [], + gasConfig: {}, + gasPrices: { + Bls12381G1AddGas: { + v: 600, + d: 'Gas cost of a single BLS12-381 G1 addition precompile-call', + }, + Bls12381G1MulGas: { + v: 12000, + d: 'Gas cost of a single BLS12-381 G1 multiplication precompile-call', + }, + Bls12381G2AddGas: { + v: 4500, + d: 'Gas cost of a single BLS12-381 G2 addition precompile-call', + }, + Bls12381G2MulGas: { + v: 55000, + d: 'Gas cost of a single BLS12-381 G2 multiplication precompile-call', + }, + Bls12381PairingBaseGas: { + v: 65000, + d: 'Base gas cost of BLS12-381 pairing check', + }, + Bls12381PairingPerPairGas: { + v: 43000, + d: 'Per-pair gas cost of BLS12-381 pairing check', + }, + Bls12381MapG1Gas: { + v: 5500, + d: 'Gas cost of BLS12-381 map field element to G1', + }, + Bls12381MapG2Gas: { + v: 110000, + d: 'Gas cost of BLS12-381 map field element to G2', + }, + }, + vm: {}, + pow: {}, + }, 2718: { comment: 'Typed Transaction Envelope', url: 'https://eips.ethereum.org/EIPS/eip-2718', @@ -193,7 +216,7 @@ export const EIPs: EIPsDict = { }, 2935: { comment: 'Save historical block hashes in state (Verkle related usage, UNSTABLE)', - url: 'https://github.com/ethereum/EIPs/pull/8166/commits/941d3beb084d638be258b8fded6171cf0705a5db', + url: 'https://github.com/gballet/EIPs/pull/3/commits/2e9ac09a142b0d9fb4db0b8d4609f92e5d9990c5', status: Status.Draft, minimumHardfork: Hardfork.Chainstart, requiredEIPs: [], @@ -202,15 +225,15 @@ export const EIPs: EIPsDict = { v: BigInt('0xfffffffffffffffffffffffffffffffffffffffe'), d: 'The address where the historical blockhashes are stored', }, - minHistoryServeWindow: { - v: BigInt(256), - d: 'The minimum amount of blocks to be served by the historical blockhash contract', + historyServeWindow: { + v: BigInt(8192), + d: 'The amount of blocks to be served by the historical blockhash contract', }, }, }, 3074: { comment: 'AUTH and AUTHCALL opcodes', - url: 'https://eips.ethereum.org/EIPS/eip-3074', + url: 'https://github.com/ethereum/EIPs/commit/eca4416ff3c025fcb6ec8cd4eac481e74e108481', status: Status.Review, minimumHardfork: Hardfork.London, requiredEIPs: [], @@ -495,6 +518,16 @@ export const EIPs: EIPsDict = { status: Status.Draft, minimumHardfork: Hardfork.London, requiredEIPs: [], + gasPrices: { + create: { + v: 1000, + d: 'Base fee of the CREATE opcode', + }, + coldsload: { + v: 0, + d: 'Gas cost of the first read of storage from a given location (per transaction)', + }, + }, }, 7516: { comment: 'BLOBBASEFEE opcode', diff --git a/packages/common/src/enums.ts b/packages/common/src/enums.ts index e18f0f6a1..dd13f1387 100644 --- a/packages/common/src/enums.ts +++ b/packages/common/src/enums.ts @@ -5,7 +5,7 @@ export enum Chain { Goerli = 5, Sepolia = 11155111, Holesky = 17000, - Kaustinen = 69420, + Kaustinen6 = 69420, } /** @@ -44,10 +44,10 @@ export const ChainGenesis: Record = { blockNumber: BIGINT_0, stateRoot: hexToBytes('0x69d8c9d72f6fa4ad42d4702b433707212f90db395eb54dc20bc85de253788783'), }, - [Chain.Kaustinen]: { - name: 'kaustinen', + [Chain.Kaustinen6]: { + name: 'kaustinen6', blockNumber: BIGINT_0, - stateRoot: hexToBytes('0x5e8519756841faf0b2c28951c451b61a4b407b70a5ce5b57992f4bec973173ff'), + stateRoot: hexToBytes('0x1fbf85345a3cbba9a6d44f991b721e55620a22397c2a93ee8d5011136ac300ee'), }, } diff --git a/packages/common/src/hardforks.ts b/packages/common/src/hardforks.ts index 091527e78..c87d900f0 100644 --- a/packages/common/src/hardforks.ts +++ b/packages/common/src/hardforks.ts @@ -841,6 +841,6 @@ export const hardforks: HardforksDict = { 'Next feature hardfork after cancun, internally used for verkle testing/implementation (incomplete/experimental)', url: 'https://github.com/ethereum/execution-specs/blob/master/network-upgrades/mainnet-upgrades/prague.md', status: Status.Draft, - eips: [6800], + eips: [6800, 2935], }, } diff --git a/packages/common/src/interfaces.ts b/packages/common/src/interfaces.ts index eecd212a0..c9731207c 100644 --- a/packages/common/src/interfaces.ts +++ b/packages/common/src/interfaces.ts @@ -72,6 +72,7 @@ export interface StateManagerInterface { modifyAccountFields(address: Address, accountFields: AccountFields): Promise putContractCode(address: Address, value: Uint8Array): Promise getContractCode(address: Address): Promise + getContractCodeSize?(address: Address): Promise getContractStorage(address: Address, key: Uint8Array): Promise putContractStorage(address: Address, key: Uint8Array, value: Uint8Array): Promise clearContractStorage(address: Address): Promise diff --git a/packages/common/src/types.ts b/packages/common/src/types.ts index 395f15c20..1cb7263a7 100644 --- a/packages/common/src/types.ts +++ b/packages/common/src/types.ts @@ -1,5 +1,5 @@ import type { Chain, ConsensusAlgorithm, ConsensusType, Hardfork } from './enums.js' -import type { BigIntLike, ECDSASignature, Kzg } from '@ethereumjs/util' +import type { BigIntLike, ECDSASignature, Kzg, PrefixedHexString } from '@ethereumjs/util' export interface ChainName { [chainId: string]: string @@ -41,13 +41,13 @@ export interface ChainConfig { } export interface GenesisBlockConfig { - timestamp?: string - gasLimit: number | string - difficulty: number | string - nonce: string - extraData: string - baseFeePerGas?: string - excessBlobGas?: string + timestamp?: PrefixedHexString + gasLimit: number | PrefixedHexString + difficulty: number | PrefixedHexString + nonce: PrefixedHexString + extraData: PrefixedHexString + baseFeePerGas?: PrefixedHexString + excessBlobGas?: PrefixedHexString } export interface HardforkTransitionConfig { @@ -55,7 +55,7 @@ export interface HardforkTransitionConfig { block: number | null // null is used for hardforks that should not be applied -- since `undefined` isn't a valid value in JSON ttd?: bigint | string timestamp?: number | string - forkHash?: string | null + forkHash?: PrefixedHexString | null } export interface BootstrapNodeConfig { @@ -96,7 +96,11 @@ interface BaseOpts { hardfork?: string | Hardfork /** * Selected EIPs which can be activated, please use an array for instantiation - * (e.g. `eips: [ 1559, 3860 ]`) + * (e.g. `eips: [ 2537, ]`) + * + * Currently supported: + * + * - [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537) - BLS12-381 precompiles */ eips?: number[] /** diff --git a/packages/common/src/utils.ts b/packages/common/src/utils.ts index 550b05c6e..5c41513ab 100644 --- a/packages/common/src/utils.ts +++ b/packages/common/src/utils.ts @@ -2,6 +2,8 @@ import { intToHex, isHexPrefixed, stripHexPrefix } from '@ethereumjs/util' import { Hardfork } from './enums.js' +import type { PrefixedHexString } from '@ethereumjs/util' + type ConfigHardfork = | { name: string; block: null; timestamp: number } | { name: string; block: number; timestamp?: number } @@ -10,14 +12,14 @@ type ConfigHardfork = * @param nonce string parsed from the Geth genesis file * @returns nonce as a 0x-prefixed 8 byte string */ -function formatNonce(nonce: string): string { +function formatNonce(nonce: string): PrefixedHexString { if (!nonce || nonce === '0x0') { return '0x0000000000000000' } if (isHexPrefixed(nonce)) { - return '0x' + stripHexPrefix(nonce).padStart(16, '0') + return `0x${stripHexPrefix(nonce).padStart(16, '0')}` } - return '0x' + nonce.padStart(16, '0') + return `0x${nonce.padStart(16, '0')}` } /** @@ -38,33 +40,37 @@ function parseGethParams(json: any, mergeForkIdPostMerge: boolean = true) { coinbase, baseFeePerGas, excessBlobGas, + extraData: unparsedExtraData, + nonce: unparsedNonce, + timestamp: unparsedTimestamp, }: { name: string config: any - difficulty: string - mixHash: string - gasLimit: string - coinbase: string - baseFeePerGas: string - excessBlobGas: string + difficulty: PrefixedHexString + mixHash: PrefixedHexString + gasLimit: PrefixedHexString + coinbase: PrefixedHexString + baseFeePerGas: PrefixedHexString + excessBlobGas: PrefixedHexString + extraData: string + nonce: string + timestamp: string } = json - let { extraData, timestamp, nonce }: { extraData: string; timestamp: string; nonce: string } = - json - const genesisTimestamp = Number(timestamp) + const genesisTimestamp = Number(unparsedTimestamp) const { chainId }: { chainId: number } = config // geth is not strictly putting empty fields with a 0x prefix - if (extraData === '') { - extraData = '0x' - } + const extraData: PrefixedHexString = + unparsedExtraData === '' ? '0x' : (unparsedExtraData as PrefixedHexString) + // geth may use number for timestamp - if (!isHexPrefixed(timestamp)) { - timestamp = intToHex(parseInt(timestamp)) - } - // geth may not give us a nonce strictly formatted to an 8 byte hex string - if (nonce.length !== 18) { - nonce = formatNonce(nonce) - } + const timestamp: PrefixedHexString = isHexPrefixed(unparsedTimestamp) + ? unparsedTimestamp + : intToHex(parseInt(unparsedTimestamp)) + + // geth may not give us a nonce strictly formatted to an 8 byte 0x-prefixed hex string + const nonce: PrefixedHexString = + unparsedNonce.length !== 18 ? formatNonce(unparsedNonce) : (unparsedNonce as PrefixedHexString) // EIP155 and EIP158 are both part of Spurious Dragon hardfork and must occur at the same time // but have different configuration parameters in geth genesis parameters @@ -213,10 +219,14 @@ export function parseGethGenesis(json: any, name?: string, mergeForkIdPostMerge? const missingField = required.filter((field) => !(field in json)) throw new Error(`Invalid format, expected geth genesis field "${missingField}" missing`) } + + // We copy the JSON object here because it's frozen in browser and properties can't be modified + const finalJson = { ...json } + if (name !== undefined) { - json.name = name + finalJson.name = name } - return parseGethParams(json, mergeForkIdPostMerge) + return parseGethParams(finalJson, mergeForkIdPostMerge) } catch (e: any) { throw new Error(`Error parsing parameters file: ${e.message}`) } diff --git a/packages/common/test/customChains.spec.ts b/packages/common/test/customChains.spec.ts index 845905743..ed7ab5bc5 100644 --- a/packages/common/test/customChains.spec.ts +++ b/packages/common/test/customChains.spec.ts @@ -7,6 +7,8 @@ import * as testnet from './data/testnet.json' import * as testnet2 from './data/testnet2.json' import * as testnet3 from './data/testnet3.json' +import type { HardforkTransitionConfig } from '../src/index.js' + describe('[Common]: Custom chains', () => { it('chain -> object: should provide correct access to private network chain parameters', () => { const c = new Common({ chain: testnet, hardfork: Hardfork.Byzantium }) @@ -219,8 +221,7 @@ describe('custom chain setup with hardforks with undefined/null block numbers', ] assert.throws( - //@ts-expect-error -- Disabling type check to verify that error is thrown - () => Common.custom({ hardforks: undefinedHardforks }), + () => Common.custom({ hardforks: undefinedHardforks as HardforkTransitionConfig[] }), undefined, undefined, 'throws when a hardfork with an undefined block number is passed' diff --git a/packages/common/test/customCrypto.spec.ts b/packages/common/test/customCrypto.spec.ts index 4c5301e8d..9a2ef5255 100644 --- a/packages/common/test/customCrypto.spec.ts +++ b/packages/common/test/customCrypto.spec.ts @@ -1,5 +1,4 @@ -import { concatBytes } from '@ethereumjs/util' -import { randomBytes } from 'crypto' +import { concatBytes, randomBytes } from '@ethereumjs/util' import { assert, describe, it } from 'vitest' import { Chain, Common } from '../src/index.js' diff --git a/packages/common/test/eips.spec.ts b/packages/common/test/eips.spec.ts index 8d6a431dd..c40e50f62 100644 --- a/packages/common/test/eips.spec.ts +++ b/packages/common/test/eips.spec.ts @@ -4,7 +4,7 @@ import { Chain, Common, Hardfork } from '../src/index.js' describe('[Common/EIPs]: Initialization / Chain params', () => { it('Correct initialization', () => { - let eips = [1559, 2929] + let eips = [2537, 2929] const c = new Common({ chain: Chain.Mainnet, eips }) assert.equal(c.eips(), eips, 'should initialize with supported EIP') @@ -35,6 +35,8 @@ describe('[Common/EIPs]: Initialization / Chain params', () => { /* // Manual test since no test triggering EIP config available // TODO: recheck on addition of new EIP configs + // To run manually change minimumHardfork in EIP2537 config to petersburg + eips = [ 2537, ] msg = 'should throw on not meeting minimum hardfork requirements' f = () => { new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium, eips }) @@ -43,16 +45,6 @@ describe('[Common/EIPs]: Initialization / Chain params', () => { */ }) - it('isActivatedEIP()', () => { - let c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) - assert.equal(c.isActivatedEIP(2315), false, 'istanbul, eips: [] -> false (EIP-2315)') - c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul, eips: [2315] }) - assert.equal(c.isActivatedEIP(2315), true, 'istanbul, eips: [2315] -> true (EIP-2315)') - c = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin }) - assert.equal(c.isActivatedEIP(2929), true, 'berlin, eips: [] -> true (EIP-2929)') - assert.equal(c.isActivatedEIP(2315), false, 'berlin, eips: [] -> true (EIP-2315)') - }) - it('eipBlock', () => { const c = new Common({ chain: Chain.Mainnet }) diff --git a/packages/common/test/params.spec.ts b/packages/common/test/params.spec.ts index 83d55e82d..3e4202ef3 100644 --- a/packages/common/test/params.spec.ts +++ b/packages/common/test/params.spec.ts @@ -4,7 +4,7 @@ import { Chain, Common, Hardfork } from '../src/index.js' describe('[Common]: Parameter access for param(), paramByHardfork()', () => { it('Basic usage', () => { - const c = new Common({ chain: Chain.Mainnet }) + const c = new Common({ chain: Chain.Mainnet, eips: [2537] }) let msg = 'Should return correct value when HF directly provided' assert.equal(c.paramByHardfork('gasPrices', 'ecAdd', 'byzantium'), BigInt(500), msg) @@ -19,6 +19,15 @@ describe('[Common]: Parameter access for param(), paramByHardfork()', () => { msg = 'Should return 0n for non-existing value' assert.equal(c.param('gasPrices', 'notexistingvalue'), BigInt(0), msg) assert.equal(c.paramByHardfork('gasPrices', 'notexistingvalue', 'byzantium'), BigInt(0), msg) + + /* + // Manual test since no test triggering EIP config available + // TODO: recheck on addition of new EIP configs + // To run please manually add an "ecAdd" entry with value 12345 to EIP2537 config + // and uncomment the test + msg = 'EIP config should take precedence over HF config' + assert.equal(c.param('gasPrices', 'ecAdd'), 12345, msg) + */ }) it('Error cases for param(), paramByHardfork()', () => { @@ -101,9 +110,10 @@ describe('[Common]: Parameter access for param(), paramByHardfork()', () => { let msg = 'Should return undefined for non-existing value' assert.equal(c.paramByEIP('gasConfig', 'notexistingvalue', 1559), undefined, msg) + assert.equal(c.paramByEIP('gasPrices', 'notexistingvalue', 2537), undefined, msg) const UNSUPPORTED_EIP = 1000000 - const f = function () { + let f = function () { c.paramByEIP('gasPrices', 'Bls12381G1AddGas', UNSUPPORTED_EIP) } msg = 'Should throw for using paramByEIP() with an unsupported EIP' @@ -111,6 +121,14 @@ describe('[Common]: Parameter access for param(), paramByHardfork()', () => { msg = 'Should return undefined for paramByEIP() with a not existing topic' assert.equal(c.paramByEIP('notExistingTopic', 'Bls12381G1AddGas', 1559), undefined, msg) + f = function () { + c.paramByEIP('notExistingTopic', 'Bls12381G1AddGas', 2537) + } + msg = 'Should return undefined for paramByEIP() with a not existing topic' + assert.equal(f(), undefined, msg) + + msg = 'Should return Bls12381G1AddGas gas price for EIP2537' + assert.equal(c.paramByEIP('gasPrices', 'Bls12381G1AddGas', 2537), BigInt(600), msg) }) it('returns the right block delay for EIP3554', () => { diff --git a/packages/devp2p/CHANGELOG.md b/packages/devp2p/CHANGELOG.md index d061ec2b7..17ffa2d4e 100644 --- a/packages/devp2p/CHANGELOG.md +++ b/packages/devp2p/CHANGELOG.md @@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 6.1.2 - 2024-03-05 + +- Fix a type error related to the `lru-cache` dependency, PR [#3285](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3285) +- Downstream dependency updates, see PR [#3297](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3297) + ## 6.1.1 - 2024-02-08 - Hotfix release adding a missing `debug` dependency to the `@ethereumjs/trie` package (dependency), PR [#3271](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3271) diff --git a/packages/devp2p/examples/peer-communication-les.ts b/packages/devp2p/examples/peer-communication-les.ts index ff4ee1a40..eb7886d9f 100644 --- a/packages/devp2p/examples/peer-communication-les.ts +++ b/packages/devp2p/examples/peer-communication-les.ts @@ -36,8 +36,7 @@ const REMOTE_CLIENTID_FILTER = [ 'prichain', ] -// @ts-ignore -const getPeerAddr = (peer: Peer) => `${peer._socket.remoteAddress}:${peer._socket.remotePort}` +const getPeerAddr = (peer: Peer) => `${peer['_socket'].remoteAddress}:${peer['_socket'].remotePort}` // DPT const dpt = new devp2p.DPT(PRIVATE_KEY, { @@ -87,7 +86,7 @@ rlpx.events.on('peer:added', (peer) => { forkID: [hexToBytes('0x3b8e0691'), intToBytes(1)], }) - les.events.once('status', (status: LES.Status) => { + les.events.once('status', (status: devp2p.LES.Status) => { const msg = [ Uint8Array.from([]), [ @@ -100,7 +99,7 @@ rlpx.events.on('peer:added', (peer) => { les.sendMessage(devp2p.LES.MESSAGE_CODES.GET_BLOCK_HEADERS, msg) }) - les.events.on('message', async (code: LES.MESSAGE_CODES, payload: any) => { + les.events.on('message', async (code: devp2p.LES.MESSAGE_CODES, payload: any) => { switch (code) { case devp2p.LES.MESSAGE_CODES.BLOCK_HEADERS: { if (payload[2].length > 1) { @@ -224,11 +223,9 @@ setInterval(() => { const peersCount = dpt.getPeers().length const openSlots = rlpx._getOpenSlots() - // @ts-ignore - const queueLength = rlpx._peersQueue.length + const queueLength = rlpx['_peersQueue'].length - // @ts-ignore - const queueLength2 = rlpx._peersQueue.filter((o) => o.ts <= Date.now()).length + const queueLength2 = rlpx['_peersQueue'].filter((o) => o.ts <= Date.now()).length console.log( chalk.yellow( diff --git a/packages/devp2p/examples/peer-communication.ts b/packages/devp2p/examples/peer-communication.ts index 8f0ee9857..8835df755 100644 --- a/packages/devp2p/examples/peer-communication.ts +++ b/packages/devp2p/examples/peer-communication.ts @@ -48,8 +48,7 @@ const CHECK_BLOCK_HEADER = RLP.decode( '0xf90219a0d44a4d33e28d7ea9edd12b69bd32b394587eee498b0e2543ce2bad1877ffbeaca01dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347941ad91ee08f21be3de0ba2ba6918e714da6b45836a0fdec060ee45e55da9e36060fc95dddd0bdc47e447224666a895d9f0dc9adaa0ca0092d9fcc02ca9b372daec726704ce720d3aa366739868f4820ecaabadb9ac309a0974fee017515a46303f467b6fd50872994db1b0ea64d3455bad93ff9678aced9b90100356050004c5c89691add79838a01d4c302419252a4d3c96e9273908b7ee84660886c070607b4928c416a1800746a0d1dbb442d0baf06eea321422263726748600cc200e82aec08336863514d12d665718016989189c116bc0947046cc6718110586c11464a189000a11a41cc96991970153d88840768170244197e164c6204249b9091a0052ac85088c8108a4418dd2903690a036722623888ea14e90458a390a305a2342cb02766094f68c4100036330719848b48411614686717ab6068a46318204232429dc42020608802ceecd66c3c33a3a1fc6e82522049470328a4a81ba07c6604228ba94f008476005087a6804463696b41002650c0fdf548448a90408717ca31b6d618e883bad42083be153b83bdfbb1846078104798307834383639373636353666366532303530366636663663a0ae1de0acd35a98e211c7e276ad7524bb84a5e1b8d33dd7d1c052b095b564e8b888cca66773148b6e12' ) -// @ts-ignore -const getPeerAddr = (peer: Peer) => `${peer._socket.remoteAddress}:${peer._socket.remotePort}` +const getPeerAddr = (peer: Peer) => `${peer['_socket'].remoteAddress}:${peer['_socket'].remotePort}` // DPT const dpt = new devp2p.DPT(PRIVATE_KEY, { @@ -373,11 +372,9 @@ setInterval(() => { const peersCount = dpt.getPeers().length const openSlots = rlpx._getOpenSlots() - // @ts-ignore - const queueLength = rlpx._peersQueue.length + const queueLength = rlpx['_peersQueue'].length - // @ts-ignore - const queueLength2 = rlpx._peersQueue.filter((o) => o.ts <= Date.now()).length + const queueLength2 = rlpx['_peersQueue'].filter((o) => o.ts <= Date.now()).length console.log( chalk.yellow( diff --git a/packages/devp2p/package.json b/packages/devp2p/package.json index 5e5365059..ef61ba0a2 100644 --- a/packages/devp2p/package.json +++ b/packages/devp2p/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/devp2p", - "version": "6.1.1", + "version": "6.1.2", "description": "A JavaScript implementation of ÐΞVp2p", "keywords": [ "ethereum", @@ -57,9 +57,9 @@ "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/common": "^4.2.0", + "@ethereumjs/common": "^4.3.0", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/util": "^9.0.3", "@scure/base": "1.1.1", "debug": "^4.3.3", "ethereum-cryptography": "^2.1.3", @@ -69,8 +69,8 @@ "snappyjs": "^0.6.1" }, "devDependencies": { - "@ethereumjs/block": "^5.1.1", - "@ethereumjs/tx": "^5.2.1", + "@ethereumjs/block": "^5.2.0", + "@ethereumjs/tx": "^5.3.0", "@types/debug": "^4.1.9", "@types/k-bucket": "^5.0.0", "chalk": "^4.1.2", diff --git a/packages/devp2p/src/protocol/eth.ts b/packages/devp2p/src/protocol/eth.ts index 5772808ad..9a9dd76bc 100644 --- a/packages/devp2p/src/protocol/eth.ts +++ b/packages/devp2p/src/protocol/eth.ts @@ -63,11 +63,9 @@ export class ETH extends Protocol { if (code !== ETH.MESSAGE_CODES.STATUS && this.DEBUG) { const debugMsg = this.DEBUG - ? // @ts-ignore - `Received ${this.getMsgPrefix(code)} message from ${this._peer._socket.remoteAddress}:${ - // @ts-ignore - this._peer._socket.remotePort - }` + ? `Received ${this.getMsgPrefix(code)} message from ${ + this._peer['_socket'].remoteAddress + }:${this._peer['_socket'].remotePort}` : undefined const logData = formatLogData(bytesToHex(data), this._verbose) this.debug(this.getMsgPrefix(code), `${debugMsg}: ${logData}`) @@ -88,12 +86,8 @@ export class ETH extends Protocol { if (this.DEBUG) { const debugMsg = this.DEBUG ? `Received ${this.getMsgPrefix(code)} message from ${ - // @ts-ignore - this._peer._socket.remoteAddress - }:${ - // @ts-ignore - this._peer._socket.remotePort - }` + this._peer['_socket'].remoteAddress + }:${this._peer['_socket'].remotePort}` : undefined this.debug(this.getMsgPrefix(code), `${debugMsg}: ${peerStatusMsg}`) } @@ -302,10 +296,8 @@ export class ETH extends Protocol { this.debug( 'STATUS', - // @ts-ignore - `Send STATUS message to ${this._peer._socket.remoteAddress}:${ - // @ts-ignore - this._peer._socket.remotePort + `Send STATUS message to ${this._peer['_socket'].remoteAddress}:${ + this._peer['_socket'].remotePort } (eth${this._version}): ${this._getStatusString(this._status)}` ) } @@ -313,8 +305,7 @@ export class ETH extends Protocol { let payload = RLP.encode(this._status) // Use snappy compression if peer supports DevP2P >=v5 - // @ts-ignore - if (this._peer._hello !== null && this._peer._hello.protocolVersion >= 5) { + if (this._peer['_hello'] !== null && this._peer['_hello'].protocolVersion >= 5) { payload = snappy.compress(payload) } @@ -326,8 +317,7 @@ export class ETH extends Protocol { if (this.DEBUG) { const logData = formatLogData(bytesToHex(RLP.encode(payload)), this._verbose) const messageName = this.getMsgPrefix(code) - // @ts-ignore - const debugMsg = `Send ${messageName} message to ${this._peer._socket.remoteAddress}:${this._peer._socket.remotePort}: ${logData}` + const debugMsg = `Send ${messageName} message to ${this._peer['_socket'].remoteAddress}:${this._peer['_socket'].remotePort}: ${logData}` this.debug(messageName, debugMsg) } @@ -369,8 +359,7 @@ export class ETH extends Protocol { payload = RLP.encode(payload) // Use snappy compression if peer supports DevP2P >=v5 - // @ts-ignore - if (this._peer._hello !== null && this._peer._hello.protocolVersion >= 5) { + if (this._peer['_hello'] !== null && this._peer['_hello'].protocolVersion >= 5) { payload = snappy.compress(payload) } diff --git a/packages/devp2p/src/protocol/les.ts b/packages/devp2p/src/protocol/les.ts index bb38eff6c..357c8d5c6 100644 --- a/packages/devp2p/src/protocol/les.ts +++ b/packages/devp2p/src/protocol/les.ts @@ -49,11 +49,8 @@ export class LES extends Protocol { this.debug( this.getMsgPrefix(code), `${`Received ${this.getMsgPrefix(code)} message from ${ - (this._peer)._socket.remoteAddress - }:${ - // @ts-ignore - this._peer._socket.remotePort - }`}: ${logData}` + this._peer['_socket'].remoteAddress + }:${this._peer['_socket'].remotePort}`}: ${logData}` ) } } @@ -75,10 +72,8 @@ export class LES extends Protocol { this.debug( this.getMsgPrefix(code), `${`Received ${this.getMsgPrefix(code)} message from ${ - // @ts-ignore - this._peer._socket.remoteAddress - // @ts-ignore - }:${this._peer._socket.remotePort}`}: ${this._getStatusString(this._peerStatus)}` + this._peer['_socket'].remoteAddress + }:${this._peer['_socket'].remotePort}`}: ${this._getStatusString(this._peerStatus)}` ) } this._handleStatus() @@ -201,10 +196,8 @@ export class LES extends Protocol { if (this.DEBUG) { this.debug( 'STATUS', - // @ts-ignore - `Send STATUS message to ${this._peer._socket.remoteAddress}:${ - // @ts-ignore - this._peer._socket.remotePort + `Send STATUS message to ${this._peer['_socket'].remoteAddress}:${ + this._peer['_socket'].remotePort } (les${this._version}): ${this._getStatusString(this._status)}` ) } @@ -212,8 +205,7 @@ export class LES extends Protocol { let payload = RLP.encode(statusList) // Use snappy compression if peer supports DevP2P >=v5 - // @ts-ignore - if (this._peer._hello !== null && this._peer._hello.protocolVersion >= 5) { + if (this._peer['_hello'] !== null && this._peer['_hello'].protocolVersion >= 5) { payload = snappy.compress(payload) } @@ -230,10 +222,8 @@ export class LES extends Protocol { if (this.DEBUG) { this.debug( this.getMsgPrefix(code), - // @ts-ignore - `Send ${this.getMsgPrefix(code)} message to ${this._peer._socket.remoteAddress}:${ - // @ts-ignore - this._peer._socket.remotePort + `Send ${this.getMsgPrefix(code)} message to ${this._peer['_socket'].remoteAddress}:${ + this._peer['_socket'].remotePort }: ${formatLogData(bytesToHex(RLP.encode(payload)), this._verbose)}` ) } @@ -278,8 +268,7 @@ export class LES extends Protocol { payload = RLP.encode(payload) // Use snappy compression if peer supports DevP2P >=v5 - // @ts-ignore - if (this._peer._hello !== null && this._peer._hello.protocolVersion >= 5) { + if (this._peer['_hello'] !== null && this._peer['_hello'].protocolVersion >= 5) { payload = snappy.compress(payload) } diff --git a/packages/devp2p/src/protocol/protocol.ts b/packages/devp2p/src/protocol/protocol.ts index 746e42e67..bc8dcc28a 100644 --- a/packages/devp2p/src/protocol/protocol.ts +++ b/packages/devp2p/src/protocol/protocol.ts @@ -63,8 +63,8 @@ export abstract class Protocol { } // Remote Peer IP logger - // @ts-ignore - const ip = this._peer._socket.remoteAddress + + const ip = this._peer['_socket'].remoteAddress if (typeof ip === 'string') { this.msgDebuggers[ip] = devp2pDebug.extend(ip) } @@ -77,8 +77,7 @@ export abstract class Protocol { * Can be used together with the `devp2p:FIRST_PEER` debugger. */ _addFirstPeerDebugger() { - // @ts-ignore - const ip = this._peer._socket.remoteAddress + const ip = this._peer['_socket'].remoteAddress if (typeof ip === 'string') { this.msgDebuggers[ip] = devp2pDebug.extend('FIRST_PEER') this._peer._addFirstPeerDebugger() @@ -98,8 +97,7 @@ export abstract class Protocol { this.msgDebuggers[messageName](msg) } - // @ts-ignore - const ip = this._peer._socket.remoteAddress + const ip = this._peer['_socket'].remoteAddress if (typeof ip === 'string' && this.msgDebuggers[ip] !== undefined) { this.msgDebuggers[ip](msg) } diff --git a/packages/devp2p/src/protocol/snap.ts b/packages/devp2p/src/protocol/snap.ts index f108cb76a..084c93aa7 100644 --- a/packages/devp2p/src/protocol/snap.ts +++ b/packages/devp2p/src/protocol/snap.ts @@ -28,10 +28,8 @@ export class SNAP extends Protocol { if (this.DEBUG) { this.debug( this.getMsgPrefix(code), - // @ts-ignore - `Received ${this.getMsgPrefix(code)} message from ${this._peer._socket.remoteAddress}:${ - // @ts-ignore - this._peer._socket.remotePort + `Received ${this.getMsgPrefix(code)} message from ${this._peer['_socket'].remoteAddress}:${ + this._peer['_socket'].remotePort }: ${formatLogData(bytesToHex(data), this._verbose)}` ) } @@ -66,10 +64,8 @@ export class SNAP extends Protocol { if (this.DEBUG) { this.debug( this.getMsgPrefix(code), - // @ts-ignore - `Send ${this.getMsgPrefix(code)} message to ${this._peer._socket.remoteAddress}:${ - // @ts-ignore - this._peer._socket.remotePort + `Send ${this.getMsgPrefix(code)} message to ${this._peer['_socket'].remoteAddress}:${ + this._peer['_socket'].remotePort }: ${formatLogData(utils.bytesToHex(RLP.encode(payload)), this._verbose)}` ) } @@ -91,8 +87,7 @@ export class SNAP extends Protocol { payload = RLP.encode(payload) // Use snappy compression if peer supports DevP2P >=v5 - // @ts-ignore - const protocolVersion = this._peer._hello?.protocolVersion + const protocolVersion = this._peer['_hello']?.protocolVersion if (protocolVersion !== undefined && protocolVersion >= 5) { payload = snappy.compress(payload) } diff --git a/packages/devp2p/src/rlpx/peer.ts b/packages/devp2p/src/rlpx/peer.ts index 7849f43bb..88ff611c5 100644 --- a/packages/devp2p/src/rlpx/peer.ts +++ b/packages/devp2p/src/rlpx/peer.ts @@ -174,11 +174,10 @@ export class Peer { _sendAck() { if (this._closed) return this._logger( - // @ts-ignore - `Send ack (EIP8: ${this._eciesSession._gotEIP8Auth}) to ${this._socket.remoteAddress}:${this._socket.remotePort}` + `Send ack (EIP8: ${this._eciesSession['_gotEIP8Auth']}) to ${this._socket.remoteAddress}:${this._socket.remotePort}` ) - // @ts-ignore - if (this._eciesSession._gotEIP8Auth) { + + if (this._eciesSession['_gotEIP8Auth']) { const ackEIP8 = this._eciesSession.createAckEIP8() if (!ackEIP8) return this._socket.write(ackEIP8) @@ -315,13 +314,11 @@ export class Peer { _handleAuth() { const bytesCount = this._nextPacketSize const parseData = this._socketData.subarray(0, bytesCount) - // @ts-ignore - if (!this._eciesSession._gotEIP8Auth) { + if (!this._eciesSession['_gotEIP8Auth']) { if (parseData.subarray(0, 1) === hexToBytes('0x04')) { this._eciesSession.parseAuthPlain(parseData) } else { - // @ts-ignore - this._eciesSession._gotEIP8Auth = true + this._eciesSession['_gotEIP8Auth'] = true this._nextPacketSize = bytesToInt(this._socketData.subarray(0, 2)) + 2 return } @@ -340,16 +337,14 @@ export class Peer { _handleAck() { const bytesCount = this._nextPacketSize const parseData = this._socketData.subarray(0, bytesCount) - // @ts-ignore - if (!this._eciesSession._gotEIP8Ack) { + if (!this._eciesSession['_gotEIP8Ack']) { if (parseData.subarray(0, 1) === hexToBytes('0x04')) { this._eciesSession.parseAckPlain(parseData) this._logger( `Received ack (old format) from ${this._socket.remoteAddress}:${this._socket.remotePort}` ) } else { - // @ts-ignore - this._eciesSession._gotEIP8Ack = true + this._eciesSession['_gotEIP8Ack'] = true this._nextPacketSize = bytesToInt(this._socketData.subarray(0, 2)) + 2 return } diff --git a/packages/devp2p/src/rlpx/rlpx.ts b/packages/devp2p/src/rlpx/rlpx.ts index a34b231b4..7790d1c9e 100644 --- a/packages/devp2p/src/rlpx/rlpx.ts +++ b/packages/devp2p/src/rlpx/rlpx.ts @@ -284,10 +284,8 @@ export class RLPx { this._peersQueue.push({ peer: { id: peer.getId()!, - // @ts-ignore - address: peer._socket.remoteAddress, - // @ts-ignore - tcpPort: peer._socket.remotePort, + address: peer['_socket'].remoteAddress, + tcpPort: peer['_socket'].remotePort, }, ts: (Date.now() + 300000) as number, // 5 min * 60 * 1000 }) diff --git a/packages/devp2p/test/integration/dpt-simulator.spec.ts b/packages/devp2p/test/integration/dpt-simulator.spec.ts index 6ea25e576..0b2682eff 100644 --- a/packages/devp2p/test/integration/dpt-simulator.spec.ts +++ b/packages/devp2p/test/integration/dpt-simulator.spec.ts @@ -56,8 +56,7 @@ describe('DPT simulator tests', () => { dpts[0].banPeer(peer) }) dpts[0].events.once('peer:removed', async (peer) => { - // @ts-ignore - assert.equal(dpts[0]._banlist.has(peer), true, 'ban-list should contain peer') + assert.equal(dpts[0]['_banlist'].has(peer), true, 'ban-list should contain peer') assert.equal( dpts[0].getPeers().length, 0, @@ -142,8 +141,7 @@ describe('DPT simulator tests', () => { dpts[0].destroy() assert.ok(true, 'got peer from DNS') } - // @ts-ignore - dpts[0]._dns.__setNativeDNSModuleResolve(mockDns) + dpts[0]['_dns'].__setNativeDNSModuleResolve(mockDns) await dpts[0].refresh() }) }) diff --git a/packages/devp2p/test/integration/eth-simulator.spec.ts b/packages/devp2p/test/integration/eth-simulator.spec.ts index 9d9586f41..3a8d1847c 100644 --- a/packages/devp2p/test/integration/eth-simulator.spec.ts +++ b/packages/devp2p/test/integration/eth-simulator.spec.ts @@ -122,24 +122,28 @@ describe('ETH simulator tests', () => { await sendWithProtocolVersion(it, 66) }) - it('ETH -> Eth64 -> sendStatus(): should throw on non-matching latest block provided', async () => { - await new Promise((resolve) => { - const cap = [devp2p.ETH.eth65] - const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }) - const status0: any = Object.assign({}, status) - status0['latestBlock'] = intToBytes(100000) // lower than Byzantium fork block 4370000 - - const rlpxs = util.initTwoPeerRLPXSetup(null, cap, common, 50505) - rlpxs[0].events.on('peer:added', function (peer: any) { - const protocol = peer.getProtocols()[0] - assert.throws(() => { - protocol.sendStatus(status0) - }, /latest block provided is not matching the HF setting/) - util.destroyRLPXs(rlpxs) - resolve(undefined) + it( + 'ETH -> Eth64 -> sendStatus(): should throw on non-matching latest block provided', + { timeout: 10000 }, + async () => { + await new Promise((resolve) => { + const cap = [devp2p.ETH.eth65] + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }) + const status0: any = Object.assign({}, status) + status0['latestBlock'] = intToBytes(100000) // lower than Byzantium fork block 4370000 + + const rlpxs = util.initTwoPeerRLPXSetup(null, cap, common, 50505) + rlpxs[0].events.on('peer:added', function (peer: any) { + const protocol = peer.getProtocols()[0] + assert.throws(() => { + protocol.sendStatus(status0) + }, /latest block provided is not matching the HF setting/) + util.destroyRLPXs(rlpxs) + resolve(undefined) + }) }) - }) - }) + } + ) it('ETH: send not-allowed eth67', async () => { await sendNotAllowed(it, 67, [devp2p.ETH.eth67], ETH.MESSAGE_CODES.GET_NODE_DATA) diff --git a/packages/devp2p/test/integration/util.ts b/packages/devp2p/test/integration/util.ts index 8f5b17a54..6ebef037a 100644 --- a/packages/devp2p/test/integration/util.ts +++ b/packages/devp2p/test/integration/util.ts @@ -84,8 +84,7 @@ export function getTestRLPXs( const dpts = getTestDPTs(numRLPXs, basePort) for (let i = 0; i < numRLPXs; ++i) { - // @ts-ignore - const rlpx = new RLPx(dpts[i]._privateKey, { + const rlpx = new RLPx(dpts[i]['_privateKey'], { dpt: dpts[i], maxPeers, capabilities, diff --git a/packages/ethash/CHANGELOG.md b/packages/ethash/CHANGELOG.md index bf5cb5afa..e6e3a6159 100644 --- a/packages/ethash/CHANGELOG.md +++ b/packages/ethash/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 3.0.3 - 2024-03-05 + +Maintenance release with downstream dependency updates, see PR [#3297](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3297) + ### 3.0.2 - 2024-02-08 Maintenance release with dependency updates, see PR [#3261](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3261) diff --git a/packages/ethash/docs/README.md b/packages/ethash/docs/README.md index 7b580a06d..cf5dd92c8 100644 --- a/packages/ethash/docs/README.md +++ b/packages/ethash/docs/README.md @@ -28,4 +28,4 @@ #### Defined in -[index.ts:41](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L41) +[index.ts:42](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L42) diff --git a/packages/ethash/docs/classes/Ethash.md b/packages/ethash/docs/classes/Ethash.md index 7a9ffc0e0..d05ef3e25 100644 --- a/packages/ethash/docs/classes/Ethash.md +++ b/packages/ethash/docs/classes/Ethash.md @@ -44,7 +44,7 @@ #### Defined in -[index.ts:168](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L168) +[index.ts:169](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L169) ## Properties @@ -54,7 +54,7 @@ #### Defined in -[index.ts:162](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L162) +[index.ts:163](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L163) ___ @@ -64,7 +64,7 @@ ___ #### Defined in -[index.ts:161](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L161) +[index.ts:162](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L162) ___ @@ -74,7 +74,7 @@ ___ #### Defined in -[index.ts:165](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L165) +[index.ts:166](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L166) ___ @@ -84,7 +84,7 @@ ___ #### Defined in -[index.ts:160](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L160) +[index.ts:161](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L161) ___ @@ -94,7 +94,7 @@ ___ #### Defined in -[index.ts:163](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L163) +[index.ts:164](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L164) ___ @@ -104,7 +104,7 @@ ___ #### Defined in -[index.ts:164](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L164) +[index.ts:165](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L165) ___ @@ -114,7 +114,7 @@ ___ #### Defined in -[index.ts:166](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L166) +[index.ts:167](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L167) ## Methods @@ -134,7 +134,7 @@ ___ #### Defined in -[index.ts:368](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L368) +[index.ts:369](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L369) ___ @@ -148,7 +148,7 @@ ___ #### Defined in -[index.ts:256](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L256) +[index.ts:257](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L257) ___ @@ -168,7 +168,7 @@ ___ #### Defined in -[index.ts:196](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L196) +[index.ts:197](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L197) ___ @@ -193,7 +193,7 @@ To mine a `BlockHeader` or `Block`, use the one-liner `await ethash.getMiner(blo #### Defined in -[index.ts:364](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L364) +[index.ts:365](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L365) ___ @@ -213,7 +213,7 @@ ___ #### Defined in -[index.ts:271](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L271) +[index.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L272) ___ @@ -235,7 +235,7 @@ Loads the seed and cache given a block number. #### Defined in -[index.ts:278](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L278) +[index.ts:279](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L279) ___ @@ -256,7 +256,7 @@ ___ #### Defined in -[index.ts:176](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L176) +[index.ts:177](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L177) ___ @@ -283,7 +283,7 @@ ___ #### Defined in -[index.ts:210](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L210) +[index.ts:211](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L211) ___ @@ -303,4 +303,4 @@ ___ #### Defined in -[index.ts:378](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L378) +[index.ts:379](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L379) diff --git a/packages/ethash/docs/classes/Miner.md b/packages/ethash/docs/classes/Miner.md index 924d1420a..c2e436f30 100644 --- a/packages/ethash/docs/classes/Miner.md +++ b/packages/ethash/docs/classes/Miner.md @@ -35,7 +35,7 @@ Create a Miner object #### Defined in -[index.ts:63](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L63) +[index.ts:64](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L64) ## Properties @@ -45,7 +45,7 @@ Create a Miner object #### Defined in -[index.ts:51](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L51) +[index.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L52) ## Methods @@ -69,7 +69,7 @@ Iterate `iterations` times over nonces to find a valid PoW. Caches solution if o #### Defined in -[index.ts:113](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L113) +[index.ts:114](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L114) ___ @@ -94,7 +94,7 @@ Iterate `iterations` time over nonces, returns a `BlockHeader` or `Block` if a s #### Defined in -[index.ts:90](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L90) +[index.ts:91](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L91) ___ @@ -110,4 +110,4 @@ Stop the miner on the next iteration #### Defined in -[index.ts:80](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L80) +[index.ts:81](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/ethash/src/index.ts#L81) diff --git a/packages/ethash/package.json b/packages/ethash/package.json index 1c1c18535..86c9b10d6 100644 --- a/packages/ethash/package.json +++ b/packages/ethash/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/ethash", - "version": "3.0.2", + "version": "3.0.3", "description": "An implementation of the Ethash consensus algorithm in JavaScript", "keywords": [ "ethash", @@ -45,14 +45,14 @@ "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/block": "^5.1.1", + "@ethereumjs/block": "^5.2.0", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/util": "^9.0.3", "bigint-crypto-utils": "^3.2.2", "ethereum-cryptography": "^2.1.3" }, "devDependencies": { - "@ethereumjs/common": "^4.2.0" + "@ethereumjs/common": "^4.3.0" }, "engines": { "node": ">=18" diff --git a/packages/evm/CHANGELOG.md b/packages/evm/CHANGELOG.md index d16398969..d88163ffa 100644 --- a/packages/evm/CHANGELOG.md +++ b/packages/evm/CHANGELOG.md @@ -6,6 +6,68 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 3.0.0 - 2024-03-05 + +### New EVM.create() Async Static Constructor + +This is an in-between breaking release on both the EVM and VM packages due to a problematic top level await() discovery in the underlying `rustbn-wasm` library (see issue [#10](https://github.com/ethereumjs/rustbn-wasm/issues/10)) generally affecting the compatiblity of our libraries. + +The `EVM` direct constructor initialization with `new EVM()` now has been deprecated and replaced by an async static `create()` constructor, as it is already done in various other libraries in the EthereumJS monorepo, see PRs [#3304](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3304/) and [#3315](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3315). + +An EVM is now initialized like the following (from our `examples`): + +```ts +import { hexToBytes } from '@ethereumjs/util' +import { EVM } from '@ethereumjs/evm' + +const evm = await EVM.create() +const res = await evm.runCode({ code: hexToBytes('0x6001') }) +``` + +Beyond solving this specific problem this generally allows for a cleaner and async-complete initialization of underlying libraries and is more future proof towards eventual upcoming async initialization additions. + +Note that the direct usage of the main constructor is not possible anymore with these releases and **you need to update your constructor usages**! + +### Full 4844 Browser Readiness + +#### WASM KZG + +Shortly following the "Dencun Hardfork Support" release round from last month, this is now the first round of releases where the EthereumJS libraries are now fully browser compatible regarding the new 4844 functionality, see PRs [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) and [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296)! 🎉 + +Our WASM wizard @acolytec3 has spent the last two weeks and created a WASM build of the [c-kzg](https://github.com/benjaminion/c-kzg) library which we have released under the `kzg-wasm` name on npm (and you can also use independently for other projects). See the newly created [GitHub repository](https://github.com/ethereumjs/kzg-wasm) for some library-specific documentation. + +This WASM KZG library can now be used for KZG initialization (replacing the old recommended `c-kzg` initialization), see the respective [README section](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/README.md#kzg-initialization) from the tx library for usage instructions (which is also accurate for the other using upstream libraries like block or EVM). + +Note that `kzg-wasm` needs to be added manually to your own dependencies and the KZG initialization code needs to be adopted like the following (which you will likely want to do in most cases, so if you deal with post Dencun EVM bytecode and/or 4844 blob txs in any way): + +```typescript +import { loadKZG } from 'kzg-wasm' +import { Chain, Common, Hardfork } from '@ethereumjs/common' + +const kzg = await loadKZG() + +// Instantiate `common` +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, +}) +``` + +Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. + +Note that passing in the KZG setup file is not necessary anymore, since this is now defaulting to the setup file from the official [KZG ceremony](https://ceremony.ethereum.org/) (which is now bundled with the KZG library). + +#### Trie Node.js Import Bug + +Since this fits well also to be placed here relatively prominently for awareness: we had a relatively nasty bug in the `@ethereumjs/trie` library with a `Node.js` web stream import also affecting browser compatibility, see PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). This bug has been fixed along with these releases and this library now references the updated trie library version. + +### Other Changes + +- Support for Preimage generation (verkle-related, experimental), new `startReportingPreimages()` method, PR [#3143](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3143) and [#3298](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3298) +- Early support for [EIP-2935](https://eips.ethereum.org/EIPS/eip-2935) - "Save historical block hashes in state" (Verkle related, likely subject to change), PRs [#3268](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3268) and [#3327](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3327) +- Export `getOpcodesForHF()` helper method, PR [#3322](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3322) + ## 2.2.1 - 2024-02-08 - Hotfix release moving the `@ethereumjs/verkle` dependency for `@ethereumjs/statemanager` from a peer dependency to the main dependencis (note that this decision might be temporary) diff --git a/packages/evm/README.md b/packages/evm/README.md index fa2c67c8f..1537ecde9 100644 --- a/packages/evm/README.md +++ b/packages/evm/README.md @@ -19,7 +19,7 @@ npm install @ethereumjs/evm This package provides the core Ethereum Virtual Machine (EVM) implementation which is capable of executing EVM-compatible bytecode. The package has been extracted from the [@ethereumjs/vm](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/vm) package along the VM `v6` release. -**Note:** If you want to work with `EIP-4844` related functionality, you will have additional manual installation steps for the **KZG setup**, see related section below. +**Note:** Starting with the Dencun hardfork `EIP-4844` related functionality will become an integrated part of the EVM functionality with the activation of the point evaluation precompile. It is therefore strongly recommended to _always_ run the EVM with a KZG library installed and initialized, see [KZG Setup](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/tx/README.md#kzg-setup) for instructions. ## Usage @@ -35,8 +35,8 @@ The following is the simplest example for an EVM instantiation: import { hexToBytes } from '@ethereumjs/util' import { EVM } from '@ethereumjs/evm' -const evm = new EVM() const main = async () => { + const evm = await EVM.create() const res = await evm.runCode({ code: hexToBytes('0x6001') }) // PUSH1 01 -- simple bytecode to push 1 onto the stack console.log(res.executionGasUsed) // 3n } @@ -44,6 +44,8 @@ const main = async () => { main() ``` +Note: with the switch from v2 to v3 the old direct `new EVM()` constructor usage has been deprecated and an `EVM` now has to be instantiated with the async static `EVM.create()` constructor. + ### Blockchain, State and Events If the EVM should run on a certain state an `@ethereumjs/statemanager` is needed. An `@ethereumjs/blockchain` instance can be passed in to provide access to external interface information like a blockhash: @@ -62,7 +64,7 @@ const main = async () => { const stateManager = new DefaultStateManager() const blockchain = await Blockchain.create() - const evm = new EVM({ + const evm = await EVM.create({ common, stateManager, blockchain, @@ -203,9 +205,13 @@ If you want to activate an EIP not currently active on the hardfork your `common import { Chain, Common } from '@ethereumjs/common' import { EVM } from '@ethereumjs/evm' -const common = new Common({ chain: Chain.Mainnet, eips: [3074] }) -const evm = new EVM({ common }) -console.log(`EIP 3074 is active - ${evm.common.isActivatedEIP(3074)}`) +const main = async () => { + const common = new Common({ chain: Chain.Mainnet, eips: [3074] }) + const evm = await EVM.create({ common }) + console.log(`EIP 3074 is active - ${evm.common.isActivatedEIP(3074)}`) +} + +main() ``` Currently supported EIPs: @@ -216,6 +222,7 @@ Currently supported EIPs: - [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537) - BLS precompiles (removed in v4.0.0, see latest v3 release) - [EIP-2565](https://eips.ethereum.org/EIPS/eip-2565) - ModExp gas cost - [EIP-2718](https://eips.ethereum.org/EIPS/eip-2718) - Transaction Types +- [EIP-2935](https://eips.ethereum.org/EIPS/eip-2935) - Save historical block hashes in state (`experimental`) - [EIP-2929](https://eips.ethereum.org/EIPS/eip-2929) - gas cost increases for state access opcodes - [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) - Optional access list tx type - [EIP-3074](https://eips.ethereum.org/EIPS/eip-3074) - AUTH and AUTHCALL opcodes diff --git a/packages/evm/docs/README.md b/packages/evm/docs/README.md index 9048fea45..788d31576 100644 --- a/packages/evm/docs/README.md +++ b/packages/evm/docs/README.md @@ -16,12 +16,14 @@ ### Interfaces - [EVMInterface](interfaces/EVMInterface.md) +- [EVMOpts](interfaces/EVMOpts.md) - [EVMResult](interfaces/EVMResult.md) - [EVMRunCallOpts](interfaces/EVMRunCallOpts.md) - [EVMRunCodeOpts](interfaces/EVMRunCodeOpts.md) - [ExecResult](interfaces/ExecResult.md) - [InterpreterStep](interfaces/InterpreterStep.md) - [PrecompileInput](interfaces/PrecompileInput.md) +- [bn128](interfaces/bn128.md) ### Type Aliases @@ -34,6 +36,7 @@ ### Functions - [getActivePrecompiles](README.md#getactiveprecompiles) +- [getOpcodesForHF](README.md#getopcodesforhf) ## Type Aliases @@ -45,7 +48,7 @@ Log that the contract emits. #### Defined in -[types.ts:334](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L334) +[types.ts:337](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L337) ## Variables @@ -87,3 +90,28 @@ Log that the contract emits. #### Defined in [precompiles/index.ts:167](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/precompiles/index.ts#L167) + +___ + +### getOpcodesForHF + +▸ **getOpcodesForHF**(`common`, `customOpcodes?`): `OpcodeContext` + +Get suitable opcodes for the required hardfork. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `common` | `Common` | {Common} Ethereumjs Common metadata object. | +| `customOpcodes?` | `CustomOpcode`[] | List with custom opcodes (see EVM `customOpcodes` option description). | + +#### Returns + +`OpcodeContext` + +Opcodes dictionary object. + +#### Defined in + +[opcodes/codes.ts:368](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/opcodes/codes.ts#L368) diff --git a/packages/evm/docs/interfaces/EVMInterface.md b/packages/evm/docs/interfaces/EVMInterface.md index c4c6b0cbe..f85fb8391 100644 --- a/packages/evm/docs/interfaces/EVMInterface.md +++ b/packages/evm/docs/interfaces/EVMInterface.md @@ -24,7 +24,7 @@ #### Defined in -[types.ts:161](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L161) +[types.ts:163](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L163) ___ @@ -37,6 +37,7 @@ ___ | Name | Type | | :------ | :------ | | `accessList?` | `Map`<`string`, `Set`<`string`\>\> | +| `preimages?` | `Map`<`string`, `Uint8Array`\> | | `addAlwaysWarmAddress` | (`address`: `string`, `addToAccessList?`: `boolean`) => `void` | | `addAlwaysWarmSlot` | (`address`: `string`, `slot`: `string`, `addToAccessList?`: `boolean`) => `void` | | `checkpoint` | () => `Promise`<`void`\> | @@ -47,6 +48,7 @@ ___ | `putAccount` | (`address`: `Address`, `account`: `Account`) => `Promise`<`void`\> | | `revert` | () => `Promise`<`void`\> | | `startReportingAccessList` | () => `void` | +| `startReportingPreimages?` | () => `void` | #### Defined in @@ -60,7 +62,7 @@ ___ #### Defined in -[types.ts:158](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L158) +[types.ts:160](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L160) ___ @@ -70,7 +72,7 @@ ___ #### Defined in -[types.ts:157](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L157) +[types.ts:159](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L159) ## Methods @@ -90,7 +92,7 @@ ___ #### Defined in -[types.ts:159](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L159) +[types.ts:161](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L161) ___ @@ -110,4 +112,4 @@ ___ #### Defined in -[types.ts:160](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L160) +[types.ts:162](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L162) diff --git a/packages/evm/docs/interfaces/EVMOpts.md b/packages/evm/docs/interfaces/EVMOpts.md new file mode 100644 index 000000000..dacab84cc --- /dev/null +++ b/packages/evm/docs/interfaces/EVMOpts.md @@ -0,0 +1,164 @@ +[@ethereumjs/evm](../README.md) / EVMOpts + +# Interface: EVMOpts + +Options for instantiating a EVM. + +## Table of contents + +### Properties + +- [allowUnlimitedContractSize](EVMOpts.md#allowunlimitedcontractsize) +- [allowUnlimitedInitCodeSize](EVMOpts.md#allowunlimitedinitcodesize) +- [blockchain](EVMOpts.md#blockchain) +- [common](EVMOpts.md#common) +- [customOpcodes](EVMOpts.md#customopcodes) +- [customPrecompiles](EVMOpts.md#customprecompiles) +- [profiler](EVMOpts.md#profiler) +- [stateManager](EVMOpts.md#statemanager) + +## Properties + +### allowUnlimitedContractSize + +â€ĸ `Optional` **allowUnlimitedContractSize**: `boolean` + +Allows unlimited contract sizes while debugging. By setting this to `true`, the check for +contract size limit of 24KB (see [EIP-170](https://git.io/vxZkK)) is bypassed. + +Default: `false` [ONLY set to `true` during debugging] + +#### Defined in + +[types.ts:223](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L223) + +___ + +### allowUnlimitedInitCodeSize + +â€ĸ `Optional` **allowUnlimitedInitCodeSize**: `boolean` + +Allows unlimited contract code-size init while debugging. This (partially) disables EIP-3860. +Gas cost for initcode size analysis will still be charged. Use with caution. + +#### Defined in + +[types.ts:229](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L229) + +___ + +### blockchain + +â€ĸ `Optional` **blockchain**: `Blockchain` + +#### Defined in + +[types.ts:269](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L269) + +___ + +### common + +â€ĸ `Optional` **common**: `Common` + +Use a Common instance for EVM instantiation. + +### Supported EIPs + +- [EIP-1153](https://eips.ethereum.org/EIPS/eip-1153) - Transient storage opcodes (Cancun) +- [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) - Fee market change for ETH 1.0 chain +- [EIP-2315](https://eips.ethereum.org/EIPS/eip-2315) - Simple subroutines for the EVM (`outdated`) +- [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537) - BLS precompiles (removed in v4.0.0, see latest v3 release) +- [EIP-2565](https://eips.ethereum.org/EIPS/eip-2565) - ModExp gas cost +- [EIP-2718](https://eips.ethereum.org/EIPS/eip-2565) - Transaction Types +- [EIP-2935](https://eips.ethereum.org/EIPS/eip-2935) - Save historical block hashes in state (`experimental`) +- [EIP-2929](https://eips.ethereum.org/EIPS/eip-2929) - gas cost increases for state access opcodes +- [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) - Optional access list tx type +- [EIP-3074](https://eips.ethereum.org/EIPS/eip-3074) - AUTH and AUTHCALL opcodes +- [EIP-3198](https://eips.ethereum.org/EIPS/eip-3198) - Base fee Opcode +- [EIP-3529](https://eips.ethereum.org/EIPS/eip-3529) - Reduction in refunds +- [EIP-3540](https://eips.ethereum.org/EIPS/eip-3541) - EVM Object Format (EOF) v1 (`outdated`) +- [EIP-3541](https://eips.ethereum.org/EIPS/eip-3541) - Reject new contracts starting with the 0xEF byte +- [EIP-3554](https://eips.ethereum.org/EIPS/eip-3554) - Difficulty Bomb Delay to December 2021 (only PoW networks) +- [EIP-3607](https://eips.ethereum.org/EIPS/eip-3607) - Reject transactions from senders with deployed code +- [EIP-3651](https://eips.ethereum.org/EIPS/eip-3651) - Warm COINBASE (Shanghai) +- [EIP-3670](https://eips.ethereum.org/EIPS/eip-3670) - EOF - Code Validation (`outdated`) +- [EIP-3675](https://eips.ethereum.org/EIPS/eip-3675) - Upgrade consensus to Proof-of-Stake +- [EIP-3855](https://eips.ethereum.org/EIPS/eip-3855) - Push0 opcode (Shanghai) +- [EIP-3860](https://eips.ethereum.org/EIPS/eip-3860) - Limit and meter initcode (Shanghai) +- [EIP-4345](https://eips.ethereum.org/EIPS/eip-4345) - Difficulty Bomb Delay to June 2022 +- [EIP-4399](https://eips.ethereum.org/EIPS/eip-4399) - Supplant DIFFICULTY opcode with PREVRANDAO (Merge) +- [EIP-4788](https://eips.ethereum.org/EIPS/eip-4788) - Beacon block root in the EVM (Cancun) +- [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) - Shard Blob Transactions (Cancun) +- [EIP-4895](https://eips.ethereum.org/EIPS/eip-4895) - Beacon chain push withdrawals as operations (Shanghai) +- [EIP-5133](https://eips.ethereum.org/EIPS/eip-5133) - Delaying Difficulty Bomb to mid-September 2022 (Gray Glacier) +- [EIP-5656](https://eips.ethereum.org/EIPS/eip-5656) - MCOPY - Memory copying instruction (Cancun) +- [EIP-6780](https://eips.ethereum.org/EIPS/eip-6780) - SELFDESTRUCT only in same transaction (Cancun) +- [EIP-7516](https://eips.ethereum.org/EIPS/eip-7516) - BLOBBASEFEE opcode (Cancun) + +*Annotations:* + +- `experimental`: behaviour can change on patch versions + +#### Defined in + +[types.ts:215](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L215) + +___ + +### customOpcodes + +â€ĸ `Optional` **customOpcodes**: `CustomOpcode`[] + +Override or add custom opcodes to the EVM instruction set +These custom opcodes are EIP-agnostic and are always statically added +To delete an opcode, add an entry of format `{opcode: number}`. This will delete that opcode from the EVM. +If this opcode is then used in the EVM, the `INVALID` opcode would instead be used. +To add an opcode, add an entry of the following format: +{ + // The opcode number which will invoke the custom opcode logic + opcode: number + // The name of the opcode (as seen in the `step` event) + opcodeName: string + // The base fee of the opcode + baseFee: number + // If the opcode charges dynamic gas, add this here. To charge the gas, use the `i` methods of the BN, to update the charged gas + gasFunction?: function(runState: RunState, gas: BN, common: Common) + // The logic of the opcode which holds the logic of changing the current state + logicFunction: function(runState: RunState) +} +Note: gasFunction and logicFunction can both be async or synchronous functions + +#### Defined in + +[types.ts:251](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L251) + +___ + +### customPrecompiles + +â€ĸ `Optional` **customPrecompiles**: `CustomPrecompile`[] + +#### Defined in + +[types.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L259) + +___ + +### profiler + +â€ĸ `Optional` **profiler**: `EVMProfilerOpts` + +#### Defined in + +[types.ts:274](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L274) + +___ + +### stateManager + +â€ĸ `Optional` **stateManager**: `EVMStateManagerInterface` + +#### Defined in + +[types.ts:264](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L264) diff --git a/packages/evm/docs/interfaces/EVMResult.md b/packages/evm/docs/interfaces/EVMResult.md index a1a05689f..bd406a4c2 100644 --- a/packages/evm/docs/interfaces/EVMResult.md +++ b/packages/evm/docs/interfaces/EVMResult.md @@ -21,7 +21,7 @@ Address of created account during transaction, if any #### Defined in -[types.ts:281](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L281) +[types.ts:284](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L284) ___ @@ -33,4 +33,4 @@ Contains the results from running the code, if any, as described in runCode #### Defined in -[types.ts:285](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L285) +[types.ts:288](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L288) diff --git a/packages/evm/docs/interfaces/ExecResult.md b/packages/evm/docs/interfaces/ExecResult.md index 233f0b74f..b43ad47ad 100644 --- a/packages/evm/docs/interfaces/ExecResult.md +++ b/packages/evm/docs/interfaces/ExecResult.md @@ -29,7 +29,7 @@ Amount of blob gas consumed by the transaction #### Defined in -[types.ts:328](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L328) +[types.ts:331](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L331) ___ @@ -41,7 +41,7 @@ Map of addresses which were created (used in EIP 6780) #### Defined in -[types.ts:320](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L320) +[types.ts:323](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L323) ___ @@ -53,7 +53,7 @@ Description of the exception, if any occurred #### Defined in -[types.ts:296](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L296) +[types.ts:299](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L299) ___ @@ -65,7 +65,7 @@ Amount of gas the code used to run #### Defined in -[types.ts:304](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L304) +[types.ts:307](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L307) ___ @@ -77,7 +77,7 @@ Amount of gas left #### Defined in -[types.ts:300](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L300) +[types.ts:303](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L303) ___ @@ -89,7 +89,7 @@ The gas refund counter #### Defined in -[types.ts:324](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L324) +[types.ts:327](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L327) ___ @@ -101,7 +101,7 @@ Array of logs that the contract emitted #### Defined in -[types.ts:312](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L312) +[types.ts:315](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L315) ___ @@ -113,7 +113,7 @@ Return value from the contract #### Defined in -[types.ts:308](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L308) +[types.ts:311](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L311) ___ @@ -123,7 +123,7 @@ ___ #### Defined in -[types.ts:292](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L292) +[types.ts:295](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L295) ___ @@ -135,4 +135,4 @@ A set of accounts to selfdestruct #### Defined in -[types.ts:316](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L316) +[types.ts:319](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L319) diff --git a/packages/evm/docs/interfaces/bn128.md b/packages/evm/docs/interfaces/bn128.md new file mode 100644 index 000000000..07679efb9 --- /dev/null +++ b/packages/evm/docs/interfaces/bn128.md @@ -0,0 +1,85 @@ +[@ethereumjs/evm](../README.md) / bn128 + +# Interface: bn128 + +The BN128 curve package (`rustbn-wasm`) + +## Table of contents + +### Properties + +- [ec\_add](bn128.md#ec_add) +- [ec\_mul](bn128.md#ec_mul) +- [ec\_pairing](bn128.md#ec_pairing) + +## Properties + +### ec\_add + +â€ĸ **ec\_add**: (`input_str`: `string`) => `string` + +#### Type declaration + +▸ (`input_str`): `string` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `input_str` | `string` | + +##### Returns + +`string` + +#### Defined in + +[types.ts:390](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L390) + +___ + +### ec\_mul + +â€ĸ **ec\_mul**: (`input_hex`: `string`) => `string` + +#### Type declaration + +▸ (`input_hex`): `string` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `input_hex` | `string` | + +##### Returns + +`string` + +#### Defined in + +[types.ts:391](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L391) + +___ + +### ec\_pairing + +â€ĸ **ec\_pairing**: (`input_str`: `string`) => `string` + +#### Type declaration + +▸ (`input_str`): `string` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `input_str` | `string` | + +##### Returns + +`string` + +#### Defined in + +[types.ts:389](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/evm/src/types.ts#L389) diff --git a/packages/evm/examples/simple.ts b/packages/evm/examples/simple.ts index 59eb453ae..06bc94176 100644 --- a/packages/evm/examples/simple.ts +++ b/packages/evm/examples/simple.ts @@ -2,7 +2,7 @@ import { hexToBytes } from '@ethereumjs/util' import { EVM } from '@ethereumjs/evm' const main = async () => { - const evm = await EVM.create({}) + const evm = await EVM.create() const res = await evm.runCode({ code: hexToBytes('0x6001') }) // PUSH1 01 -- simple bytecode to push 1 onto the stack console.log(res.executionGasUsed) // 3n } diff --git a/packages/evm/package.json b/packages/evm/package.json index 0d501de34..bc83328a7 100644 --- a/packages/evm/package.json +++ b/packages/evm/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/evm", - "version": "2.2.1", + "version": "3.0.0", "description": "JavaScript Ethereum Virtual Machine (EVM) implementation", "keywords": [ "ethereum", @@ -48,18 +48,19 @@ "prepublishOnly": "../../config/cli/prepublish.sh", "profiling": "0x ./benchmarks/run.js profiling", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run -c=vitest.config.browser.ts --browser.provider=playwright --browser.name=webkit --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/common": "^4.2.0", - "@ethereumjs/statemanager": "^2.2.2", - "@ethereumjs/tx": "^5.2.1", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/common": "^4.3.0", + "@ethereumjs/statemanager": "^2.3.0", + "@ethereumjs/tx": "^5.3.0", + "@ethereumjs/util": "^9.0.3", "@types/debug": "^4.1.9", "debug": "^4.3.3", "ethereum-cryptography": "^2.1.3", + "mcl-wasm": "^1.4.0", "rustbn-wasm": "^0.4.0" }, "devDependencies": { @@ -69,7 +70,7 @@ "@types/minimist": "^1.2.2", "@types/node-dir": "^0.0.34", "benchmark": "^2.1.4", - "kzg-wasm": "^0.2.0", + "kzg-wasm": "^0.4.0", "level": "^8.0.0", "memory-level": "^1.0.0", "minimist": "^1.2.5", diff --git a/packages/evm/src/evm.ts b/packages/evm/src/evm.ts index 8ebe7ce63..abe37aebb 100644 --- a/packages/evm/src/evm.ts +++ b/packages/evm/src/evm.ts @@ -17,6 +17,7 @@ import { zeros, } from '@ethereumjs/util' import debugDefault from 'debug' +import * as mcl from 'mcl-wasm' import { initRustBN } from 'rustbn-wasm' import { EOF, getEOFCode } from './eof.js' @@ -47,6 +48,7 @@ import type { EVMRunCallOpts, EVMRunCodeOpts, ExecResult, + bn128, } from './types.js' import type { EVMStateManagerInterface } from '@ethereumjs/common' const { debug: createDebugLogger } = debugDefault @@ -55,6 +57,9 @@ const debug = createDebugLogger('evm:evm') const debugGas = createDebugLogger('evm:gas') const debugPrecompiles = createDebugLogger('evm:precompiles') +let initializedRustBN: bn128 | undefined = undefined +const mclInitPromise = mcl.init(mcl.BLS12_381) + /** * EVM is responsible for executing an EVM message fully * (including any nested calls and creates), processing the results @@ -126,6 +131,13 @@ export class EVM implements EVMInterface { return this._opcodes } + /** + * Pointer to the mcl package, not for public usage + * set to public due to implementation internals + * @hidden + */ + protected readonly _mcl: any // + /** * EVM is run in DEBUG mode (default: false) * Taken from DEBUG environment variable @@ -138,51 +150,65 @@ export class EVM implements EVMInterface { protected readonly _emit: (topic: string, data: any) => Promise - private bn128: { - ec_pairing: (input_str: string) => string - ec_add: (input_str: string) => string - ec_mul: (input_hex: string) => string - } + private _bn128: bn128 + /** + * Use this async static constructor for the initialization + * of an EVM object + * + * @param createOpts The EVM options + * @returns A new EVM + */ static async create(createOpts?: EVMOpts) { const opts = createOpts ?? ({} as EVMOpts) - if (opts?.bn128 === undefined) { - opts.bn128 = await initRustBN() - } - return new EVM(opts) - } - constructor(opts: EVMOpts) { - if (opts.bn128 === undefined) { - throw new Error('rustbn not provided') + const bn128 = initializedRustBN ?? (await initRustBN()) + initializedRustBN = bn128 + + if (createOpts?.common && createOpts.common.isActivatedEIP(2537)) { + await mclInitPromise // ensure that mcl is initialized. + mcl.setMapToMode(mcl.IRTF) // set the right map mode; otherwise mapToG2 will return wrong values. + mcl.verifyOrderG1(true) // subgroup checks for G1 + mcl.verifyOrderG2(true) // subgroup checks for G2 } - this.bn128 = opts.bn128 // Required to instantiate the EVM - this.events = new AsyncEventEmitter() - this._optsCached = opts + if (opts.common === undefined) { + opts.common = new Common({ chain: Chain.Mainnet }) + } - this.transientStorage = new TransientStorage() + if (opts.blockchain === undefined) { + opts.blockchain = new DefaultBlockchain() + } - if (opts.common) { - this.common = opts.common - } else { - const DEFAULT_CHAIN = Chain.Mainnet - this.common = new Common({ chain: DEFAULT_CHAIN }) + if (opts.stateManager === undefined) { + opts.stateManager = new DefaultStateManager() } - let blockchain: Blockchain + return new EVM(opts, bn128) + } - if (opts.blockchain === undefined) { - blockchain = new DefaultBlockchain() - } else { - blockchain = opts.blockchain - } + /** + * + * Creates new EVM object + * + * @deprecated The direct usage of this constructor is replaced since + * non-finalized async initialization lead to side effects. Please + * use the async {@link EVM.create} constructor instead (same API). + * + * @param opts The EVM options + * @param bn128 Initialized bn128 WASM object for precompile usage (internal) + */ + protected constructor(opts: EVMOpts, bn128: bn128) { + this.common = opts.common! + this.blockchain = opts.blockchain! + this.stateManager = opts.stateManager! - this.blockchain = blockchain - this.stateManager = opts.stateManager ?? new DefaultStateManager() + this._bn128 = bn128 + this.events = new AsyncEventEmitter() + this._optsCached = opts // Supported EIPs const supportedEIPs = [ - 1153, 1559, 2315, 2565, 2718, 2929, 2930, 2935, 3074, 3198, 3529, 3540, 3541, 3607, 3651, + 1153, 1559, 2537, 2565, 2718, 2929, 2930, 2935, 3074, 3198, 3529, 3540, 3541, 3607, 3651, 3670, 3855, 3860, 4399, 4895, 4788, 4844, 5133, 5656, 6780, 6800, 7516, ] @@ -204,6 +230,7 @@ export class EVM implements EVMInterface { this._customPrecompiles = opts.customPrecompiles this.journal = new Journal(this.stateManager, this.common) + this.transientStorage = new TransientStorage() this.common.events.on('hardforkChanged', () => { this.getActiveOpcodes() @@ -214,6 +241,10 @@ export class EVM implements EVMInterface { this.getActiveOpcodes() this._precompiles = getActivePrecompiles(this.common, this._customPrecompiles) + if (this.common.isActivatedEIP(2537)) { + this._mcl = mcl + } + this._emit = async (topic: string, data: any): Promise => { return new Promise((resolve) => this.events.emit(topic as keyof EVMEvents, data, resolve)) } @@ -241,27 +272,38 @@ export class EVM implements EVMInterface { protected async _executeCall(message: MessageWithTo): Promise { let gasLimit = message.gasLimit + const fromAddress = message.authcallOrigin ?? message.caller if (this.common.isActivatedEIP(6800)) { + const sendsValue = message.value !== BIGINT_0 if (message.depth === 0) { - const originAccessGas = message.accessWitness!.touchTxOriginAndComputeGas( - message.authcallOrigin ?? message.caller - ) - gasLimit -= originAccessGas - if (gasLimit < BIGINT_0) { - if (this.DEBUG) { - debugGas(`Origin access charged(${originAccessGas}) caused OOG (-> ${gasLimit})`) - } - return { execResult: OOGResult(message.gasLimit) } - } else { - if (this.DEBUG) { - debugGas(`Origin access used (${originAccessGas} gas (-> ${gasLimit}))`) - } + const originAccessGas = message.accessWitness!.touchTxOriginAndComputeGas(fromAddress) + debugGas(`originAccessGas=${originAccessGas} waived off for origin at depth=0`) + + const destAccessGas = message.accessWitness!.touchTxTargetAndComputeGas(message.to, { + sendsValue, + }) + debugGas(`destAccessGas=${destAccessGas} waived off for target at depth=0`) + } + + let callAccessGas = message.accessWitness!.touchAndChargeMessageCall(message.to) + if (sendsValue) { + callAccessGas += message.accessWitness!.touchAndChargeValueTransfer(fromAddress, message.to) + } + gasLimit -= callAccessGas + if (gasLimit < BIGINT_0) { + if (this.DEBUG) { + debugGas(`callAccessGas charged(${callAccessGas}) caused OOG (-> ${gasLimit})`) + } + return { execResult: OOGResult(message.gasLimit) } + } else { + if (this.DEBUG) { + debugGas(`callAccessGas used (${callAccessGas} gas (-> ${gasLimit}))`) } } } - let account = await this.stateManager.getAccount(message.authcallOrigin ?? message.caller) + let account = await this.stateManager.getAccount(fromAddress) if (!account) { account = new Account() } @@ -275,26 +317,6 @@ export class EVM implements EVMInterface { } } - if (this.common.isActivatedEIP(6800)) { - if (message.depth === 0) { - const sendsValue = message.value !== BIGINT_0 - const destAccessGas = message.accessWitness!.touchTxExistingAndComputeGas(message.to, { - sendsValue, - }) - gasLimit -= destAccessGas - if (gasLimit < BIGINT_0) { - if (this.DEBUG) { - debugGas(`Destination access charged(${destAccessGas}) caused OOG (-> ${gasLimit})`) - } - return { execResult: OOGResult(message.gasLimit) } - } else { - if (this.DEBUG) { - debugGas(`Destination access used (${destAccessGas} gas (-> ${gasLimit}))`) - } - } - } - } - // Load `to` account let toAccount = await this.stateManager.getAccount(message.to) if (!toAccount) { @@ -396,19 +418,12 @@ export class EVM implements EVMInterface { protected async _executeCreate(message: Message): Promise { let gasLimit = message.gasLimit + const fromAddress = message.authcallOrigin ?? message.caller if (this.common.isActivatedEIP(6800)) { - const originAccessGas = message.accessWitness!.touchTxOriginAndComputeGas(message.caller) - gasLimit -= originAccessGas - if (gasLimit < BIGINT_0) { - if (this.DEBUG) { - debugGas(`Origin access charged(${originAccessGas}) caused OOG (-> ${gasLimit})`) - } - return { execResult: OOGResult(message.gasLimit) } - } else { - if (this.DEBUG) { - debugGas(`Origin access used (${originAccessGas} gas (-> ${gasLimit}))`) - } + if (message.depth === 0) { + const originAccessGas = message.accessWitness!.touchTxOriginAndComputeGas(fromAddress) + debugGas(`originAccessGas=${originAccessGas} waived off for origin at depth=0`) } } @@ -452,24 +467,20 @@ export class EVM implements EVMInterface { } if (this.common.isActivatedEIP(6800)) { - const sendsValue = message.value !== BIGINT_0 const contractCreateAccessGas = message.accessWitness!.touchAndChargeContractCreateInit( - message.to, - { sendsValue } + message.to ) gasLimit -= contractCreateAccessGas if (gasLimit < BIGINT_0) { if (this.DEBUG) { debugGas( - `Contract create (sendsValue=${sendsValue}) charge(${contractCreateAccessGas}) caused OOG (-> ${gasLimit})` + `ContractCreateInit charge(${contractCreateAccessGas}) caused OOG (-> ${gasLimit})` ) } return { execResult: OOGResult(message.gasLimit) } } else { if (this.DEBUG) { - debugGas( - `Contract create (sendsValue=${sendsValue}) charged (${contractCreateAccessGas} gas (-> ${gasLimit}))` - ) + debugGas(`ContractCreateInit charged (${contractCreateAccessGas} gas (-> ${gasLimit}))`) } } } @@ -535,7 +546,26 @@ export class EVM implements EVMInterface { debug(`Exit early on value transfer overflowed (CREATE)`) } } + if (exit) { + if (this.common.isActivatedEIP(6800)) { + const createCompleteAccessGas = + message.accessWitness!.touchAndChargeContractCreateCompleted(message.to) + gasLimit -= createCompleteAccessGas + if (gasLimit < BIGINT_0) { + if (this.DEBUG) { + debug( + `ContractCreateComplete access gas (${createCompleteAccessGas}) caused OOG (-> ${gasLimit})` + ) + } + return { execResult: OOGResult(message.gasLimit) } + } else { + debug( + `ContractCreateComplete access used (${createCompleteAccessGas}) gas (-> ${gasLimit})` + ) + } + } + return { createdAddress: message.to, execResult: { @@ -558,7 +588,7 @@ export class EVM implements EVMInterface { // fee for size of the return value let totalGas = result.executionGasUsed let returnFee = BIGINT_0 - if (!result.exceptionError) { + if (!result.exceptionError && this.common.isActivatedEIP(6800) === false) { returnFee = BigInt(result.returnValue.length) * BigInt(this.common.param('gasPrices', 'createData')) totalGas = totalGas + returnFee @@ -679,7 +709,7 @@ export class EVM implements EVMInterface { message.accessWitness!.touchCodeChunksRangeOnWriteAndChargeGas( message.to, 0, - message.code!.length - 1 + result.returnValue.length - 1 ) gasLimit -= byteCodeWriteAccessfee if (gasLimit < BIGINT_0) { @@ -690,9 +720,7 @@ export class EVM implements EVMInterface { } result = { ...result, ...OOGResult(message.gasLimit) } } else { - debug( - `ContractCreateComplete access used (${byteCodeWriteAccessfee}) gas (-> ${gasLimit})` - ) + debug(`byteCodeWrite access used (${byteCodeWriteAccessfee}) gas (-> ${gasLimit})`) result.executionGasUsed += byteCodeWriteAccessfee } } @@ -1097,10 +1125,9 @@ export class EVM implements EVMInterface { ...this._optsCached, common, stateManager: this.stateManager.shallowCopy(), - bn128: this.bn128, } ;(opts.stateManager as any).common = common - return new EVM(opts) + return new EVM(opts, this._bn128) } public getPerformanceLogs() { diff --git a/packages/evm/src/exceptions.ts b/packages/evm/src/exceptions.ts index da6eaa28c..72ede8f49 100644 --- a/packages/evm/src/exceptions.ts +++ b/packages/evm/src/exceptions.ts @@ -24,8 +24,6 @@ export enum ERROR { INVALID_INPUT_LENGTH = 'invalid input length', AUTHCALL_UNSET = 'attempting to AUTHCALL without AUTH set', - AUTHCALL_NONZERO_VALUEEXT = 'attempting to execute AUTHCALL with nonzero external value', - AUTH_INVALID_S = 'invalid Signature: s-values greater than secp256k1n/2 are considered invalid', // BLS errors BLS_12_381_INVALID_INPUT_LENGTH = 'invalid input length', diff --git a/packages/evm/src/index.ts b/packages/evm/src/index.ts index 500d727b1..4d1dc5772 100644 --- a/packages/evm/src/index.ts +++ b/packages/evm/src/index.ts @@ -1,11 +1,14 @@ import { EOF } from './eof.js' import { EVM } from './evm.js' import { ERROR as EVMErrorMessage, EvmError } from './exceptions.js' -import { InterpreterStep } from './interpreter.js' import { Message } from './message.js' -import { PrecompileInput, getActivePrecompiles } from './precompiles/index.js' -import { +import { getOpcodesForHF } from './opcodes/index.js' +import { type PrecompileInput, getActivePrecompiles } from './precompiles/index.js' + +import type { InterpreterStep } from './interpreter.js' +import type { EVMInterface, + EVMOpts, EVMResult, EVMRunCallOpts, EVMRunCodeOpts, @@ -13,20 +16,18 @@ import { Log, bn128, } from './types.js' -export { + +export type { bn128, - EOF, - EVM, - EvmError, - EVMErrorMessage, EVMInterface, + EVMOpts, EVMResult, EVMRunCallOpts, EVMRunCodeOpts, ExecResult, - getActivePrecompiles, InterpreterStep, Log, - Message, PrecompileInput, } + +export { EOF, EVM, EvmError, EVMErrorMessage, getActivePrecompiles, getOpcodesForHF, Message } diff --git a/packages/evm/src/interpreter.ts b/packages/evm/src/interpreter.ts index ae7f109b2..426ee7314 100644 --- a/packages/evm/src/interpreter.ts +++ b/packages/evm/src/interpreter.ts @@ -1,5 +1,4 @@ import { ConsensusAlgorithm } from '@ethereumjs/common' -import { StatelessVerkleStateManager } from '@ethereumjs/statemanager' import { Account, BIGINT_0, @@ -25,7 +24,7 @@ import type { Journal } from './journal.js' import type { AsyncOpHandler, Opcode, OpcodeMapEntry } from './opcodes/index.js' import type { Block, Blockchain, EVMProfilerOpts, EVMResult, Log } from './types.js' import type { Common, EVMStateManagerInterface } from '@ethereumjs/common' -import type { AccessWitness } from '@ethereumjs/statemanager' +import type { AccessWitness, StatelessVerkleStateManager } from '@ethereumjs/statemanager' import type { Address } from '@ethereumjs/util' const { debug: createDebugLogger } = debugDefault @@ -80,7 +79,6 @@ export interface RunState { memoryWordCount: bigint highestMemCost: bigint stack: Stack - returnStack: Stack code: Uint8Array shouldDoJumpAnalysis: boolean validJumps: Uint8Array // array of values where validJumps[index] has value 0 (default), 1 (jumpdest), 2 (beginsub) @@ -106,7 +104,6 @@ export interface InterpreterStep { gasRefund: bigint stateManager: EVMStateManagerInterface stack: bigint[] - returnStack: bigint[] pc: number depth: number opcode: { @@ -165,7 +162,6 @@ export class Interpreter { memoryWordCount: BIGINT_0, highestMemCost: BIGINT_0, stack: new Stack(), - returnStack: new Stack(1023), // 1023 return stack height limit per EIP 2315 spec code: new Uint8Array(0), validJumps: Uint8Array.from([]), cachedPushes: {}, @@ -270,14 +266,15 @@ export class Interpreter { if ( opCode === 0xfe && this.common.isActivatedEIP(6800) && - this._runState.stateManager instanceof StatelessVerkleStateManager + // is this a code loaded from state using witnesses + this._runState.env.chargeCodeAccesses === true ) { const contract = this._runState.interpreter.getAddress() + if ( - !(this._runState.stateManager as StatelessVerkleStateManager).checkChunkWitnessPresent( - contract, - programCounter - ) + !(await ( + this._runState.stateManager as StatelessVerkleStateManager + ).checkChunkWitnessPresent(contract, programCounter)) ) { throw Error(`Invalid witness with missing codeChunk for pc=${programCounter}`) } @@ -413,7 +410,6 @@ export class Interpreter { isAsync: opcode.isAsync, }, stack: this._runState.stack.getStack(), - returnStack: this._runState.returnStack.getStack(), depth: this._env.depth, address: this._env.address, account: this._env.contract, @@ -493,9 +489,6 @@ export class Interpreter { } else if (opcode === 0x5b) { // Define a JUMPDEST as a 1 in the valid jumps array jumps[i] = 1 - } else if (opcode === 0x5c) { - // Define a BEGINSUB as a 2 in the valid jumps array - jumps[i] = 2 } } } @@ -1072,6 +1065,7 @@ export class Interpreter { selfdestruct, gasRefund: this._runState.gasRefund, blobVersionedHashes: this._env.blobVersionedHashes, + accessWitness: this._env.accessWitness, }) let createdAddresses: Set diff --git a/packages/evm/src/journal.ts b/packages/evm/src/journal.ts index 75268df12..9eeaec655 100644 --- a/packages/evm/src/journal.ts +++ b/packages/evm/src/journal.ts @@ -6,10 +6,10 @@ import { bytesToHex, bytesToUnprefixedHex, stripHexPrefix, - toBytes, unprefixedHexToBytes, } from '@ethereumjs/util' import debugDefault from 'debug' +import { hexToBytes } from 'ethereum-cryptography/utils' import type { Common, EVMStateManagerInterface } from '@ethereumjs/common' import type { Account } from '@ethereumjs/util' @@ -196,7 +196,7 @@ export class Journal { async cleanup(): Promise { if (this.common.gteHardfork(Hardfork.SpuriousDragon) === true) { for (const addressHex of this.touched) { - const address = new Address(toBytes('0x' + addressHex)) + const address = new Address(hexToBytes(`0x${addressHex}`)) const account = await this.stateManager.getAccount(address) if (account === undefined || account.isEmpty()) { if (this.common.isActivatedEIP(2935)) { diff --git a/packages/evm/src/opcodes/EIP2929.ts b/packages/evm/src/opcodes/EIP2929.ts index a2d220498..d5c0d0712 100644 --- a/packages/evm/src/opcodes/EIP2929.ts +++ b/packages/evm/src/opcodes/EIP2929.ts @@ -28,7 +28,8 @@ export function accessAddressEIP2929( // CREATE, CREATE2 opcodes have the address warmed for free. // selfdestruct beneficiary address reads are charged an *additional* cold access - if (chargeGas) { + // if verkle not activated + if (chargeGas && common.isActivatedEIP(6800) === false) { return common.param('gasPrices', 'coldaccountaccess') } // Warm: (selfdestruct beneficiary address reads are not charged when warm) @@ -50,7 +51,8 @@ export function accessStorageEIP2929( runState: RunState, key: Uint8Array, isSstore: boolean, - common: Common + common: Common, + chargeGas = true ): bigint { if (common.isActivatedEIP(2929) === false) return BIGINT_0 @@ -60,8 +62,10 @@ export function accessStorageEIP2929( // Cold (SLOAD and SSTORE) if (slotIsCold) { runState.interpreter.journal.addWarmedStorage(address, key) - return common.param('gasPrices', 'coldsload') - } else if (!isSstore) { + if (chargeGas && common.isActivatedEIP(6800) === false) { + return common.param('gasPrices', 'coldsload') + } + } else if (chargeGas && (!isSstore || common.isActivatedEIP(6800) === true)) { return common.param('gasPrices', 'warmstorageread') } return BIGINT_0 diff --git a/packages/evm/src/opcodes/codes.ts b/packages/evm/src/opcodes/codes.ts index 97a6a4874..5b24d27c2 100644 --- a/packages/evm/src/opcodes/codes.ts +++ b/packages/evm/src/opcodes/codes.ts @@ -274,14 +274,6 @@ const eipOpcodes: { eip: number; opcodes: OpcodeEntry }[] = [ 0x5d: { name: 'TSTORE', isAsync: false, dynamicGas: false }, }, }, - { - eip: 2315, - opcodes: { - 0x5c: { name: 'BEGINSUB', isAsync: false, dynamicGas: false }, - 0x5d: { name: 'RETURNSUB', isAsync: false, dynamicGas: false }, - 0x5e: { name: 'JUMPSUB', isAsync: false, dynamicGas: false }, - }, - }, { eip: 3198, opcodes: { diff --git a/packages/evm/src/opcodes/functions.ts b/packages/evm/src/opcodes/functions.ts index 391f62c58..1efde4d4b 100644 --- a/packages/evm/src/opcodes/functions.ts +++ b/packages/evm/src/opcodes/functions.ts @@ -1,8 +1,9 @@ +import { getTreeIndexesForStorageSlot } from '@ethereumjs/statemanager' import { + Account, Address, BIGINT_0, BIGINT_1, - BIGINT_128, BIGINT_160, BIGINT_2, BIGINT_224, @@ -42,7 +43,6 @@ import { fromTwos, getDataSlice, jumpIsValid, - jumpSubIsValid, mod, toTwos, trap, @@ -52,7 +52,7 @@ import { import type { RunState } from '../interpreter.js' import type { Common } from '@ethereumjs/common' -const EIP3074MAGIC = hexToBytes('0x03') +const EIP3074MAGIC = hexToBytes('0x04') export interface SyncOpHandler { (runState: RunState, common: Common): void @@ -518,10 +518,21 @@ export const handlers: Map = new Map([ 0x3b, async function (runState) { const addressBigInt = runState.stack.pop() - const size = BigInt( - (await runState.stateManager.getContractCode(new Address(addresstoBytes(addressBigInt)))) - .length - ) + + let size + if (typeof runState.stateManager.getContractCodeSize === 'function') { + size = BigInt( + await runState.stateManager.getContractCodeSize( + new Address(addresstoBytes(addressBigInt)) + ) + ) + } else { + size = BigInt( + (await runState.stateManager.getContractCode(new Address(addresstoBytes(addressBigInt)))) + .length + ) + } + runState.stack.push(size) }, ], @@ -603,11 +614,29 @@ export const handlers: Map = new Map([ return } + const diff = runState.interpreter.getBlockNumber() - number + const historyServeWindow = common.param('vm', 'historyServeWindow') + // block lookups must be within the `historyServeWindow` + if (diff > historyServeWindow || diff <= BIGINT_0) { + runState.stack.push(BIGINT_0) + return + } + const historyAddress = Address.fromString( bigIntToHex(common.param('vm', 'historyStorageAddress')) ) - const key = setLengthLeft(bigIntToBytes(number), 32) - + const key = setLengthLeft(bigIntToBytes(number % historyServeWindow), 32) + + if (common.isActivatedEIP(6800) === true) { + const { treeIndex, subIndex } = getTreeIndexesForStorageSlot(number) + // create witnesses and charge gas + const statelessGas = runState.env.accessWitness!.touchAddressOnReadAndComputeGas( + historyAddress, + treeIndex, + subIndex + ) + runState.interpreter.useGas(statelessGas, `BLOCKHASH`) + } const storage = await runState.stateManager.getContractStorage(historyAddress, key) runState.stack.push(bytesToBigInt(storage)) @@ -832,81 +861,46 @@ export const handlers: Map = new Map([ ], // 0x5b: JUMPDEST [0x5b, function () {}], - // 0x5c: BEGINSUB (EIP 2315) / TLOAD (EIP 1153) + // 0x5c: TLOAD (EIP 1153) [ 0x5c, - function (runState, common) { - if (common.isActivatedEIP(2315)) { - // BEGINSUB - trap(ERROR.INVALID_BEGINSUB + ' at ' + describeLocation(runState)) - } else if (common.isActivatedEIP(1153)) { - // TLOAD - const key = runState.stack.pop() - const keyBuf = setLengthLeft(bigIntToBytes(key), 32) - const value = runState.interpreter.transientStorageLoad(keyBuf) - const valueBN = value.length ? bytesToBigInt(value) : BIGINT_0 - runState.stack.push(valueBN) - } + function (runState) { + const key = runState.stack.pop() + const keyBuf = setLengthLeft(bigIntToBytes(key), 32) + const value = runState.interpreter.transientStorageLoad(keyBuf) + const valueBN = value.length ? bytesToBigInt(value) : BIGINT_0 + runState.stack.push(valueBN) }, ], - // 0x5d: RETURNSUB (EIP 2315) / TSTORE (EIP 1153) + // 0x5d: TSTORE (EIP 1153) [ 0x5d, - function (runState, common) { - if (common.isActivatedEIP(2315)) { - // RETURNSUB - if (runState.returnStack.length < 1) { - trap(ERROR.INVALID_RETURNSUB) - } - - const dest = runState.returnStack.pop() - runState.programCounter = Number(dest) - } else if (common.isActivatedEIP(1153)) { - // TSTORE - if (runState.interpreter.isStatic()) { - trap(ERROR.STATIC_STATE_CHANGE) - } - const [key, val] = runState.stack.popN(2) - - const keyBuf = setLengthLeft(bigIntToBytes(key), 32) - // NOTE: this should be the shortest representation - let value - if (val === BIGINT_0) { - value = Uint8Array.from([]) - } else { - value = bigIntToBytes(val) - } + function (runState) { + // TSTORE + if (runState.interpreter.isStatic()) { + trap(ERROR.STATIC_STATE_CHANGE) + } + const [key, val] = runState.stack.popN(2) - runState.interpreter.transientStorageStore(keyBuf, value) + const keyBuf = setLengthLeft(bigIntToBytes(key), 32) + // NOTE: this should be the shortest representation + let value + if (val === BIGINT_0) { + value = Uint8Array.from([]) + } else { + value = bigIntToBytes(val) } + + runState.interpreter.transientStorageStore(keyBuf, value) }, ], - // 0x5e: JUMPSUB (2315) / MCOPY (5656) + // 0x5e: MCOPY (5656) [ 0x5e, - function (runState, common) { - if (common.isActivatedEIP(2315)) { - // JUMPSUB - const dest = runState.stack.pop() - - if (dest > runState.interpreter.getCodeSize()) { - trap(ERROR.INVALID_JUMPSUB + ' at ' + describeLocation(runState)) - } - - const destNum = Number(dest) - - if (!jumpSubIsValid(runState, destNum)) { - trap(ERROR.INVALID_JUMPSUB + ' at ' + describeLocation(runState)) - } - - runState.returnStack.push(BigInt(runState.programCounter)) - runState.programCounter = destNum + 1 - } else if (common.isActivatedEIP(5656)) { - // MCOPY - const [dst, src, length] = runState.stack.popN(3) - const data = runState.memory.read(Number(src), Number(length), true) - runState.memory.write(Number(dst), Number(length), data) - } + function (runState) { + const [dst, src, length] = runState.stack.popN(3) + const data = runState.memory.read(Number(src), Number(length), true) + runState.memory.write(Number(dst), Number(length), data) }, ], // 0x5f: PUSH0 @@ -1137,27 +1131,40 @@ export const handlers: Map = new Map([ // eslint-disable-next-line prefer-const let [authority, memOffset, memLength] = runState.stack.popN(3) - if (memLength > BIGINT_128) { - memLength = BIGINT_128 + if (memLength > BigInt(97)) { + memLength = BigInt(97) } let mem = runState.memory.read(Number(memOffset), Number(memLength)) - if (mem.length < 128) { - mem = setLengthRight(mem, 128) + if (mem.length < 97) { + mem = setLengthRight(mem, 97) } - const yParity = BigInt(mem[31]) - const r = mem.subarray(32, 64) - const s = mem.subarray(64, 96) - const commit = mem.subarray(96, 128) + const yParity = BigInt(mem[0]) + const r = mem.subarray(1, 33) + const s = mem.subarray(33, 65) + const commit = mem.subarray(65, 97) if (bytesToBigInt(s) > SECP256K1_ORDER_DIV_2) { - trap(ERROR.AUTH_INVALID_S) + runState.stack.push(BIGINT_0) + runState.auth = undefined + return } + if (yParity > BIGINT_1) { + runState.stack.push(BIGINT_0) + runState.auth = undefined + return + } + + const expectedAddress = new Address(setLengthLeft(bigIntToBytes(authority), 20).slice(-20)) + const accountNonce = ( + (await runState.stateManager.getAccount(expectedAddress)) ?? new Account() + ).nonce - const paddedInvokerAddress = setLengthLeft(runState.interpreter._env.address.bytes, 32) + const invokedAddress = setLengthLeft(runState.interpreter._env.address.bytes, 32) const chainId = setLengthLeft(bigIntToBytes(runState.interpreter.getChainId()), 32) - const message = concatBytes(EIP3074MAGIC, chainId, paddedInvokerAddress, commit) + const nonce = setLengthLeft(bigIntToBytes(accountNonce), 32) + const message = concatBytes(EIP3074MAGIC, chainId, nonce, invokedAddress, commit) const keccakFunction = runState.interpreter._evm.common.customCrypto.keccak256 ?? keccak256 const msgHash = keccakFunction(message) @@ -1177,8 +1184,6 @@ export const handlers: Map = new Map([ const address = new Address(addressBuffer) runState.auth = address - const expectedAddress = new Address(setLengthLeft(bigIntToBytes(authority), 20)) - if (!expectedAddress.equals(address)) { // expected address does not equal the recovered address, clear auth variable runState.stack.push(BIGINT_0) @@ -1194,16 +1199,8 @@ export const handlers: Map = new Map([ [ 0xf7, async function (runState) { - const [ - _currentGasLimit, - addr, - value, - _valueExt, - argsOffset, - argsLength, - retOffset, - retLength, - ] = runState.stack.popN(8) + const [_currentGasLimit, addr, value, argsOffset, argsLength, retOffset, retLength] = + runState.stack.popN(7) const toAddress = new Address(addresstoBytes(addr)) diff --git a/packages/evm/src/opcodes/gas.ts b/packages/evm/src/opcodes/gas.ts index 05a0af2a8..902849ac0 100644 --- a/packages/evm/src/opcodes/gas.ts +++ b/packages/evm/src/opcodes/gas.ts @@ -1,6 +1,13 @@ import { Hardfork } from '@ethereumjs/common' -import { CODE_SIZE_LEAF_KEY, getTreeIndexesForStorageSlot } from '@ethereumjs/statemanager' import { + BALANCE_LEAF_KEY, + CODE_KECCAK_LEAF_KEY, + CODE_SIZE_LEAF_KEY, + VERSION_LEAF_KEY, + getTreeIndexesForStorageSlot, +} from '@ethereumjs/statemanager' +import { + Account, Address, BIGINT_0, BIGINT_1, @@ -82,10 +89,24 @@ export const dynamicGasHandlers: Map { + const address = addresstoBytes(runState.stack.peek()[0]) + let charge2929Gas = true + if (common.isActivatedEIP(6800) === true) { + const balanceAddress = new Address(address) + const coldAccessGas = runState.env.accessWitness!.touchAddressOnReadAndComputeGas( + balanceAddress, + 0, + BALANCE_LEAF_KEY + ) + + gas += coldAccessGas + charge2929Gas = coldAccessGas === BIGINT_0 + } + if (common.isActivatedEIP(2929) === true) { - const address = runState.stack.peek()[0] - gas += accessAddressEIP2929(runState, addresstoBytes(address), common) + gas += accessAddressEIP2929(runState, address, common, charge2929Gas) } + return gas }, ], @@ -112,7 +133,7 @@ export const dynamicGasHandlers: Map { - if (common.isActivatedEIP(2929) === true) { - const address = runState.stack.peek()[0] - gas += accessAddressEIP2929(runState, addresstoBytes(address), common) - } - + let charge2929Gas = true if (common.isActivatedEIP(6800) === true) { const address = new Address(addresstoBytes(runState.stack.peek()[0])) - gas += runState.env.accessWitness!.touchAddressOnReadAndComputeGas( + + let coldAccessGas = BIGINT_0 + coldAccessGas += runState.env.accessWitness!.touchAddressOnReadAndComputeGas( + address, + 0, + VERSION_LEAF_KEY + ) + coldAccessGas += runState.env.accessWitness!.touchAddressOnReadAndComputeGas( address, 0, CODE_SIZE_LEAF_KEY ) + + gas += coldAccessGas + // if cold access gas has been charged 2929 gas shouldn't be charged + charge2929Gas = coldAccessGas === BIGINT_0 + } + + if (common.isActivatedEIP(2929) === true) { + const address = runState.stack.peek()[0] + gas += accessAddressEIP2929(runState, addresstoBytes(address), common, charge2929Gas) } return gas @@ -159,8 +192,29 @@ export const dynamicGasHandlers: Map { + const address = addresstoBytes(runState.stack.peek()[0]) + let charge2929Gas = true + + if (common.isActivatedEIP(6800) === true) { + const codeAddress = new Address(address) + + let coldAccessGas = BIGINT_0 + coldAccessGas += runState.env.accessWitness!.touchAddressOnReadAndComputeGas( + codeAddress, + 0, + CODE_KECCAK_LEAF_KEY + ) + + gas += coldAccessGas + charge2929Gas = coldAccessGas === BIGINT_0 + } + if (common.isActivatedEIP(2929) === true) { - const address = runState.stack.peek()[0] - gas += accessAddressEIP2929(runState, addresstoBytes(address), common) + gas += accessAddressEIP2929(runState, address, common, charge2929Gas) } + return gas }, ], @@ -247,19 +318,24 @@ export const dynamicGasHandlers: Map { - const [_address, memOffset, memLength] = runState.stack.peek(3) + const [address, memOffset, memLength] = runState.stack.peek(3) + // Note: 2929 is always active if AUTH can be reached, + // since it needs London as minimum hardfork + gas += accessAddressEIP2929(runState, bigIntToBytes(address), common) gas += subMemUsage(runState, memOffset, memLength, common) return gas }, @@ -599,20 +698,8 @@ export const dynamicGasHandlers: Map BIGINT_0) { + const account = (await runState.stateManager.getAccount(runState.auth!)) ?? new Account() + if (account.balance < value) { + trap(ERROR.OUT_OF_GAS) + } + account.balance -= value + + const toAddr = new Address(addresstoBytes(addr)) + const target = (await runState.stateManager.getAccount(toAddr)) ?? new Account() + target.balance += value + + await runState.stateManager.putAccount(toAddr, target) + } + return gas }, ], @@ -658,14 +760,18 @@ export const dynamicGasHandlers: Map BIGINT_0) { // This technically checks if account is empty or non-existent const account = await runState.stateManager.getAccount(selfdestructToAddress) @@ -723,9 +830,61 @@ export const dynamicGasHandlers: Map BIGINT_0) { + gas += runState.env.accessWitness!.touchAddressOnWriteAndComputeGas( + contractAddress, + 0, + BALANCE_LEAF_KEY + ) + } + + let selfDestructToColdAccessGas = + runState.env.accessWitness!.touchAddressOnReadAndComputeGas( + selfdestructToAddress, + 0, + BALANCE_LEAF_KEY + ) + if (balance > BIGINT_0) { + selfDestructToColdAccessGas += + runState.env.accessWitness!.touchAddressOnWriteAndComputeGas( + selfdestructToAddress, + 0, + BALANCE_LEAF_KEY + ) + } + + gas += selfDestructToColdAccessGas + selfDestructToCharge2929Gas = selfDestructToColdAccessGas === BIGINT_0 + } + if (common.isActivatedEIP(2929) === true) { - gas += accessAddressEIP2929(runState, selfdestructToAddress.bytes, common, true, true) + gas += accessAddressEIP2929( + runState, + selfdestructToAddress.bytes, + common, + selfDestructToCharge2929Gas, + true + ) } + return gas }, ], diff --git a/packages/evm/src/opcodes/util.ts b/packages/evm/src/opcodes/util.ts index 12c0e77fb..273d60ad9 100644 --- a/packages/evm/src/opcodes/util.ts +++ b/packages/evm/src/opcodes/util.ts @@ -136,13 +136,6 @@ export function jumpIsValid(runState: RunState, dest: number): boolean { return runState.validJumps[dest] === 1 } -/** - * Checks if a jumpsub is valid given a destination (defined as a 2 in the validJumps array) - */ -export function jumpSubIsValid(runState: RunState, dest: number): boolean { - return runState.validJumps[dest] === 2 -} - /** * Returns an overflow-safe slice of an array. It right-pads * the data with zeros to `length`. diff --git a/packages/evm/src/precompiles/06-ecadd.ts b/packages/evm/src/precompiles/06-ecadd.ts index 90f79198c..08a8a49fa 100644 --- a/packages/evm/src/precompiles/06-ecadd.ts +++ b/packages/evm/src/precompiles/06-ecadd.ts @@ -24,7 +24,7 @@ export function precompile06(opts: PrecompileInput): ExecResult { return OOGResult(opts.gasLimit) } - const returnData = hexToBytes((opts._EVM as EVM)['bn128'].ec_add(inputData)) + const returnData = hexToBytes((opts._EVM as EVM)['_bn128'].ec_add(inputData)) // check ecadd success or failure by comparing the output length if (returnData.length !== 64) { diff --git a/packages/evm/src/precompiles/07-ecmul.ts b/packages/evm/src/precompiles/07-ecmul.ts index bfcead0e3..12a2da11f 100644 --- a/packages/evm/src/precompiles/07-ecmul.ts +++ b/packages/evm/src/precompiles/07-ecmul.ts @@ -24,7 +24,7 @@ export function precompile07(opts: PrecompileInput): ExecResult { return OOGResult(opts.gasLimit) } - const returnData = hexToBytes((opts._EVM as EVM)['bn128'].ec_mul(inputData)) + const returnData = hexToBytes((opts._EVM as EVM)['_bn128'].ec_mul(inputData)) // check ecmul success or failure by comparing the output length if (returnData.length !== 64) { diff --git a/packages/evm/src/precompiles/08-ecpairing.ts b/packages/evm/src/precompiles/08-ecpairing.ts index ce4947003..cf398be20 100644 --- a/packages/evm/src/precompiles/08-ecpairing.ts +++ b/packages/evm/src/precompiles/08-ecpairing.ts @@ -29,7 +29,7 @@ export function precompile08(opts: PrecompileInput): ExecResult { } const returnData = hexToBytes( - (opts._EVM as EVM)['bn128'].ec_pairing(bytesToUnprefixedHex(inputData)) + (opts._EVM as EVM)['_bn128'].ec_pairing(bytesToUnprefixedHex(inputData)) ) // check ecpairing success or failure by comparing the output length diff --git a/packages/evm/src/precompiles/0b-bls12-g1add.ts b/packages/evm/src/precompiles/0b-bls12-g1add.ts new file mode 100644 index 000000000..d3e63d161 --- /dev/null +++ b/packages/evm/src/precompiles/0b-bls12-g1add.ts @@ -0,0 +1,84 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { BLS12_381_FromG1Point, BLS12_381_ToG1Point } from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile0b(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + // note: the gas used is constant; even if the input is incorrect. + const gasUsed = opts.common.paramByEIP('gasPrices', 'Bls12381G1AddGas', 2537) ?? BigInt(0) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12G1ADD (0x0b) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1ADD (0x0b) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length !== 256) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1ADD (0x0b) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // check if some parts of input are zero bytes. + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + [128, 144], + [192, 208], + ] + + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray(zeroByteCheck[index][0], zeroByteCheck[index][1]) + if (!(equalsBytes(slicedBuffer, zeroBytes16) === true)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1ADD (0x0b) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + + // convert input to mcl G1 points, add them, and convert the output to a Uint8Array. + let mclPoint1 + let mclPoint2 + try { + mclPoint1 = BLS12_381_ToG1Point(opts.data.subarray(0, 128), mcl) + mclPoint2 = BLS12_381_ToG1Point(opts.data.subarray(128, 256), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1ADD (0x0b) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + + const result = mcl.add(mclPoint1, mclPoint2) + + const returnValue = BLS12_381_FromG1Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12G1ADD (0x0b) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/0c-bls12-g1mul.ts b/packages/evm/src/precompiles/0c-bls12-g1mul.ts new file mode 100644 index 000000000..dc3d33485 --- /dev/null +++ b/packages/evm/src/precompiles/0c-bls12-g1mul.ts @@ -0,0 +1,87 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { + BLS12_381_FromG1Point, + BLS12_381_ToFrPoint, + BLS12_381_ToG1Point, +} from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile0c(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + // note: the gas used is constant; even if the input is incorrect. + const gasUsed = opts.common.paramByEIP('gasPrices', 'Bls12381G1MulGas', 2537) ?? BigInt(0) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12G1MUL (0x0c) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MUL (0x0c) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length !== 160) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MUL (0x0c) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // check if some parts of input are zero bytes. + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + ] + + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray(zeroByteCheck[index][0], zeroByteCheck[index][1]) + if (!equalsBytes(slicedBuffer, zeroBytes16)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MUL (0x0c) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + + // convert input to mcl G1 points, add them, and convert the output to a Uint8Array. + + let mclPoint + try { + mclPoint = BLS12_381_ToG1Point(opts.data.subarray(0, 128), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MUL (0x0c) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + + const frPoint = BLS12_381_ToFrPoint(opts.data.subarray(128, 160), mcl) + + const result = mcl.mul(mclPoint, frPoint) + + const returnValue = BLS12_381_FromG1Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MUL (0x0c) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/0d-bls12-g1msm.ts b/packages/evm/src/precompiles/0d-bls12-g1msm.ts new file mode 100644 index 000000000..1c25d8972 --- /dev/null +++ b/packages/evm/src/precompiles/0d-bls12-g1msm.ts @@ -0,0 +1,122 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { + BLS12_381_FromG1Point, + BLS12_381_ToFrPoint, + BLS12_381_ToG1Point, + gasDiscountPairs, +} from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile0d(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + if (inputData.length === 0) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MSM (0x0d) failed: Empty input`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INPUT_EMPTY), opts.gasLimit) // follow Geths implementation + } + + const numPairs = Math.floor(inputData.length / 160) + + const gasUsedPerPair = opts.common.paramByEIP('gasPrices', 'Bls12381G1MulGas', 2537) ?? BigInt(0) + const gasDiscountMax = gasDiscountPairs[gasDiscountPairs.length - 1][1] + let gasDiscountMultiplier + + if (numPairs <= gasDiscountPairs.length) { + if (numPairs === 0) { + gasDiscountMultiplier = 0 // this implicitly sets gasUsed to 0 as per the EIP. + } else { + gasDiscountMultiplier = gasDiscountPairs[numPairs - 1][1] + } + } else { + gasDiscountMultiplier = gasDiscountMax + } + + // (numPairs * multiplication_cost * discount) / multiplier + const gasUsed = (BigInt(numPairs) * gasUsedPerPair * BigInt(gasDiscountMultiplier)) / BigInt(1000) + + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12G1MSM (0x0d) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MSM (0x0d) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length % 160 !== 0) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MSM (0x0d) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // prepare pairing list and check for mandatory zero bytes + + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + ] + + const G1Array = [] + const FrArray = [] + + for (let k = 0; k < inputData.length / 160; k++) { + // zero bytes check + const pairStart = 160 * k + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray( + zeroByteCheck[index][0] + pairStart, + zeroByteCheck[index][1] + pairStart + ) + if (!(equalsBytes(slicedBuffer, zeroBytes16) === true)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MSM (0x0d) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + let G1 + try { + G1 = BLS12_381_ToG1Point(opts.data.subarray(pairStart, pairStart + 128), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MSM (0x0d) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + const Fr = BLS12_381_ToFrPoint(opts.data.subarray(pairStart + 128, pairStart + 160), mcl) + + G1Array.push(G1) + FrArray.push(Fr) + } + + const result = mcl.mulVec(G1Array, FrArray) + + const returnValue = BLS12_381_FromG1Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12G1MSM (0x0d) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/0e-bls12-g2add.ts b/packages/evm/src/precompiles/0e-bls12-g2add.ts new file mode 100644 index 000000000..1694a4739 --- /dev/null +++ b/packages/evm/src/precompiles/0e-bls12-g2add.ts @@ -0,0 +1,88 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { BLS12_381_FromG2Point, BLS12_381_ToG2Point } from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile0e(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + // note: the gas used is constant; even if the input is incorrect. + const gasUsed = opts.common.paramByEIP('gasPrices', 'Bls12381G2AddGas', 2537) ?? BigInt(0) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12G2ADD (0x0e) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2ADD (0x0e) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length !== 512) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2ADD (0x0e) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // check if some parts of input are zero bytes. + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + [128, 144], + [192, 208], + [256, 272], + [320, 336], + [384, 400], + [448, 464], + ] + + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray(zeroByteCheck[index][0], zeroByteCheck[index][1]) + if (!(equalsBytes(slicedBuffer, zeroBytes16) === true)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2ADD (0x0e) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + + // TODO: verify that point is on G2 + + // convert input to mcl G2 points, add them, and convert the output to a Uint8Array. + let mclPoint1 + let mclPoint2 + + try { + mclPoint1 = BLS12_381_ToG2Point(opts.data.subarray(0, 256), mcl) + mclPoint2 = BLS12_381_ToG2Point(opts.data.subarray(256, 512), mcl) + } catch (e: any) { + return EvmErrorResult(e, opts.gasLimit) + } + + const result = mcl.add(mclPoint1, mclPoint2) + + const returnValue = BLS12_381_FromG2Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12G2ADD (0x0e) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/0f-bls12-g2mul.ts b/packages/evm/src/precompiles/0f-bls12-g2mul.ts new file mode 100644 index 000000000..66c060073 --- /dev/null +++ b/packages/evm/src/precompiles/0f-bls12-g2mul.ts @@ -0,0 +1,90 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { + BLS12_381_FromG2Point, + BLS12_381_ToFrPoint, + BLS12_381_ToG2Point, +} from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile0f(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + // note: the gas used is constant; even if the input is incorrect. + const gasUsed = opts.common.paramByEIP('gasPrices', 'Bls12381G2MulGas', 2537) ?? BigInt(0) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12G2MUL (0x0f) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MUL (0x0f) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length !== 288) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MUL (0x0f) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // check if some parts of input are zero bytes. + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + [128, 144], + [192, 208], + ] + + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray(zeroByteCheck[index][0], zeroByteCheck[index][1]) + if (!equalsBytes(slicedBuffer, zeroBytes16)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MUL (0x0f) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + + // TODO: verify that point is on G2 + + // convert input to mcl G2 point/Fr point, add them, and convert the output to a Uint8Array. + let mclPoint + try { + mclPoint = BLS12_381_ToG2Point(opts.data.subarray(0, 256), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MUL (0x0f) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + + const frPoint = BLS12_381_ToFrPoint(opts.data.subarray(256, 288), mcl) + + const result = mcl.mul(mclPoint, frPoint) + + const returnValue = BLS12_381_FromG2Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MUL (0x0f) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/10-bls12-g2msm.ts b/packages/evm/src/precompiles/10-bls12-g2msm.ts new file mode 100644 index 000000000..80c57bdce --- /dev/null +++ b/packages/evm/src/precompiles/10-bls12-g2msm.ts @@ -0,0 +1,123 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { + BLS12_381_FromG2Point, + BLS12_381_ToFrPoint, + BLS12_381_ToG2Point, + gasDiscountPairs, +} from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile10(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + if (inputData.length === 0) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MSM (0x10) failed: Empty input`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INPUT_EMPTY), opts.gasLimit) // follow Geths implementation + } + + const numPairs = Math.floor(inputData.length / 288) + + const gasUsedPerPair = opts.common.paramByEIP('gasPrices', 'Bls12381G2MulGas', 2537) ?? BigInt(0) + const gasDiscountArray = gasDiscountPairs + const gasDiscountMax = gasDiscountArray[gasDiscountArray.length - 1][1] + let gasDiscountMultiplier + + if (numPairs <= gasDiscountArray.length) { + if (numPairs === 0) { + gasDiscountMultiplier = 0 // this implicitly sets gasUsed to 0 as per the EIP. + } else { + gasDiscountMultiplier = gasDiscountArray[numPairs - 1][1] + } + } else { + gasDiscountMultiplier = gasDiscountMax + } + + const gasUsed = (gasUsedPerPair * BigInt(numPairs) * BigInt(gasDiscountMultiplier)) / BigInt(1000) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12G2MSM (0x10) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MSM (0x10) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length % 288 !== 0) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MSM (0x10) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // prepare pairing list and check for mandatory zero bytes + + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + [128, 144], + [192, 208], + ] + + const G2Array = [] + const FrArray = [] + + for (let k = 0; k < inputData.length / 288; k++) { + // zero bytes check + const pairStart = 288 * k + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray( + zeroByteCheck[index][0] + pairStart, + zeroByteCheck[index][1] + pairStart + ) + if (!(equalsBytes(slicedBuffer, zeroBytes16) === true)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MSM (0x10) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + let G2 + try { + G2 = BLS12_381_ToG2Point(opts.data.subarray(pairStart, pairStart + 256), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MSM (0x10) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + const Fr = BLS12_381_ToFrPoint(opts.data.subarray(pairStart + 256, pairStart + 288), mcl) + + G2Array.push(G2) + FrArray.push(Fr) + } + + const result = mcl.mulVec(G2Array, FrArray) + + const returnValue = BLS12_381_FromG2Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12G2MSM (0x10) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/11-bls12-pairing.ts b/packages/evm/src/precompiles/11-bls12-pairing.ts new file mode 100644 index 000000000..87be3529c --- /dev/null +++ b/packages/evm/src/precompiles/11-bls12-pairing.ts @@ -0,0 +1,142 @@ +import { bytesToHex, concatBytes, equalsBytes, hexToBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { BLS12_381_ToG1Point, BLS12_381_ToG2Point } from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +const zeroBuffer = new Uint8Array(32) +const oneBuffer = concatBytes(new Uint8Array(31), hexToBytes('0x01')) + +export async function precompile11(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + const baseGas = opts.common.paramByEIP('gasPrices', 'Bls12381PairingBaseGas', 2537) ?? BigInt(0) + + if (inputData.length === 0) { + if (opts._debug !== undefined) { + opts._debug(`BLS12PAIRING (0x11) failed: Empty input`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INPUT_EMPTY), opts.gasLimit) + } + + const gasUsedPerPair = + opts.common.paramByEIP('gasPrices', 'Bls12381PairingPerPairGas', 2537) ?? BigInt(0) + + const gasUsed = baseGas + gasUsedPerPair * BigInt(Math.floor(inputData.length / 384)) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12PAIRING (0x11) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (inputData.length % 384 !== 0) { + if (opts._debug !== undefined) { + opts._debug(`BLS12PAIRING (0x11) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12PAIRING (0x11) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + // prepare pairing list and check for mandatory zero bytes + + const pairs = [] + + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + [128, 144], + [192, 208], + [256, 272], + [320, 336], + ] + + for (let k = 0; k < inputData.length / 384; k++) { + // zero bytes check + const pairStart = 384 * k + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray( + zeroByteCheck[index][0] + pairStart, + zeroByteCheck[index][1] + pairStart + ) + if (!equalsBytes(slicedBuffer, zeroBytes16)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12PAIRING (0x11) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + let G1 + try { + G1 = BLS12_381_ToG1Point(opts.data.subarray(pairStart, pairStart + 128), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12PAIRING (0x11) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + + const g2start = pairStart + 128 + let G2 + try { + G2 = BLS12_381_ToG2Point(opts.data.subarray(g2start, g2start + 256), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12PAIRING (0x11) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + + pairs.push([G1, G2]) + } + + // run the pairing check + // reference (Nethermind): https://github.com/NethermindEth/nethermind/blob/374b036414722b9c8ad27e93d64840b8f63931b9/src/Nethermind/Nethermind.Evm/Precompiles/Bls/Mcl/PairingPrecompile.cs#L93 + + let GT + + for (let index = 0; index < pairs.length; index++) { + const pair = pairs[index] + const G1 = pair[0] + const G2 = pair[1] + + if (index === 0) { + GT = mcl.millerLoop(G1, G2) + } else { + GT = mcl.mul(GT, mcl.millerLoop(G1, G2)) + } + } + + GT = mcl.finalExp(GT) + + let returnValue + + if (GT.isOne() === true) { + returnValue = oneBuffer + } else { + returnValue = zeroBuffer + } + + if (opts._debug !== undefined) { + opts._debug(`BLS12PAIRING (0x11) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/12-bls12-map-fp-to-g1.ts b/packages/evm/src/precompiles/12-bls12-map-fp-to-g1.ts new file mode 100644 index 000000000..953281041 --- /dev/null +++ b/packages/evm/src/precompiles/12-bls12-map-fp-to-g1.ts @@ -0,0 +1,74 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { BLS12_381_FromG1Point, BLS12_381_ToFpPoint } from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile12(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + // note: the gas used is constant; even if the input is incorrect. + const gasUsed = opts.common.paramByEIP('gasPrices', 'Bls12381MapG1Gas', 2537) ?? BigInt(0) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12MAPFPTOG1 (0x12) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFPTOG1 (0x12) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length !== 64) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFPTOG1 (0x12) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // check if some parts of input are zero bytes. + const zeroBytes16 = new Uint8Array(16) + if (!equalsBytes(opts.data.subarray(0, 16), zeroBytes16)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFPTOG1 (0x12) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + + // convert input to mcl Fp1 point + + let Fp1Point + try { + Fp1Point = BLS12_381_ToFpPoint(opts.data.subarray(0, 64), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFPTOG1 (0x12) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + + // map it to G1 + const result = Fp1Point.mapToG1() + + const returnValue = BLS12_381_FromG1Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFPTOG1 (0x12) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/13-bls12-map-fp2-to-g2.ts b/packages/evm/src/precompiles/13-bls12-map-fp2-to-g2.ts new file mode 100644 index 000000000..19c4e8a82 --- /dev/null +++ b/packages/evm/src/precompiles/13-bls12-map-fp2-to-g2.ts @@ -0,0 +1,81 @@ +import { bytesToHex, equalsBytes, short } from '@ethereumjs/util' + +import { EvmErrorResult, OOGResult } from '../evm.js' +import { ERROR, EvmError } from '../exceptions.js' + +import { BLS12_381_FromG2Point, BLS12_381_ToFp2Point } from './util/bls12_381.js' + +import type { ExecResult } from '../types.js' +import type { PrecompileInput } from './types.js' + +export async function precompile13(opts: PrecompileInput): Promise { + const mcl = (opts._EVM)._mcl! + + const inputData = opts.data + + // note: the gas used is constant; even if the input is incorrect. + const gasUsed = opts.common.paramByEIP('gasPrices', 'Bls12381MapG2Gas', 2537) ?? BigInt(0) + if (opts._debug !== undefined) { + opts._debug( + `Run BLS12MAPFP2TOG2 (0x13) precompile data=${short(opts.data)} length=${ + opts.data.length + } gasLimit=${opts.gasLimit} gasUsed=${gasUsed}` + ) + } + + if (opts.gasLimit < gasUsed) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFP2TOG2 (0x13) failed: OOG`) + } + return OOGResult(opts.gasLimit) + } + + if (inputData.length !== 128) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFP2TOG2 (0x13) failed: Invalid input length length=${inputData.length}`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_INVALID_INPUT_LENGTH), opts.gasLimit) + } + + // check if some parts of input are zero bytes. + const zeroBytes16 = new Uint8Array(16) + const zeroByteCheck = [ + [0, 16], + [64, 80], + ] + + for (const index in zeroByteCheck) { + const slicedBuffer = opts.data.subarray(zeroByteCheck[index][0], zeroByteCheck[index][1]) + if (!(equalsBytes(slicedBuffer, zeroBytes16) === true)) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFP2TOG2 (0x13) failed: Point not on curve`) + } + return EvmErrorResult(new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE), opts.gasLimit) + } + } + + // convert input to mcl Fp2 point + + let Fp2Point + try { + Fp2Point = BLS12_381_ToFp2Point(opts.data.subarray(0, 64), opts.data.subarray(64, 128), mcl) + } catch (e: any) { + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFP2TOG2 (0x13) failed: ${e.message}`) + } + return EvmErrorResult(e, opts.gasLimit) + } + // map it to G2 + const result = Fp2Point.mapToG2() + + const returnValue = BLS12_381_FromG2Point(result) + + if (opts._debug !== undefined) { + opts._debug(`BLS12MAPFP2TOG2 (0x13) return value=${bytesToHex(returnValue)}`) + } + + return { + executionGasUsed: gasUsed, + returnValue, + } +} diff --git a/packages/evm/src/precompiles/index.ts b/packages/evm/src/precompiles/index.ts index e7477ba16..424a63ab0 100644 --- a/packages/evm/src/precompiles/index.ts +++ b/packages/evm/src/precompiles/index.ts @@ -11,6 +11,15 @@ import { precompile07 } from './07-ecmul.js' import { precompile08 } from './08-ecpairing.js' import { precompile09 } from './09-blake2f.js' import { precompile0a } from './0a-kzg-point-evaluation.js' +import { precompile0b } from './0b-bls12-g1add.js' +import { precompile0c } from './0c-bls12-g1mul.js' +import { precompile0d } from './0d-bls12-g1msm.js' +import { precompile0e } from './0e-bls12-g2add.js' +import { precompile0f } from './0f-bls12-g2mul.js' +import { precompile10 } from './10-bls12-g2msm.js' +import { precompile11 } from './11-bls12-pairing.js' +import { precompile12 } from './12-bls12-map-fp-to-g1.js' +import { precompile13 } from './13-bls12-map-fp2-to-g2.js' import type { PrecompileFunc, PrecompileInput } from './types.js' import type { Common } from '@ethereumjs/common' @@ -138,6 +147,87 @@ const precompileEntries: PrecompileEntry[] = [ precompile: precompile0a, name: 'KZG (0x0a)', }, + { + address: '000000000000000000000000000000000000000b', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0b, + name: 'BLS12_G1ADD', + }, + { + address: '000000000000000000000000000000000000000c', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0c, + name: 'BLS12_G1MUL', + }, + { + address: '000000000000000000000000000000000000000d', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0d, + name: 'BLS12_G1MSM', + }, + { + address: '000000000000000000000000000000000000000e', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0e, + name: 'BLS12_G2ADD', + }, + { + address: '000000000000000000000000000000000000000f', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile0f, + name: 'BLS12_G2MUL', + }, + { + address: '0000000000000000000000000000000000000010', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile10, + name: 'BLS12_G2MSM', + }, + { + address: '0000000000000000000000000000000000000011', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile11, + name: 'BLS12_PAIRING', + }, + { + address: '0000000000000000000000000000000000000012', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile12, + name: 'BLS12_MAP_FP_TO_G1', + }, + { + address: '0000000000000000000000000000000000000013', + check: { + type: PrecompileAvailabilityCheck.EIP, + param: 2537, + }, + precompile: precompile13, + name: 'BLS12_MAP_FP2_TO_G2', + }, ] const precompiles: Precompiles = { @@ -151,6 +241,15 @@ const precompiles: Precompiles = { '0000000000000000000000000000000000000008': precompile08, '0000000000000000000000000000000000000009': precompile09, '000000000000000000000000000000000000000a': precompile0a, + '000000000000000000000000000000000000000b': precompile0b, + '000000000000000000000000000000000000000c': precompile0c, + '000000000000000000000000000000000000000d': precompile0d, + '000000000000000000000000000000000000000e': precompile0e, + '000000000000000000000000000000000000000f': precompile0f, + '0000000000000000000000000000000000000010': precompile10, + '0000000000000000000000000000000000000011': precompile11, + '0000000000000000000000000000000000000012': precompile12, + '0000000000000000000000000000000000000013': precompile13, } type DeletePrecompile = { diff --git a/packages/evm/src/precompiles/util/bls12_381.ts b/packages/evm/src/precompiles/util/bls12_381.ts new file mode 100644 index 000000000..7f7e24e94 --- /dev/null +++ b/packages/evm/src/precompiles/util/bls12_381.ts @@ -0,0 +1,344 @@ +import { + bytesToBigInt, + bytesToUnprefixedHex, + concatBytes, + equalsBytes, + padToEven, + unprefixedHexToBytes, +} from '@ethereumjs/util' + +import { ERROR, EvmError } from '../../exceptions.js' + +// base field modulus as described in the EIP +const fieldModulus = BigInt( + '0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab' +) + +// gas discount pairs taken from EIP-2537 `Bls12381MultiExpGasDiscount` parameter +export const gasDiscountPairs = [ + [1, 1200], + [2, 888], + [3, 764], + [4, 641], + [5, 594], + [6, 547], + [7, 500], + [8, 453], + [9, 438], + [10, 423], + [11, 408], + [12, 394], + [13, 379], + [14, 364], + [15, 349], + [16, 334], + [17, 330], + [18, 326], + [19, 322], + [20, 318], + [21, 314], + [22, 310], + [23, 306], + [24, 302], + [25, 298], + [26, 294], + [27, 289], + [28, 285], + [29, 281], + [30, 277], + [31, 273], + [32, 269], + [33, 268], + [34, 266], + [35, 265], + [36, 263], + [37, 262], + [38, 260], + [39, 259], + [40, 257], + [41, 256], + [42, 254], + [43, 253], + [44, 251], + [45, 250], + [46, 248], + [47, 247], + [48, 245], + [49, 244], + [50, 242], + [51, 241], + [52, 239], + [53, 238], + [54, 236], + [55, 235], + [56, 233], + [57, 232], + [58, 231], + [59, 229], + [60, 228], + [61, 226], + [62, 225], + [63, 223], + [64, 222], + [65, 221], + [66, 220], + [67, 219], + [68, 219], + [69, 218], + [70, 217], + [71, 216], + [72, 216], + [73, 215], + [74, 214], + [75, 213], + [76, 213], + [77, 212], + [78, 211], + [79, 211], + [80, 210], + [81, 209], + [82, 208], + [83, 208], + [84, 207], + [85, 206], + [86, 205], + [87, 205], + [88, 204], + [89, 203], + [90, 202], + [91, 202], + [92, 201], + [93, 200], + [94, 199], + [95, 199], + [96, 198], + [97, 197], + [98, 196], + [99, 196], + [100, 195], + [101, 194], + [102, 193], + [103, 193], + [104, 192], + [105, 191], + [106, 191], + [107, 190], + [108, 189], + [109, 188], + [110, 188], + [111, 187], + [112, 186], + [113, 185], + [114, 185], + [115, 184], + [116, 183], + [117, 182], + [118, 182], + [119, 181], + [120, 180], + [121, 179], + [122, 179], + [123, 178], + [124, 177], + [125, 176], + [126, 176], + [127, 175], + [128, 174], +] +// convert an input Uint8Array to a mcl G1 point +// this does /NOT/ do any input checks. the input Uint8Array needs to be of length 128 +// it does raise an error if the point is not on the curve. +function BLS12_381_ToG1Point(input: Uint8Array, mcl: any): any { + const p_x = bytesToUnprefixedHex(input.subarray(16, 64)) + const p_y = bytesToUnprefixedHex(input.subarray(80, 128)) + + const ZeroString48Bytes = '0'.repeat(96) + if (p_x === p_y && p_x === ZeroString48Bytes) { + return new mcl.G1() + } + + const Fp_X = new mcl.Fp() + const Fp_Y = new mcl.Fp() + const One = new mcl.Fp() + + Fp_X.setStr(p_x, 16) + Fp_Y.setStr(p_y, 16) + One.setStr('1', 16) + + const G1 = new mcl.G1() + + G1.setX(Fp_X) + G1.setY(Fp_Y) + G1.setZ(One) + + if (G1.isValidOrder() === false) { + throw new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE) + } + + // Check if these coordinates are actually on the curve. + if (G1.isValid() === false) { + throw new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE) + } + + return G1 +} + +// input: a mcl G1 point +// output: a 128-byte Uint8Array +function BLS12_381_FromG1Point(input: any): Uint8Array { + // TODO: figure out if there is a better way to decode these values. + const decodeStr = input.getStr(16) //return a string of pattern "1 " + const decoded = decodeStr.match(/"?[0-9a-f]+"?/g) // match above pattern. + + if (decodeStr === '0') { + return new Uint8Array(128) + } + + // note: decoded[0] === 1 + const xval = padToEven(decoded[1]) + const yval = padToEven(decoded[2]) + + // convert to buffers. + + const xBuffer = concatBytes(new Uint8Array(64 - xval.length / 2), unprefixedHexToBytes(xval)) + const yBuffer = concatBytes(new Uint8Array(64 - yval.length / 2), unprefixedHexToBytes(yval)) + + return concatBytes(xBuffer, yBuffer) +} + +// convert an input Uint8Array to a mcl G2 point +// this does /NOT/ do any input checks. the input Uint8Array needs to be of length 256 +function BLS12_381_ToG2Point(input: Uint8Array, mcl: any): any { + const p_x_1 = input.subarray(0, 64) + const p_x_2 = input.subarray(64, 128) + const p_y_1 = input.subarray(128, 192) + const p_y_2 = input.subarray(192, 256) + + const ZeroBytes64 = new Uint8Array(64) + // check if we have to do with a zero point + if ( + equalsBytes(p_x_1, p_x_2) && + equalsBytes(p_x_1, p_y_1) && + equalsBytes(p_x_1, p_y_2) && + equalsBytes(p_x_1, ZeroBytes64) + ) { + return new mcl.G2() + } + + const Fp2X = BLS12_381_ToFp2Point(p_x_1, p_x_2, mcl) + const Fp2Y = BLS12_381_ToFp2Point(p_y_1, p_y_2, mcl) + + const FpOne = new mcl.Fp() + FpOne.setStr('1', 16) + + const FpZero = new mcl.Fp() + FpZero.setStr('0', 16) + + const Fp2One = new mcl.Fp2() + + Fp2One.set_a(FpOne) + Fp2One.set_b(FpZero) + + const mclPoint = new mcl.G2() + + mclPoint.setX(Fp2X) + mclPoint.setY(Fp2Y) + mclPoint.setZ(Fp2One) + + if (mclPoint.isValidOrder() === false) { + throw new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE) + } + + if (mclPoint.isValid() === false) { + throw new EvmError(ERROR.BLS_12_381_POINT_NOT_ON_CURVE) + } + + return mclPoint +} + +// input: a mcl G2 point +// output: a 256-byte Uint8Array +function BLS12_381_FromG2Point(input: any): Uint8Array { + // TODO: figure out if there is a better way to decode these values. + const decodeStr = input.getStr(16) //return a string of pattern "1 " + if (decodeStr === '0') { + return new Uint8Array(256) + } + const decoded = decodeStr.match(/"?[0-9a-f]+"?/g) // match above pattern. + + // note: decoded[0] === 1 + const x_1 = padToEven(decoded[1]) + const x_2 = padToEven(decoded[2]) + const y_1 = padToEven(decoded[3]) + const y_2 = padToEven(decoded[4]) + + // convert to buffers. + + const xBuffer1 = concatBytes(new Uint8Array(64 - x_1.length / 2), unprefixedHexToBytes(x_1)) + const xBuffer2 = concatBytes(new Uint8Array(64 - x_2.length / 2), unprefixedHexToBytes(x_2)) + const yBuffer1 = concatBytes(new Uint8Array(64 - y_1.length / 2), unprefixedHexToBytes(y_1)) + const yBuffer2 = concatBytes(new Uint8Array(64 - y_2.length / 2), unprefixedHexToBytes(y_2)) + + return concatBytes(xBuffer1, xBuffer2, yBuffer1, yBuffer2) +} + +// input: a 32-byte hex scalar Uint8Array +// output: a mcl Fr point + +function BLS12_381_ToFrPoint(input: Uint8Array, mcl: any): any { + const mclHex = mcl.fromHexStr(bytesToUnprefixedHex(input)) + const Fr = new mcl.Fr() + Fr.setBigEndianMod(mclHex) + return Fr +} + +// input: a 64-byte buffer +// output: a mcl Fp point + +function BLS12_381_ToFpPoint(fpCoordinate: Uint8Array, mcl: any): any { + // check if point is in field + if (bytesToBigInt(fpCoordinate) >= fieldModulus) { + throw new EvmError(ERROR.BLS_12_381_FP_NOT_IN_FIELD) + } + + const fp = new mcl.Fp() + + fp.setBigEndianMod(mcl.fromHexStr(bytesToUnprefixedHex(fpCoordinate))) + + return fp +} + +// input: two 64-byte buffers +// output: a mcl Fp2 point + +function BLS12_381_ToFp2Point(fpXCoordinate: Uint8Array, fpYCoordinate: Uint8Array, mcl: any): any { + // check if the coordinates are in the field + if (bytesToBigInt(fpXCoordinate) >= fieldModulus) { + throw new EvmError(ERROR.BLS_12_381_FP_NOT_IN_FIELD) + } + if (bytesToBigInt(fpYCoordinate) >= fieldModulus) { + throw new EvmError(ERROR.BLS_12_381_FP_NOT_IN_FIELD) + } + + const fp_x = new mcl.Fp() + const fp_y = new mcl.Fp() + + const fp2 = new mcl.Fp2() + fp_x.setStr(bytesToUnprefixedHex(fpXCoordinate.subarray(16)), 16) + fp_y.setStr(bytesToUnprefixedHex(fpYCoordinate.subarray(16)), 16) + + fp2.set_a(fp_x) + fp2.set_b(fp_y) + + return fp2 +} + +export { + BLS12_381_FromG1Point, + BLS12_381_FromG2Point, + BLS12_381_ToFp2Point, + BLS12_381_ToFpPoint, + BLS12_381_ToFrPoint, + BLS12_381_ToG1Point, + BLS12_381_ToG2Point, +} diff --git a/packages/evm/src/types.ts b/packages/evm/src/types.ts index 037009b1f..0a979b16a 100644 --- a/packages/evm/src/types.ts +++ b/packages/evm/src/types.ts @@ -172,14 +172,6 @@ export type EVMProfilerOpts = { * Options for instantiating a {@link EVM}. */ export interface EVMOpts { - /** - * The BN128 curve package (`rustbn-wasm`) - */ - bn128?: { - ec_pairing: (input_str: string) => string - ec_add: (input_str: string) => string - ec_mul: (input_hex: string) => string - } /** * Use a {@link Common} instance for EVM instantiation. * @@ -187,10 +179,10 @@ export interface EVMOpts { * * - [EIP-1153](https://eips.ethereum.org/EIPS/eip-1153) - Transient storage opcodes (Cancun) * - [EIP-1559](https://eips.ethereum.org/EIPS/eip-1559) - Fee market change for ETH 1.0 chain - * - [EIP-2315](https://eips.ethereum.org/EIPS/eip-2315) - Simple subroutines for the EVM (`outdated`) * - [EIP-2537](https://eips.ethereum.org/EIPS/eip-2537) - BLS precompiles (removed in v4.0.0, see latest v3 release) * - [EIP-2565](https://eips.ethereum.org/EIPS/eip-2565) - ModExp gas cost * - [EIP-2718](https://eips.ethereum.org/EIPS/eip-2565) - Transaction Types + * - [EIP-2935](https://eips.ethereum.org/EIPS/eip-2935) - Save historical block hashes in state (`experimental`) * - [EIP-2929](https://eips.ethereum.org/EIPS/eip-2929) - gas cost increases for state access opcodes * - [EIP-2930](https://eips.ethereum.org/EIPS/eip-2930) - Optional access list tx type * - [EIP-3074](https://eips.ethereum.org/EIPS/eip-3074) - AUTH and AUTHCALL opcodes diff --git a/packages/evm/test/customOpcodes.spec.ts b/packages/evm/test/customOpcodes.spec.ts index 47fadaf36..52a5551c4 100644 --- a/packages/evm/test/customOpcodes.spec.ts +++ b/packages/evm/test/customOpcodes.spec.ts @@ -67,7 +67,7 @@ describe('VM: custom opcodes', () => { }) assert.ok(res.executionGasUsed === gas, 'successfully deleted opcode') - const evmDefault = await EVM.create({}) + const evmDefault = await EVM.create() // PUSH 04 // PUSH 01 diff --git a/packages/evm/test/customPrecompiles.spec.ts b/packages/evm/test/customPrecompiles.spec.ts index 4d9205121..ac1af774b 100644 --- a/packages/evm/test/customPrecompiles.spec.ts +++ b/packages/evm/test/customPrecompiles.spec.ts @@ -104,7 +104,7 @@ describe('EVM -> custom precompiles', () => { }) it('should not persist changes to precompiles', async () => { - let EVMSha = await EVM.create({}) + let EVMSha = await EVM.create() const shaResult = await EVMSha.runCall({ to: shaAddress, gasLimit: BigInt(30000), @@ -128,7 +128,7 @@ describe('EVM -> custom precompiles', () => { // sanity: check we have overridden assert.deepEqual(result.execResult.returnValue, expectedReturn, 'return value is correct') assert.ok(result.execResult.executionGasUsed === expectedGas, 'gas used is correct') - EVMSha = await EVM.create({}) + EVMSha = await EVM.create() const shaResult2 = await EVMSha.runCall({ to: shaAddress, gasLimit: BigInt(30000), diff --git a/packages/evm/test/eips/eip-5656.spec.ts b/packages/evm/test/eips/eip-5656.spec.ts index e45480850..1a2b78f34 100644 --- a/packages/evm/test/eips/eip-5656.spec.ts +++ b/packages/evm/test/eips/eip-5656.spec.ts @@ -92,6 +92,7 @@ describe('should test mcopy', () => { evm.events.on('step', (e) => { if (e.opcode.name === 'STOP') { currentMem = bytesToHex(e.memory) + assert.equal(currentMem, '0x' + situation.post, 'post-memory correct') } }) @@ -99,8 +100,6 @@ describe('should test mcopy', () => { data: hexToBytes(bytecode), gasLimit: BigInt(0xffffff), }) - - assert.equal(currentMem, '0x' + situation.post, 'post-memory correct') }) } }) diff --git a/packages/evm/test/opcodes.spec.ts b/packages/evm/test/opcodes.spec.ts index b4ff6d3b4..3c09aef35 100644 --- a/packages/evm/test/opcodes.spec.ts +++ b/packages/evm/test/opcodes.spec.ts @@ -6,7 +6,6 @@ import { EVM } from '../src/index.js' describe('EVM -> getActiveOpcodes()', () => { const DIFFICULTY_PREVRANDAO = 0x44 const CHAINID = 0x46 //istanbul opcode - const BEGINSUB = 0x5c // EIP-2315 opcode it('should not expose opcodes from a follow-up HF (istanbul -> petersburg)', async () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Petersburg }) @@ -54,24 +53,6 @@ describe('EVM -> getActiveOpcodes()', () => { ) }) - it('should expose opcodes when EIP is active', async () => { - let common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul, eips: [2315] }) - let evm = await EVM.create({ common }) - assert.equal( - evm.getActiveOpcodes().get(BEGINSUB)!.name, - 'BEGINSUB', - 'EIP-2315 opcode BEGINSUB exposed (EIP-2315 activated)' - ) - - common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) - evm = await EVM.create({ common }) - assert.equal( - evm.getActiveOpcodes().get(BEGINSUB), - undefined, - 'EIP-2315 opcode BEGINSUB not exposed (EIP-2315 not activated)' - ) - }) - it('should update opcodes on a hardfork change', async () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Istanbul }) const evm = await EVM.create({ common }) diff --git a/packages/evm/test/precompiles/05-modexp.spec.ts b/packages/evm/test/precompiles/05-modexp.spec.ts index 967a5f4be..72f2f28ac 100644 --- a/packages/evm/test/precompiles/05-modexp.spec.ts +++ b/packages/evm/test/precompiles/05-modexp.spec.ts @@ -22,22 +22,21 @@ describe('Precompiles: MODEXP', () => { addressStr = '0000000000000000000000000000000000000005' MODEXP = getActivePrecompiles(common).get(addressStr)! }) - it('should run testdata', async () => { - let n = 0 - for (const [input, expect] of fuzzerTests) { - n++ - it(`MODEXP edge cases (issue 3168) - case ${n}`, async () => { - const result = await MODEXP({ - data: hexToBytes(input), - gasLimit: BigInt(0xffff), - common, - _EVM: evm, - }) - const oput = bytesToHex(result.returnValue) - assert.equal(oput, expect) + + let n = 0 + for (const [input, expect] of fuzzerTests) { + n++ + it(`MODEXP edge cases (issue 3168) - case ${n}`, async () => { + const result = await MODEXP({ + data: hexToBytes(input), + gasLimit: BigInt(0xffff), + common, + _EVM: evm, }) - } - }) + const oput = bytesToHex(result.returnValue) + assert.equal(oput, expect) + }) + } it('should correctly right-pad data if input length is too short', async () => { const gas = BigInt(0xffff) diff --git a/packages/evm/test/precompiles/0a-pointevaluation.spec.ts b/packages/evm/test/precompiles/0a-pointevaluation.spec.ts index 38cac4942..6027dfb59 100644 --- a/packages/evm/test/precompiles/0a-pointevaluation.spec.ts +++ b/packages/evm/test/precompiles/0a-pointevaluation.spec.ts @@ -4,10 +4,9 @@ import { computeVersionedHash, concatBytes, hexToBytes, - initKZG, unpadBytes, } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import { EVM, getActivePrecompiles } from '../../src/index.js' @@ -22,8 +21,7 @@ describe('Precompiles: point evaluation', () => { it('should work', async () => { const genesisJSON = await import('../../../client/test/testdata/geth-genesis/eip4844.json') - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const common = Common.fromGethGenesis(genesisJSON, { chain: 'custom', diff --git a/packages/evm/test/precompiles/0b-bls12-g1add.spec.ts b/packages/evm/test/precompiles/0b-bls12-g1add.spec.ts new file mode 100644 index 000000000..36cea2da4 --- /dev/null +++ b/packages/evm/test/precompiles/0b-bls12-g1add.spec.ts @@ -0,0 +1,106 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/add_G1_bls.json +const testData = [ + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21', + Name: 'bls_g1add_g1+p1', + Expected: + '000000000000000000000000000000000a40300ce2dec9888b60690e9a41d3004fda4886854573974fab73b046d3147ba5b7a5bde85279ffede1b45b3918d82d0000000000000000000000000000000006d3d887e9f53b9ec4eb6cedf5607226754b07c01ace7834f57f3e7315faefb739e59018e22c492006190fba4a870025', + Gas: 600, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1', + Name: 'bls_g1add_p1+g1', + Expected: + '000000000000000000000000000000000a40300ce2dec9888b60690e9a41d3004fda4886854573974fab73b046d3147ba5b7a5bde85279ffede1b45b3918d82d0000000000000000000000000000000006d3d887e9f53b9ec4eb6cedf5607226754b07c01ace7834f57f3e7315faefb739e59018e22c492006190fba4a870025', + Gas: 600, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1add_(g1+0=g1)', + Expected: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1', + Gas: 600, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1add_(p1+0=p1)', + Expected: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21', + Gas: 600, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb00000000000000000000000000000000114d1d6855d545a8aa7d76c8cf2e21f267816aef1db507c96655b9d5caac42364e6f38ba0ecb751bad54dcd6b939c2ca', + Name: 'bls_g1add_(g1-g1=0)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 600, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca9426000000000000000000000000000000000195e911162921ba5ed055b496420f197693d36569ec34c63d7c0529a097d49e543070afba4b707e878e53c2b779208a', + Name: 'bls_g1add_(p1-p1=0)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 600, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1', + Name: 'bls_g1add_(g1+g1=2*g1)', + Expected: + '000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d28', + Gas: 600, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2100000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21', + Name: 'bls_g1add_(p1+p1=2*p1)', + Expected: + '0000000000000000000000000000000015222cddbabdd764c4bee0b3720322a65ff4712c86fc4b1588d0c209210a0884fa9468e855d261c483091b2bf7de6a630000000000000000000000000000000009f9edb99bc3b75d7489735c98b16ab78b9386c5f7a1f76c7e96ac6eb5bbde30dbca31a74ec6e0f0b12229eecea33c39', + Gas: 600, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-G1-ADD', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12G1ADD = getActivePrecompiles(common).get('000000000000000000000000000000000000000b')! + + for (const testVector of testData) { + const result = await BLS12G1ADD({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/0c-bls12-g1mul.spec.ts b/packages/evm/test/precompiles/0c-bls12-g1mul.spec.ts new file mode 100644 index 000000000..9f1d33673 --- /dev/null +++ b/packages/evm/test/precompiles/0c-bls12-g1mul.spec.ts @@ -0,0 +1,97 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/mul_G1_bls.json +const testData = [ + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g1mul_(g1+g1=2*g1)', + Expected: + '000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d28', + Gas: 12000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g1mul_(p1+p1=2*p1)', + Expected: + '0000000000000000000000000000000015222cddbabdd764c4bee0b3720322a65ff4712c86fc4b1588d0c209210a0884fa9468e855d261c483091b2bf7de6a630000000000000000000000000000000009f9edb99bc3b75d7489735c98b16ab78b9386c5f7a1f76c7e96ac6eb5bbde30dbca31a74ec6e0f0b12229eecea33c39', + Gas: 12000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g1mul_(1*g1=g1)', + Expected: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1', + Gas: 12000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g1mul_(1*p1=p1)', + Expected: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21', + Gas: 12000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1mul_(0*g1=inf)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 12000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1mul_(0*p1=inf)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 12000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011', + Name: 'bls_g1mul_(x*inf=inf)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 12000, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-G1-MUL', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12G1MUL = getActivePrecompiles(common).get('000000000000000000000000000000000000000c')! + + for (const testVector of testData) { + const result = await BLS12G1MUL({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/0d-bls12-g1msm.spec.ts b/packages/evm/test/precompiles/0d-bls12-g1msm.spec.ts new file mode 100644 index 000000000..a5f085a85 --- /dev/null +++ b/packages/evm/test/precompiles/0d-bls12-g1msm.spec.ts @@ -0,0 +1,133 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/multiexp_G1_bls.json +const testData = [ + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g1multiexp_(g1+g1=2*g1)', + Expected: + '000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d28', + Gas: 14400, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g1multiexp_(p1+p1=2*p1)', + Expected: + '0000000000000000000000000000000015222cddbabdd764c4bee0b3720322a65ff4712c86fc4b1588d0c209210a0884fa9468e855d261c483091b2bf7de6a630000000000000000000000000000000009f9edb99bc3b75d7489735c98b16ab78b9386c5f7a1f76c7e96ac6eb5bbde30dbca31a74ec6e0f0b12229eecea33c39', + Gas: 14400, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g1multiexp_(1*g1=g1)', + Expected: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1', + Gas: 14400, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g1multiexp_(1*p1=p1)', + Expected: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a21', + Gas: 14400, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1multiexp_(0*g1=inf)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 14400, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1multiexp_(0*p1=inf)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 14400, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011', + Name: 'bls_g1multiexp_(x*inf=inf)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 14400, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1multiexp_(2g1+inf)', + Expected: + '000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d28', + Gas: 21312, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e10000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1multiexp_(inf+inf)', + Expected: + '0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 21312, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a210000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g1multiexp_(2g1+2p1)', + Expected: + '00000000000000000000000000000000148f92dced907361b4782ab542a75281d4b6f71f65c8abf94a5a9082388c64662d30fd6a01ced724feef3e284752038c0000000000000000000000000000000015c3634c3b67bc18e19150e12bfd8a1769306ed010f59be645a0823acb5b38f39e8e0d86e59b6353fdafc59ca971b769', + Gas: 21312, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f1d3a73197d7942695638c4fa9ac0fc3688c4f9774b905a14e3a3f171bac586c55e83ff97a1aeffb3af00adb22c6bb0000000000000000000000000000000008b3f481e3aaa0f1a09e30ed741d8ae4fcf5e095d5d00af600db18cb2c04b3edd03cc744a2888ae40caa232946c5e7e1263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e300000000000000000000000000000000112b98340eee2777cc3c14163dea3ec97977ac3dc5c70da32e6e87578f44912e902ccef9efe28d4a78b8999dfbca942600000000000000000000000000000000186b28d92356c4dfec4b5201ad099dbdede3781f8998ddf929b4cd7756192185ca7b8f4ef7088f813270ac3d48868a2147b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff66513800000000000000000000000000000000184bb665c37ff561a89ec2122dd343f20e0f4cbcaec84e3c3052ea81d1834e192c426074b02ed3dca4e7676ce4ce48ba0000000000000000000000000000000004407b8d35af4dacc809927071fc0405218f1401a6d15af775810e4e460064bcc9468beeba82fdc751be70476c888bf3328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d21600000000000000000000000000000000009769f3ab59bfd551d53a5f846b9984c59b97d6842b20a2c565baa167945e3d026a3755b6345df8ec7e6acb6868ae6d000000000000000000000000000000001532c00cf61aa3d0ce3e5aa20c3b531a2abd2c770a790a2613818303c6b830ffc0ecf6c357af3317b9575c567f11cd2c263dbd792f5b1be47ed85f8938c0f29586af0d3ac7b977f21c278fe1462040e2000000000000000000000000000000001974dbb8e6b5d20b84df7e625e2fbfecb2cdb5f77d5eae5fb2955e5ce7313cae8364bc2fff520a6c25619739c6bdcb6a0000000000000000000000000000000015f9897e11c6441eaa676de141c8d83c37aab8667173cbe1dfd6de74d11861b961dccebcd9d289ac633455dfcc7013a347b8192d77bf871b62e87859d653922725724a5c031afeabc60bcef5ff665131000000000000000000000000000000000a7a047c4a8397b3446450642c2ac64d7239b61872c9ae7a59707a8f4f950f101e766afe58223b3bff3a19a7f754027c000000000000000000000000000000001383aebba1e4327ccff7cf9912bda0dbc77de048b71ef8c8a81111d71dc33c5e3aa6edee9cf6f5fe525d50cc50b77cc9328388aff0d4a5b7dc9205abd374e7e98f3cd9f3418edb4eafda5fb16473d211000000000000000000000000000000000e7a16a975904f131682edbb03d9560d3e48214c9986bd50417a77108d13dc957500edf96462a3d01e62dc6cd468ef11000000000000000000000000000000000ae89e677711d05c30a48d6d75e76ca9fb70fe06c6dd6ff988683d89ccde29ac7d46c53bb97a59b1901abf1db66052db55b53c4669f19f0fc7431929bc0363d7d8fb432435fcde2635fdba334424e9f5', + Name: 'bls_g1multiexp_multiple', + Expected: + '00000000000000000000000000000000053fbdb09b6b5faa08bfe7b7069454247ad4d8bd57e90e2d2ebaa04003dcf110aa83072c07f480ab2107cca2ccff6091000000000000000000000000000000001654537b7c96fe64d13906066679c3d45808cb666452b55d1b909c230cc4b423c3f932c58754b9b762dc49fcc825522c', + Gas: 42000, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-G1-MSM', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12G1MSM = getActivePrecompiles(common).get('000000000000000000000000000000000000000d')! + + for (const testVector of testData) { + const result = await BLS12G1MSM({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/0e-bls12-g2add.spec.ts b/packages/evm/test/precompiles/0e-bls12-g2add.spec.ts new file mode 100644 index 000000000..d03a879d6 --- /dev/null +++ b/packages/evm/test/precompiles/0e-bls12-g2add.spec.ts @@ -0,0 +1,106 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/add_G2_bls.json +const testData = [ + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d878451', + Name: 'bls_g2add_g2+p2', + Expected: + '000000000000000000000000000000000b54a8a7b08bd6827ed9a797de216b8c9057b3a9ca93e2f88e7f04f19accc42da90d883632b9ca4dc38d013f71ede4db00000000000000000000000000000000077eba4eecf0bd764dce8ed5f45040dd8f3b3427cb35230509482c14651713282946306247866dfe39a8e33016fcbe520000000000000000000000000000000014e60a76a29ef85cbd69f251b9f29147b67cfe3ed2823d3f9776b3a0efd2731941d47436dc6d2b58d9e65f8438bad073000000000000000000000000000000001586c3c910d95754fef7a732df78e279c3d37431c6a2b77e67a00c7c130a8fcd4d19f159cbeb997a178108fffffcbd20', + Gas: 4500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d87845100000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be', + Name: 'bls_g2add_p2+g2', + Expected: + '000000000000000000000000000000000b54a8a7b08bd6827ed9a797de216b8c9057b3a9ca93e2f88e7f04f19accc42da90d883632b9ca4dc38d013f71ede4db00000000000000000000000000000000077eba4eecf0bd764dce8ed5f45040dd8f3b3427cb35230509482c14651713282946306247866dfe39a8e33016fcbe520000000000000000000000000000000014e60a76a29ef85cbd69f251b9f29147b67cfe3ed2823d3f9776b3a0efd2731941d47436dc6d2b58d9e65f8438bad073000000000000000000000000000000001586c3c910d95754fef7a732df78e279c3d37431c6a2b77e67a00c7c130a8fcd4d19f159cbeb997a178108fffffcbd20', + Gas: 4500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g2add_(g2+0=g2)', + Expected: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be', + Gas: 4500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d87845100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g2add_(p2+0=p2)', + Expected: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d878451', + Gas: 4500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa0000000000000000000000000000000013fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed', + Name: 'bls_g2add_(g2-g2=0)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 4500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d87845100000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000a6296409115572426717c73668335a949829d739cff2cb4ab043710d28f8e772f6ef41aac4806c9cb273c490384032d000000000000000000000000000000000cde4e850c721fa94e8890d500e3655b442d5c0dc4fff1b694c6f8dd68f6d8dc1bc3251a37d27e7af96f65a96278265a', + Name: 'bls_g2add_(p2-p2=0)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 4500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be', + Name: 'bls_g2add_(g2+g2=2*g2)', + Expected: + '000000000000000000000000000000001638533957d540a9d2370f17cc7ed5863bc0b995b8825e0ee1ea1e1e4d00dbae81f14b0bf3611b78c952aacab827a053000000000000000000000000000000000a4edef9c1ed7f729f520e47730a124fd70662a904ba1074728114d1031e1572c6c886f6b57ec72a6178288c47c33577000000000000000000000000000000000468fb440d82b0630aeb8dca2b5256789a66da69bf91009cbfe6bd221e47aa8ae88dece9764bf3bd999d95d71e4c9899000000000000000000000000000000000f6d4552fa65dd2638b361543f887136a43253d9c66c411697003f7a13c308f5422e1aa0a59c8967acdefd8b6e36ccf3', + Gas: 4500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d87845100000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d878451', + Name: 'bls_g2add_(p2+p2=2*p2)', + Expected: + '000000000000000000000000000000000b76fcbb604082a4f2d19858a7befd6053fa181c5119a612dfec83832537f644e02454f2b70d40985ebb08042d1620d40000000000000000000000000000000019a4a02c0ae51365d964c73be7babb719db1c69e0ddbf9a8a335b5bed3b0a4b070d2d5df01d2da4a3f1e56aae2ec106d000000000000000000000000000000000d18322f821ac72d3ca92f92b000483cf5b7d9e5d06873a44071c4e7e81efd904f210208fe0b9b4824f01c65bc7e62080000000000000000000000000000000004e563d53609a2d1e216aaaee5fbc14ef460160db8d1fdc5e1bd4e8b54cd2f39abf6f925969fa405efb9e700b01c7085', + Gas: 4500, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-G2-ADD', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12G2ADD = getActivePrecompiles(common).get('000000000000000000000000000000000000000e')! + + for (const testVector of testData) { + const result = await BLS12G2ADD({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts b/packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts new file mode 100644 index 000000000..4a24d746f --- /dev/null +++ b/packages/evm/test/precompiles/0f-bls12-g2mul.spec.ts @@ -0,0 +1,97 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/mul_G2_bls.json +const testData = [ + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g2mul_(g2+g2=2*g2)', + Expected: + '000000000000000000000000000000001638533957d540a9d2370f17cc7ed5863bc0b995b8825e0ee1ea1e1e4d00dbae81f14b0bf3611b78c952aacab827a053000000000000000000000000000000000a4edef9c1ed7f729f520e47730a124fd70662a904ba1074728114d1031e1572c6c886f6b57ec72a6178288c47c33577000000000000000000000000000000000468fb440d82b0630aeb8dca2b5256789a66da69bf91009cbfe6bd221e47aa8ae88dece9764bf3bd999d95d71e4c9899000000000000000000000000000000000f6d4552fa65dd2638b361543f887136a43253d9c66c411697003f7a13c308f5422e1aa0a59c8967acdefd8b6e36ccf3', + Gas: 55000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g2mul_(p2+p2=2*p2)', + Expected: + '000000000000000000000000000000000b76fcbb604082a4f2d19858a7befd6053fa181c5119a612dfec83832537f644e02454f2b70d40985ebb08042d1620d40000000000000000000000000000000019a4a02c0ae51365d964c73be7babb719db1c69e0ddbf9a8a335b5bed3b0a4b070d2d5df01d2da4a3f1e56aae2ec106d000000000000000000000000000000000d18322f821ac72d3ca92f92b000483cf5b7d9e5d06873a44071c4e7e81efd904f210208fe0b9b4824f01c65bc7e62080000000000000000000000000000000004e563d53609a2d1e216aaaee5fbc14ef460160db8d1fdc5e1bd4e8b54cd2f39abf6f925969fa405efb9e700b01c7085', + Gas: 55000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g2mul_(1*g2=g2)', + Expected: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be', + Gas: 55000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g2mul_(1*p2=p2)', + Expected: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d878451', + Gas: 55000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g2mul_(0*g2=inf)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 55000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g2mul_(0*p2=inf)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 55000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011', + Name: 'bls_g2mul_(x*inf=inf)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 55000, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-G2-MUL', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12G2MUL = getActivePrecompiles(common).get('000000000000000000000000000000000000000f')! + + for (const testVector of testData) { + const result = await BLS12G2MUL({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/10-bls12-g2msm.spec.ts b/packages/evm/test/precompiles/10-bls12-g2msm.spec.ts new file mode 100644 index 000000000..6ef36b062 --- /dev/null +++ b/packages/evm/test/precompiles/10-bls12-g2msm.spec.ts @@ -0,0 +1,124 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/msm_G2_bls.json +const testData = [ + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g2multiexp_(g2+g2=2*g2)', + Expected: + '000000000000000000000000000000001638533957d540a9d2370f17cc7ed5863bc0b995b8825e0ee1ea1e1e4d00dbae81f14b0bf3611b78c952aacab827a053000000000000000000000000000000000a4edef9c1ed7f729f520e47730a124fd70662a904ba1074728114d1031e1572c6c886f6b57ec72a6178288c47c33577000000000000000000000000000000000468fb440d82b0630aeb8dca2b5256789a66da69bf91009cbfe6bd221e47aa8ae88dece9764bf3bd999d95d71e4c9899000000000000000000000000000000000f6d4552fa65dd2638b361543f887136a43253d9c66c411697003f7a13c308f5422e1aa0a59c8967acdefd8b6e36ccf3', + Gas: 66000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g2multiexp_(p2+p2=2*p2)', + Expected: + '000000000000000000000000000000000b76fcbb604082a4f2d19858a7befd6053fa181c5119a612dfec83832537f644e02454f2b70d40985ebb08042d1620d40000000000000000000000000000000019a4a02c0ae51365d964c73be7babb719db1c69e0ddbf9a8a335b5bed3b0a4b070d2d5df01d2da4a3f1e56aae2ec106d000000000000000000000000000000000d18322f821ac72d3ca92f92b000483cf5b7d9e5d06873a44071c4e7e81efd904f210208fe0b9b4824f01c65bc7e62080000000000000000000000000000000004e563d53609a2d1e216aaaee5fbc14ef460160db8d1fdc5e1bd4e8b54cd2f39abf6f925969fa405efb9e700b01c7085', + Gas: 66000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g2multiexp_(1*g2=g2)', + Expected: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be', + Gas: 66000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_g2multiexp_(1*p2=p2)', + Expected: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d878451', + Gas: 66000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g2multiexp_(0*g2=inf)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 66000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g2multiexp_(0*p2=inf)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 66000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011', + Name: 'bls_g2multiexp_(x*inf=inf)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 66000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g2multiexp_(2g2+inf)', + Expected: + '000000000000000000000000000000001638533957d540a9d2370f17cc7ed5863bc0b995b8825e0ee1ea1e1e4d00dbae81f14b0bf3611b78c952aacab827a053000000000000000000000000000000000a4edef9c1ed7f729f520e47730a124fd70662a904ba1074728114d1031e1572c6c886f6b57ec72a6178288c47c33577000000000000000000000000000000000468fb440d82b0630aeb8dca2b5256789a66da69bf91009cbfe6bd221e47aa8ae88dece9764bf3bd999d95d71e4c9899000000000000000000000000000000000f6d4552fa65dd2638b361543f887136a43253d9c66c411697003f7a13c308f5422e1aa0a59c8967acdefd8b6e36ccf3', + Gas: 97680, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002', + Name: 'bls_g2multiexp_(2p2+inf)', + Expected: + '000000000000000000000000000000000b76fcbb604082a4f2d19858a7befd6053fa181c5119a612dfec83832537f644e02454f2b70d40985ebb08042d1620d40000000000000000000000000000000019a4a02c0ae51365d964c73be7babb719db1c69e0ddbf9a8a335b5bed3b0a4b070d2d5df01d2da4a3f1e56aae2ec106d000000000000000000000000000000000d18322f821ac72d3ca92f92b000483cf5b7d9e5d06873a44071c4e7e81efd904f210208fe0b9b4824f01c65bc7e62080000000000000000000000000000000004e563d53609a2d1e216aaaee5fbc14ef460160db8d1fdc5e1bd4e8b54cd2f39abf6f925969fa405efb9e700b01c7085', + Gas: 97680, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d878451000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000103121a2ceaae586d240843a398967325f8eb5a93e8fea99b62b9f88d8556c80dd726a4b30e84a36eeabaf3592937f2700000000000000000000000000000000086b990f3da2aeac0a36143b7d7c824428215140db1bb859338764cb58458f081d92664f9053b50b3fbd2e4723121b68000000000000000000000000000000000f9e7ba9a86a8f7624aa2b42dcc8772e1af4ae115685e60abc2c9b90242167acef3d0be4050bf935eed7c3b6fc7ba77e000000000000000000000000000000000d22c3652d0dc6f0fc9316e14268477c2049ef772e852108d269d9c38dba1d4802e8dae479818184c08f9a569d8784510000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_g1multiexp_(inf+inf)', + Expected: + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + Gas: 97680, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-G2-MSM', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12G2MSM = getActivePrecompiles(common).get('0000000000000000000000000000000000000010')! + + for (const testVector of testData) { + const result = await BLS12G2MSM({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/11-bls12-pairing.spec.ts b/packages/evm/test/precompiles/11-bls12-pairing.spec.ts new file mode 100644 index 000000000..1a54d0f80 --- /dev/null +++ b/packages/evm/test/precompiles/11-bls12-pairing.spec.ts @@ -0,0 +1,837 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Tests were borrowed from Erigon here +// https://github.com/ledgerwatch/erigon/blob/0f49aabd39738c45a5fff1d85b2abc68219783a7/core/vm/testdata/precompiles/blsPairing.json#L1 +const testdata = [ + { + Input: + '000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d2800000000000000000000000000000000122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae0000000000000000000000000000000009380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc000000000000000000000000000000000b21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd8920000000000000000000000000000000008f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e8490000000000000000000000000000000006e82f6da4520f85c5d27d8f329eccfa05944fd1096b20734c894966d12a9e2a9a9744529d7212d33883113a0cadb9090000000000000000000000000000000017d81038f7d60bee9110d9c0d6d1102fe2d998c957f28e31ec284cc04134df8e47e8f82ff3af2e60a6d9688a4563477c00000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa0000000000000000000000000000000013fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_pairing_e(2*G1,3*G2)=e(6*G1,G2)', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000572cbea904d67468808c8eb50a9450c9721db309128012543902d0ac358a62ae28f75bb8f1c7c42c39a8c5529bf0f4e00000000000000000000000000000000166a9d8cabc673a322fda673779d8e3822ba3ecb8670e461f73bb9021d5fd76a4c56d9d4cd16bd1bba86881979749d2800000000000000000000000000000000122915c824a0857e2ee414a3dccb23ae691ae54329781315a0c75df1c04d6d7a50a030fc866f09d516020ef82324afae0000000000000000000000000000000009380275bbc8e5dcea7dc4dd7e0550ff2ac480905396eda55062650f8d251c96eb480673937cc6d9d6a44aaa56ca66dc000000000000000000000000000000000b21da7955969e61010c7a1abc1a6f0136961d1e3b20b1a7326ac738fef5c721479dfd948b52fdf2455e44813ecfd8920000000000000000000000000000000008f239ba329b3967fe48d718a36cfe5f62a7e42e0bf1c1ed714150a166bfbd6bcf6b3b58b975b9edea56d53f23a0e8490000000000000000000000000000000010e7791fb972fe014159aa33a98622da3cdc98ff707965e536d8636b5fcc5ac7a91a8c46e59a00dca575af0f18fb13dc0000000000000000000000000000000016ba437edcc6551e30c10512367494bfb6b01cc6681e8a4c3cd2501832ab5c4abc40b4578b85cbaffbf0bcd70d67c6e200000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa0000000000000000000000000000000013fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_pairing_e(2*G1,3*G2)=e(5*G1,G2)', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000000fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a550000000000000000000000000000000004523f5a3915fc57ee889cdb057e3e76109112d125217546ccfe26810c99b130d1b27820595ad61c7527dc5bbb132a9000000000000000000000000000000000186a1da343cacf1815b9c8b6c807f536249dbfdb59d77bf4920ad2198a0d83ada21f7c39de6f06a5599f22571cab288d000000000000000000000000000000000ba1ec44f95121bd622932b84bbb4b3d279f69c494ee44db68e3165c86b627ba5e397ee197313fb5b775972798997332000000000000000000000000000000000783e7493e9fb106fa0d085e7c03eb816468d12c65d9b77643ed07c02583d491f4db5db44e565d50d8ccaa9ad8f7f8e80000000000000000000000000000000010a6a5fd90cd5f4fb6545814f5df065b001074bb3f29f649dd2612815df3a19a320f7754dd3d458e48e7fb1b4953978f000000000000000000000000000000000345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c00000000000000000000000000000000083d3baf25e42f2845d8fa594dda2e0f40a4d670dda40f30da0aff0d81c87ac3d687fe84eca72f34c7c755a045668cf100000000000000000000000000000000129c4945fe62538d2806fff056adac24f3bba8e17e42d82122affe6ad2123d68784348a79755f194fde3b3d448924032000000000000000000000000000000000528590e82f409ea8ce953f0c59d15080185dc6e3219b69fcaa3a2c8fc9d0b9e0bc1e75ec6c52638e6eaa4584005b5380000000000000000000000000000000018dc3e893f74729d27dd44f45a5a4f433dcd09a3b485e9d1c2bd0eb5e0e4c9024d928ddc426fdecae931e89885ee4db4000000000000000000000000000000000d6ee02e1fc7e52a8e1ef17e753065882c6fcc14da61da7ffe955fe84a9d2af9ba57562c69db3088652931bf124b0d5300000000000000000000000000000000051f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e000000000000000000000000000000000b6a63ac48b7d7666ccfcf1e7de0097c5e6e1aacd03507d23fb975d8daec42857b3a471bf3fc471425b63864e045f4df00000000000000000000000000000000131747485cce9a5c32837a964b8c0689ff70cb4702c6520f2220ab95192d73ae9508c5b998ffb0be40520926846ce3f100000000000000000000000000000000101e147f8bd7682b47b3a6cc0c552c26ce90b9ce0daef21f7f634b3360483afa14a11e6745e7de01a35c65b396a1a12700000000000000000000000000000000090ca61ed16c4c1e80acfef736eea2db0d7425d9110cb53e6c4a2aa3f8a59ee6c60bdce8df5825011066d44bef84d29600000000000000000000000000000000028207394adcbf30250ac21a8f1db6283580bc5e39159930552e5edb25e6215c66b6450296edc80dbc3a2acd125dab160000000000000000000000000000000019bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3000000000000000000000000000000000adb3250ba142db6a748a85e4e401fa0490dd10f27068d161bd47cb562cc189b3194ab53a998e48a48c65e071bb541170000000000000000000000000000000016cfabbe60d1e55723a0ff72cf802f2d1cf13ed131e17729adc88522a657f320a336078a9399c8e61a3bbde3d52fd3640000000000000000000000000000000009aa9a3c2a6d49d286aa593c6ff644f1786fa9ae471bdb3fe70b150a9ed7584eaa886ac057c30005c3642f65ad5581cc0000000000000000000000000000000001d417894c0cce924955a795b188b27951f8438a5485404b921a42fa79dea03c10e29d0390df2f34d7be13f360a7fada00000000000000000000000000000000189b0b3a04e6c613899d51231dbf0cba6a8a8f507ebed99d24fba7ebac6c97a8859ffde88e6d95c1a9d6b4f0a8f3c417000000000000000000000000000000000d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a414950835820000000000000000000000000000000009d0d1f706f1a85a98f3efaf5c35a41c9182afc129285cf2db3212f6ea0da586ca539bc66181f2ccb228485dd8aff0a70000000000000000000000000000000016cad7807d761f2c0c6ff11e786a9ed296442de8acc50f72a87139b9f1eb7c168e1c2f0b2a1ad7f9579e1e922d0eb309000000000000000000000000000000000d3577c713fcbc0648ca8fbdda0a0bf83c726a6205ee04d2d34cacff92b58725ca3c9766206e22d0791cb232fa8a9bc3000000000000000000000000000000000f5ea1957be1b9ca8956ba5f6b1c37ea72e2529f80d7a1c61df01afcc2df6f99ced81ac0052bd0e1e83f09d76ad8d33b000000000000000000000000000000000aabced4e2b9e4a473e72bf2b1cc0ce7ab13de533107df2205ed9e2bb50fa0217e6a13abcd12fce1bda1ccf84dac237a00000000000000000000000000000000073eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086000000000000000000000000000000001825bacd18f695351f843521ebeada20352c3c3965626f98bc4c68e6ff7c4eed38b48f328204bbb9cd461511d24ebfb3000000000000000000000000000000000029ea93c2f1eb48b195815571ea0148198ff1b19462618cab08d037646b592ecab5a66b4bc660ffd02d1b996ca377da000000000000000000000000000000000bb319a4550c981ee89e3c7e6dcc434283454847792807940f72fd2dbf3625b092e0a0c03e581fd9bd9cf74f95ccef15000000000000000000000000000000000abb072b8d9011e81c9f5b23ba86fdb6399c878aa4eadee45fb2486afe594dffc53be643598a23e5428894a36f5ac3ce0000000000000000000000000000000005d04aa0b644faae17d4c76a14aa680c69fdfc6b59fee3ef45641f566165fced60cbbda4ca096e132bb6f58ab4516686000000000000000000000000000000001098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a000000000000000000000000000000000ea923110b733b531006075f796cc9368f2477fe26020f465468efbb380ce1f8eebaf5c770f31d320f9bd378dc758436000000000000000000000000000000001065f2a2d29a997343765f239c99a018490eced40ac42fc93217dfe20d8b43ee2215f65166aff483b3dc042c5a43b196000000000000000000000000000000000766e4c66f4a442ff1f61a7a4d197d2b47dd226d0e7822a9b065108cfc643cd3f3d5ae59ed2ce4cde13fd9260bb5b7cc0000000000000000000000000000000012251cc6abbabeb7bbe1fdd63eaee10832a748fff24f7e3fdccaea87facb6e99f2e0407a38f27f90450a471b873104620000000000000000000000000000000011181e08c8fba91271adfee9d31681f8412ab7a3f754f7ba4709024c0ad2287e32dd455d71a296b4838072a8ab9d96f2000000000000000000000000000000001252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada0000000000000000000000000000000002a1bc189e36902d1a49b9965eca3cb818ab5c26dffca63ca9af032870f7bbc615ac65f21bed27bd77dd65f2e90f53580000000000000000000000000000000005a7445f55add1ed5c143424ceef3d594280e316c9441a8e68c3ad97377141d015bf878bdfcf0df9fbcd0529f4e8100800000000000000000000000000000000192b52ba08ed509fc84d5775a7182498fd1ff80941d673c53470c9c9f1192f9c0057d68a1dfee0c68fe5df3625cc43bf000000000000000000000000000000000d3fcaf2f727e0eb32c65da9b910dc681b948dda874d0db6f6ed3f063430fbf073385a9a14c2dd78568726124e2b3ea8000000000000000000000000000000001943ce22cdb2387bd5796950dc95d1ace4012ab9bb4afb46223760230c1709e075f1ae76d6b3f2e947ba6b16d458ccd1000000000000000000000000000000001271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4000000000000000000000000000000001407ffc2c1a2fe3b00d1f91e1f4febcda31004f7c301075c9031c55dd3dfa8104b156a6a3b7017fccd27f81c2af222ef000000000000000000000000000000000a29e38da2d42fd4712052800c7c8dd6e94fd9f506e946068aaac799d60b94c2d7515769ffdd32ea95d3910330ec47de000000000000000000000000000000000c60dae92451206390e30b5daa7151d63624dee496753c87dd54eadc92dc9602081fae02a1a53bac97e984a571923a5d00000000000000000000000000000000085f4fda4c72328895f20c683cb49603a37ff2c43d62f66602506dad5b8d1daebfbac7a7db3f50ccf4dfff277deb105c0000000000000000000000000000000005674d005457e0fe1f0fd978d63996c5f3d29f9149ee4eb04c464742dd329ccaef5e5f6b896d986ddfc9f1b2a3aec13100000000000000000000000000000000071bc66d6e2d244afc4a5ce4da1dce3d0c22c303ba61310fdf57843bbd97763ef496833dfa99d14be084bb1a039bb2da0000000000000000000000000000000012c22e047b0af8e2f4bf3bd3633ef0f8264004ca8ea5677a468857a1762f815235a479e53f4ad4741ffda3fb855021c900000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000d1b3cc2c7027888be51d9ef691d77bcb679afda66c73f17f9ee3837a55024f78c71363275a75d75d86bab79f74782aa0000000000000000000000000000000013fa4d4a0ad8b1ce186ed5061789213d993923066dddaf1040bc3ff59f825c78df74f2d75467e25e0f55f8a00fa030ed', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'bls_pairing_10paircheckstrue', + Gas: 495000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000000fd75ebcc0a21649e3177bcce15426da0e4f25d6828fbf4038d4d7ed3bd4421de3ef61d70f794687b12b2d571971a550000000000000000000000000000000004523f5a3915fc57ee889cdb057e3e76109112d125217546ccfe26810c99b130d1b27820595ad61c7527dc5bbb132a9000000000000000000000000000000000186a1da343cacf1815b9c8b6c807f536249dbfdb59d77bf4920ad2198a0d83ada21f7c39de6f06a5599f22571cab288d000000000000000000000000000000000ba1ec44f95121bd622932b84bbb4b3d279f69c494ee44db68e3165c86b627ba5e397ee197313fb5b775972798997332000000000000000000000000000000000783e7493e9fb106fa0d085e7c03eb816468d12c65d9b77643ed07c02583d491f4db5db44e565d50d8ccaa9ad8f7f8e80000000000000000000000000000000010a6a5fd90cd5f4fb6545814f5df065b001074bb3f29f649dd2612815df3a19a320f7754dd3d458e48e7fb1b4953978f000000000000000000000000000000000345dd80ffef0eaec8920e39ebb7f5e9ae9c1d6179e9129b705923df7830c67f3690cbc48649d4079eadf5397339580c00000000000000000000000000000000083d3baf25e42f2845d8fa594dda2e0f40a4d670dda40f30da0aff0d81c87ac3d687fe84eca72f34c7c755a045668cf100000000000000000000000000000000129c4945fe62538d2806fff056adac24f3bba8e17e42d82122affe6ad2123d68784348a79755f194fde3b3d448924032000000000000000000000000000000000528590e82f409ea8ce953f0c59d15080185dc6e3219b69fcaa3a2c8fc9d0b9e0bc1e75ec6c52638e6eaa4584005b5380000000000000000000000000000000018dc3e893f74729d27dd44f45a5a4f433dcd09a3b485e9d1c2bd0eb5e0e4c9024d928ddc426fdecae931e89885ee4db4000000000000000000000000000000000d6ee02e1fc7e52a8e1ef17e753065882c6fcc14da61da7ffe955fe84a9d2af9ba57562c69db3088652931bf124b0d5300000000000000000000000000000000051f8a0b82a6d86202a61cbc3b0f3db7d19650b914587bde4715ccd372e1e40cab95517779d840416e1679c84a6db24e000000000000000000000000000000000b6a63ac48b7d7666ccfcf1e7de0097c5e6e1aacd03507d23fb975d8daec42857b3a471bf3fc471425b63864e045f4df00000000000000000000000000000000131747485cce9a5c32837a964b8c0689ff70cb4702c6520f2220ab95192d73ae9508c5b998ffb0be40520926846ce3f100000000000000000000000000000000101e147f8bd7682b47b3a6cc0c552c26ce90b9ce0daef21f7f634b3360483afa14a11e6745e7de01a35c65b396a1a12700000000000000000000000000000000090ca61ed16c4c1e80acfef736eea2db0d7425d9110cb53e6c4a2aa3f8a59ee6c60bdce8df5825011066d44bef84d29600000000000000000000000000000000028207394adcbf30250ac21a8f1db6283580bc5e39159930552e5edb25e6215c66b6450296edc80dbc3a2acd125dab160000000000000000000000000000000019bef05aaba1ea467fcbc9c420f5e3153c9d2b5f9bf2c7e2e7f6946f854043627b45b008607b9a9108bb96f3c1c089d3000000000000000000000000000000000adb3250ba142db6a748a85e4e401fa0490dd10f27068d161bd47cb562cc189b3194ab53a998e48a48c65e071bb541170000000000000000000000000000000016cfabbe60d1e55723a0ff72cf802f2d1cf13ed131e17729adc88522a657f320a336078a9399c8e61a3bbde3d52fd3640000000000000000000000000000000009aa9a3c2a6d49d286aa593c6ff644f1786fa9ae471bdb3fe70b150a9ed7584eaa886ac057c30005c3642f65ad5581cc0000000000000000000000000000000001d417894c0cce924955a795b188b27951f8438a5485404b921a42fa79dea03c10e29d0390df2f34d7be13f360a7fada00000000000000000000000000000000189b0b3a04e6c613899d51231dbf0cba6a8a8f507ebed99d24fba7ebac6c97a8859ffde88e6d95c1a9d6b4f0a8f3c417000000000000000000000000000000000d9e19b3f4c7c233a6112e5397309f9812a4f61f754f11dd3dcb8b07d55a7b1dfea65f19a1488a14fef9a414950835820000000000000000000000000000000009d0d1f706f1a85a98f3efaf5c35a41c9182afc129285cf2db3212f6ea0da586ca539bc66181f2ccb228485dd8aff0a70000000000000000000000000000000016cad7807d761f2c0c6ff11e786a9ed296442de8acc50f72a87139b9f1eb7c168e1c2f0b2a1ad7f9579e1e922d0eb309000000000000000000000000000000000d3577c713fcbc0648ca8fbdda0a0bf83c726a6205ee04d2d34cacff92b58725ca3c9766206e22d0791cb232fa8a9bc3000000000000000000000000000000000f5ea1957be1b9ca8956ba5f6b1c37ea72e2529f80d7a1c61df01afcc2df6f99ced81ac0052bd0e1e83f09d76ad8d33b000000000000000000000000000000000aabced4e2b9e4a473e72bf2b1cc0ce7ab13de533107df2205ed9e2bb50fa0217e6a13abcd12fce1bda1ccf84dac237a00000000000000000000000000000000073eb991aa22cdb794da6fcde55a427f0a4df5a4a70de23a988b5e5fc8c4d844f66d990273267a54dd21579b7ba6a086000000000000000000000000000000001825bacd18f695351f843521ebeada20352c3c3965626f98bc4c68e6ff7c4eed38b48f328204bbb9cd461511d24ebfb3000000000000000000000000000000000029ea93c2f1eb48b195815571ea0148198ff1b19462618cab08d037646b592ecab5a66b4bc660ffd02d1b996ca377da000000000000000000000000000000000bb319a4550c981ee89e3c7e6dcc434283454847792807940f72fd2dbf3625b092e0a0c03e581fd9bd9cf74f95ccef15000000000000000000000000000000000abb072b8d9011e81c9f5b23ba86fdb6399c878aa4eadee45fb2486afe594dffc53be643598a23e5428894a36f5ac3ce0000000000000000000000000000000005d04aa0b644faae17d4c76a14aa680c69fdfc6b59fee3ef45641f566165fced60cbbda4ca096e132bb6f58ab4516686000000000000000000000000000000001098f178f84fc753a76bb63709e9be91eec3ff5f7f3a5f4836f34fe8a1a6d6c5578d8fd820573cef3a01e2bfef3eaf3a000000000000000000000000000000000ea923110b733b531006075f796cc9368f2477fe26020f465468efbb380ce1f8eebaf5c770f31d320f9bd378dc758436000000000000000000000000000000001065f2a2d29a997343765f239c99a018490eced40ac42fc93217dfe20d8b43ee2215f65166aff483b3dc042c5a43b196000000000000000000000000000000000766e4c66f4a442ff1f61a7a4d197d2b47dd226d0e7822a9b065108cfc643cd3f3d5ae59ed2ce4cde13fd9260bb5b7cc0000000000000000000000000000000012251cc6abbabeb7bbe1fdd63eaee10832a748fff24f7e3fdccaea87facb6e99f2e0407a38f27f90450a471b873104620000000000000000000000000000000011181e08c8fba91271adfee9d31681f8412ab7a3f754f7ba4709024c0ad2287e32dd455d71a296b4838072a8ab9d96f2000000000000000000000000000000001252a4ac3529f8b2b6e8189b95a60b8865f07f9a9b73f98d5df708511d3f68632c4c7d1e2b03e6b1d1e2c01839752ada0000000000000000000000000000000002a1bc189e36902d1a49b9965eca3cb818ab5c26dffca63ca9af032870f7bbc615ac65f21bed27bd77dd65f2e90f53580000000000000000000000000000000005a7445f55add1ed5c143424ceef3d594280e316c9441a8e68c3ad97377141d015bf878bdfcf0df9fbcd0529f4e8100800000000000000000000000000000000192b52ba08ed509fc84d5775a7182498fd1ff80941d673c53470c9c9f1192f9c0057d68a1dfee0c68fe5df3625cc43bf000000000000000000000000000000000d3fcaf2f727e0eb32c65da9b910dc681b948dda874d0db6f6ed3f063430fbf073385a9a14c2dd78568726124e2b3ea8000000000000000000000000000000001943ce22cdb2387bd5796950dc95d1ace4012ab9bb4afb46223760230c1709e075f1ae76d6b3f2e947ba6b16d458ccd1000000000000000000000000000000001271205227c7aa27f45f20b3ba380dfea8b51efae91fd32e552774c99e2a1237aa59c0c43f52aad99bba3783ea2f36a4000000000000000000000000000000001407ffc2c1a2fe3b00d1f91e1f4febcda31004f7c301075c9031c55dd3dfa8104b156a6a3b7017fccd27f81c2af222ef000000000000000000000000000000000a29e38da2d42fd4712052800c7c8dd6e94fd9f506e946068aaac799d60b94c2d7515769ffdd32ea95d3910330ec47de000000000000000000000000000000000c60dae92451206390e30b5daa7151d63624dee496753c87dd54eadc92dc9602081fae02a1a53bac97e984a571923a5d00000000000000000000000000000000085f4fda4c72328895f20c683cb49603a37ff2c43d62f66602506dad5b8d1daebfbac7a7db3f50ccf4dfff277deb105c0000000000000000000000000000000005674d005457e0fe1f0fd978d63996c5f3d29f9149ee4eb04c464742dd329ccaef5e5f6b896d986ddfc9f1b2a3aec13100000000000000000000000000000000071bc66d6e2d244afc4a5ce4da1dce3d0c22c303ba61310fdf57843bbd97763ef496833dfa99d14be084bb1a039bb2da0000000000000000000000000000000012c22e047b0af8e2f4bf3bd3633ef0f8264004ca8ea5677a468857a1762f815235a479e53f4ad4741ffda3fb855021c900000000000000000000000000000000024aa2b2f08f0a91260805272dc51051c6e47ad4fa403b02b4510b647ae3d1770bac0326a805bbefd48056c8c121bdb80000000000000000000000000000000013e02b6052719f607dacd3a088274f65596bd0d09920b61ab5da61bbdc7f5049334cf11213945d57e5ac7d055d042b7e000000000000000000000000000000000ce5d527727d6e118cc9cdc6da2e351aadfd9baa8cbdd3a76d429a695160d12c923ac9cc3baca289e193548608b82801000000000000000000000000000000000606c4a02ea734cc32acd2b02bc28b99cb3e287e85a763af267492ab572e99ab3f370d275cec1da1aaa9075ff05f79be', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'bls_pairing_10pairchecksfalse', + Gas: 495000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000012196c5a43d69224d8713389285f26b98f86ee910ab3dd668e413738282003cc5b7357af9a7af54bb713d62255e80f560000000000000000000000000000000006ba8102bfbeea4416b710c73e8cce3032c31c6269c44906f8ac4f7874ce99fb17559992486528963884ce429a992fee0000000000000000000000000000000017c9fcf0504e62d3553b2f089b64574150aa5117bd3d2e89a8c1ed59bb7f70fb83215975ef31976e757abf60a75a1d9f0000000000000000000000000000000008f5a53d704298fe0cfc955e020442874fe87d5c729c7126abbdcbed355eef6c8f07277bee6d49d56c4ebaf334848624000000000000000000000000000000001302dcc50c6ce4c28086f8e1b43f9f65543cf598be440123816765ab6bc93f62bceda80045fbcad8598d4f32d03ee8fa000000000000000000000000000000000bbb4eb37628d60b035a3e0c45c0ea8c4abef5a6ddc5625e0560097ef9caab208221062e81cd77ef72162923a1906a40', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_0', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000117dbe419018f67844f6a5e1b78a1e597283ad7b8ee7ac5e58846f5a5fd68d0da99ce235a91db3ec1cf340fe6b7afcdb0000000000000000000000000000000013316f23de032d25e912ae8dc9b54c8dba1be7cecdbb9d2228d7e8f652011d46be79089dd0a6080a73c82256ce5e4ed200000000000000000000000000000000192fa5d8732ff9f38e0b1cf12eadfd2608f0c7a39aced7746837833ae253bb57ef9c0d98a4b69eeb2950901917e99d1e0000000000000000000000000000000009aeb10c372b5ef1010675c6a4762fda33636489c23b581c75220589afbc0cc46249f921eea02dd1b761e036ffdbae220000000000000000000000000000000002d225447600d49f932b9dd3ca1e6959697aa603e74d8666681a2dca8160c3857668ae074440366619eb8920256c4e4a00000000000000000000000000000000174882cdd3551e0ce6178861ff83e195fecbcffd53a67b6f10b4431e423e28a480327febe70276036f60bb9c99cf7633', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_1', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000008ab7b556c672db7883ec47efa6d98bb08cec7902ebb421aac1c31506b177ac444ffa2d9b400a6f1cbdc6240c607ee110000000000000000000000000000000016b7fa9adf4addc2192271ce7ad3c8d8f902d061c43b7d2e8e26922009b777855bffabe7ed1a09155819eabfa87f276f000000000000000000000000000000000a69d6d9f79e19b38e6bf5a245dc820bddbdfe038d50932f76d0e4629d759f8ca6d573fcfc39256305daedf452f9fdf40000000000000000000000000000000015f5949369e58487afcecf8018775d1b0a73e913bf77e13d2e5a843bbbeba7d1978ca27ae8bfc87d30f567dd396b980e00000000000000000000000000000000182198bb38a0353b8db25389e56ab0d8679a1bda008a65dad77e4c95bc6804f6311eb16c761e1a5e2a5f87cfada49fa4000000000000000000000000000000000eb5483959e98c30e71db52615f63521378b156f142d46f3bb285b94aef39d80feacec335b797c5a68dc17ba89d43e0f', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_2', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000015ff9a232d9b5a8020a85d5fe08a1dcfb73ece434258fe0e2fddf10ddef0906c42dcb5f5d62fc97f934ba900f17beb330000000000000000000000000000000009cfe4ee2241d9413c616462d7bac035a6766aeaab69c81e094d75b840df45d7e0dfac0265608b93efefb9a8728b98e4000000000000000000000000000000000286f09f931c07507ba4aafb7d43befe0b1d25b27ecc9199b19a9dc20bc7ec0329479ef224e00dece67ec0d61f1ca5ae0000000000000000000000000000000014e6ed154b5552be5c463b730b2134f83e0071dcdadfaa68e6c7c7f6e17dabb7daf06e409177bc4b38cfdb8248157618000000000000000000000000000000000f145e998dc6eb0c2b2be87db62949c7bfa63e8b01c8634248010fd623cfaec5d6c6c193331440957d333bf0c988b7b10000000000000000000000000000000002a1ab3eea343cfdea5779f64b3bddbf0769aded60e54a7507338f044310ba239430663394f110e560594d6042a99f1c', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_3', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017a17b82e3bfadf3250210d8ef572c02c3610d65ab4d7366e0b748768a28ee6a1b51f77ed686a64f087f36f641e7dca900000000000000000000000000000000077ea73d233ccea51dc4d5acecf6d9332bf17ae51598f4b394a5f62fb387e9c9aa1d6823b64a074f5873422ca57545d3000000000000000000000000000000000d1007ca90451229d3780d66d3aed7c9d8fc82e9d45549e8586600e38eb6763f3c466e2f6ba6ba1dafd8f00cc452dda20000000000000000000000000000000001d017d920a262b6d6597bab532f83270f41526409510e80278d1c3595ceabb9ceba8ae32b1817297ff78ea7a0d252e8000000000000000000000000000000000935b7a59d2e51bbb2f9b54ccb06ebee9d189fa82f0e97d10c8020badb3de7fe15731b5895faed8cad92ae76e2e1b649000000000000000000000000000000000792dadd48a20040ad43facedc109747411895180813349d41d0e5b389176bfb15895d41665be8d1afa80835ef818eca', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_4', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000c1243478f4fbdc21ea9b241655947a28accd058d0cdb4f9f0576d32f09dddaf0850464550ff07cab5927b3e4c863ce90000000000000000000000000000000015fb54db10ffac0b6cd374eb7168a8cb3df0a7d5f872d8e98c1f623deb66df5dd08ff4c3658f2905ec8bd02598bd4f9000000000000000000000000000000000095353ad699b89ac82ca7ef631775b2b3a6e3ed8dd320440cdb929baa428e63cb902a83857cc0e2621470544c69e84aa000000000000000000000000000000000892559ade1060b0eef2cbc1c74de62a7ff076a3621e5f0f159672a549f1201f2ffb3ac12c8b12cb86ae3e386c33e219000000000000000000000000000000000750df4632a7126ddb08658a4001f949b9764d9cc43a9393cc55d8fdbb15d4a1186dd87a6433d111888a7804540ad9fc0000000000000000000000000000000017554bd444665df044b91b0b2614017bbfcd7acc7f8c5a16cea2861235578ce2b27dcced9fba234999fa478cd3f6e42d', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_5', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000328f09584b6d6c98a709fc22e184123994613aca95a28ac53df8523b92273eb6f4e2d9b2a7dcebb474604d54a210719000000000000000000000000000000001220ebde579911fe2e707446aaad8d3789fae96ae2e23670a4fd856ed82daaab704779eb4224027c1ed9460f39951a1b00000000000000000000000000000000175dadb6ee656ec6aebf8d0e5edaee3f119c74e0ea64e374be9e8ab9fd3d085fceeedf4ed8de676ebe9065d83b0542ad0000000000000000000000000000000005cd6a875329c23e4918976cf997e93e403957acfc999f8159a630d21ab6f1762925c063784237262bedc82402ad81bb0000000000000000000000000000000003274bcb8db35e50164d136c2a98b5a6d2fb5f9767d0ee11c1358bf7ca5ed96d9122f8c1051ba3c658cc89777d03dfa5000000000000000000000000000000000380a240443dff85b6542f75db28b87c39e278cdb8d9627efbbc63b229e6ce783f6fb0114c8e91c2fd6ea71c95bb99a4', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_6', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000002ebfa98aa92c32a29ebe17fcb1819ba82e686abd9371fcee8ea793b4c72b6464085044f818f1f5902396df0122830cb00000000000000000000000000000000001184715b8432ed190b459113977289a890f68f6085ea111466af15103c9c02467da33e01d6bff87fd57db6ccba442a000000000000000000000000000000000834cf1b4149d100c41b1bca0495e455002eb6596bddcb94ae48d0c65957e8b313372f8e0d6e57504664b266f38293150000000000000000000000000000000000de2875fbd14760bac4c2cc7d3f239177efe9f7f61f767be420d44f24c9fb863efd60dcd732986db8c5b72470617ea60000000000000000000000000000000000bc9535ebf11c2dcc8c7d3bcd09d7d14035635fccb5fddb7df29ce8855e79f99809781d6ffbbcb33d1227314609abee00000000000000000000000000000000039bbfb4d969d702255e3be7f255a97529a19687ce38cb70637c37894d4102591feef428b0afe8c9ef50310ae3b83091', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_7', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000009d6424e002439998e91cd509f85751ad25e574830c564e7568347d19e3f38add0cab067c0b4b0801785a78bcbeaf246000000000000000000000000000000000ef6d7db03ee654503b46ff0dbc3297536a422e963bda9871a8da8f4eeb98dedebd6071c4880b4636198f4c2375dc795000000000000000000000000000000000fc09c241899fa6e8cc3b31830e9c9f2777d2bc6758260c9f6af5fce56c9dc1a8daedb5bcb7d7669005ccf6bfacf71050000000000000000000000000000000018e95921a76bc37308e2f10afb36a812b622afe19c8db84465ab8b3293c7d371948ee0578dbb025eed7ed60686109aa0000000000000000000000000000000001558cdfbac6ea2c4c1f4b9a2e809b19e9f4ba47b78d2b18185ed8c97c2f9c2990beadc78b85c123b4c3c08d5c5b3bbef000000000000000000000000000000000ea4dfdd12b9a4b9a3172671a6eafed7508af296813ec5700b697d9239ae484bcf7ab630e5b6830d6d95675be5174bb2', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_8', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000002d1cdb93191d1f9f0308c2c55d0208a071f5520faca7c52ab0311dbc9ba563bd33b5dd6baa77bf45ac2c3269e945f4800000000000000000000000000000000072a52106e6d7b92c594c4dacd20ef5fab7141e45c231457cd7e71463b2254ee6e72689e516fa6a8f29f2a173ce0a1900000000000000000000000000000000000b36d8fb9bd156f618ab8049d41dfe0698218764c0abb10e12fae43c8810b8e2a5201364e2778f6f433b199bb8f9a6800000000000000000000000000000000000707eb15411b63722b4308c0ed4288320078d2463ae659ad4fb3f9ef8124f379df92d64e077403e50727388adb59ac00000000000000000000000000000000158e1249d5b91614924acb23899c6bae408697dec0982c10d0459746499f4e6739afb9d5129568106ed1a1caefeaa9640000000000000000000000000000000019e841562e4aa75321143f8ce1e5ec6158fa5cb8b98c839a486188260c18ee8a7600930f23aa39eac2eb520d6a0fba90', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_9', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000000641642f6801d39a09a536f506056f72a619c50d043673d6d39aa4af11d8e3ded38b9c3bbc970dbc1bd55d68f94b50d0000000000000000000000000000000009ab050de356a24aea90007c6b319614ba2f2ed67223b972767117769e3c8e31ee4056494628fb2892d3d37afb6ac94300000000000000000000000000000000186a9661d6fb539e8687ac214301b2d7623caedd76f4055089befba6ef2c96263d810921ad7783d229f82783c9def424000000000000000000000000000000000447f3e20caa1f99fbaccab7bde2bd37fe77cea691ebf2b9499f95bbbb77afe72b7039eb0c05970b61360fcf8ade73730000000000000000000000000000000005e11f828eda86c10a1d7929def547ac06885da278afae59c5d95453caf0a2d8ed186fa7c6d0a7ab6e9142cfa4b338190000000000000000000000000000000003d954e61b6ab71042b19e804efccd4956b56662f27f70a9255cec0c464b86c0e83721ad3785dec62dd4a9dd3d6d5d53', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_10', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000fd4893addbd58fb1bf30b8e62bef068da386edbab9541d198e8719b2de5beb9223d87387af82e8b55bd521ff3e47e2d000000000000000000000000000000000f3a923b76473d5b5a53501790cb02597bb778bdacb3805a9002b152d22241ad131d0f0d6a260739cbab2c2fe602870e0000000000000000000000000000000002b94534aa0ba923bda34cbe92b3cd7a3e263741b120240ff5bdb8b718f094d3867e3fcabeab4a7be39c8f8c4fdd10d900000000000000000000000000000000048711cf6a82534d64d072355cb8fe647808e7e8b2d9ac9ed52eb7fe121647a721dd1234c71ecd163d91701eb7331cac00000000000000000000000000000000141ef2e23a1ecc7ef2ed3ea915492e79cfffe60b5e0de8441e878bd0653843d79c724e3c5ebe2321361df99f8932ddc200000000000000000000000000000000085513b4009f29b3e00a91c2c4be418368560802ba4194cbd2f4fa3d72a55fcae547014434514a8b2a8fe3e0b28d2773', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_11', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000002cb4b24c8aa799fd7cb1e4ab1aab1372113200343d8526ea7bc64dfaf926baf5d90756a40e35617854a2079cd07fba40000000000000000000000000000000003327ca22bd64ebd673cc6d5b02b2a8804d5353c9d251637c4273ad08d581cc0d58da9bea27c37a0b3f4961dbafd276b0000000000000000000000000000000009143507a24313ee33401955fc46562c9b20c9917df3b40ccbd7ed43b1349d4551cfd98a4976d6fec5fc289460c8d89900000000000000000000000000000000060566b79df5cc975e669da8ca3a7fa91bf3f5c9fb871c3d62f4a3e79dbc341b89d38b588e5414bc385d5e3cbf3ab9310000000000000000000000000000000016bf40b8cc4c01a87aafae0c4439b623a51ba9a383756a550b69d627d6f45209f0d87e4f9be9edff35c986f7b9c49e3f000000000000000000000000000000001842d9172bce51a164fbdbdb108d0faae07e4642f21c80e40ac31e737657472ae3dfe552b65349629c210a068c4afc0e', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_12', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024ad70f2b2105ca37112858e84c6f5e3ffd4a8b064522faae1ecba38fabd52a6274cb46b00075deb87472f11f2e67d90000000000000000000000000000000010a502c8b2a68aa30d2cb719273550b9a3c283c35b2e18a01b0b765344ffaaa5cb30a1e3e6ecd3a53ab67658a5787681000000000000000000000000000000000ab19bbddd661e9db8fe4cb307ecebdc5e03efbb95c5b44716c7075bd60efcfc67de0bfd7c46ad989a613946c90a4c1000000000000000000000000000000000120800e7f344cda816299fa37f603ade06beb3b10907f5af896d6b4e42f7f865b756f14164db84411c56cb2ea81f60be000000000000000000000000000000000f688ddd257e66362af1437b6922d3397a7c3dd6dea6bca8ebd6375e75bf2de40bc287cbf3434388191e56b92949c83b0000000000000000000000000000000005252465784aff8c1c707da58b5808c69583bf852d68f96912bc53f8dae4536b09ccbbd25a49d9e744118992b92b6792', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_13', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000000704cc57c8e0944326ddc7c747d9e7347a7f6918977132eea269f161461eb64066f773352f293a3ac458dc3ccd5026a000000000000000000000000000000001099d3c2bb2d082f2fdcbed013f7ac69e8624f4fcf6dfab3ee9dcf7fbbdb8c49ee79de40e887c0b6828d2496e3a6f768000000000000000000000000000000000e3165efe00f69aee84ac56d2161f07c017abfaadeaad34f8c96799d68bae0e6f9b557bbf9137e7826f49f29c58d1ef9000000000000000000000000000000000de0dce7ea371ad60f21f2cb61cb582b5072408a7efc91edf05b36a1a3b58fd9e6cf808d75157eedccc8f1c93a8ae07d0000000000000000000000000000000016d911943d80427385ebac1d1b293914a9e4dd9db06c1d6a758192d63c8fc9368e02eae7fb0e3a7859408f215cfa76ca0000000000000000000000000000000007bfdc6afb8acec625e50ecbc08a5cdb7862b795866323679885ba5cba3fd51f181078e03fe35e96e6383c077eed1bf5', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_14', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000130535a29392c77f045ac90e47f2e7b3cffff94494fe605aad345b41043f6663ada8e2e7ecd3d06f3b8854ef92212f42000000000000000000000000000000001699a3cc1f10cd2ed0dc68eb916b4402e4f12bf4746893bf70e26e209e605ea89e3d53e7ac52bd07713d3c8fc671931d000000000000000000000000000000000a68dccbe3452731f075580fe6102b8ee5265007ee19c56d95bcb096a3a6ac444f4145b980f41afcb0a865853b279bc600000000000000000000000000000000164767ea55a9038ac2dd254d8c8a4970dba93dacdf5416aecaa407914719cab165e7a32784b2c41652a86358737d831f000000000000000000000000000000000da9441fbc6578c85fdeca49082c9ebbf183de894d67c65158380ee56132d3cdb44b100d72b6d3b82688defb75d2aa390000000000000000000000000000000017d570e4f6e46550679d5d12c347414da207060f594620e2f8db66df8e0b06c912290b207a268e782d4b45db19a199db', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_15', + Gas: 108000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd80000000000000000000000000000000000874389c02d4cf1c61bc54c4c24def11dfbe7880bc998a95e70063009451ee8226fec4b278aade3a7cea55659459f1d500000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e000000000000000000000000000000001830f52d9bff64a623c6f5259e2cd2c2a08ea17a8797aaf83174ea1e8c3bd3955c2af1d39bfa474815bfe60714b7cd8000000000000000000000000000000000118cd94e36ab177de95f52f180fdbdc584b8d30436eb882980306fa0625f07a1f7ad3b4c38a921c53d14aa9a6ba5b8d600000000000000000000000000000000197737f831d4dc7e708475f4ca7ca15284db2f3751fcaac0c17f517f1ddab35e1a37907d7b99b39d6c8d9001cd50e79e000000000000000000000000000000000af1a3f6396f0c983e7c2d42d489a3ae5a3ff0a553d93154f73ac770cd0af7467aa0cef79f10bbd34621b3ec9583a834000000000000000000000000000000001918cb6e448ed69fb906145de3f11455ee0359d030e90d673ce050a360d796de33ccd6a941c49a1414aca1c26f9e699e0000000000000000000000000000000019a915154a13249d784093facc44520e7f3a18410ab2a3093e0b12657788e9419eec25729944f7945e732104939e7a9e', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_16', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000043c4ff154778330b4d5457b7811b551dbbf9701b402230411c527282fb5d2ba12cb445709718d5999e79fdd74c0a67000000000000000000000000000000000013a80ede40df002b72f6b33b1f0e3862d505efbe0721dce495d18920d542c98cdd2daf5164dbd1a2fee917ba943debe0000000000000000000000000000000001c2d8d353d5983f22a5313ddd58fdc0d9c994b2915dbc87a9b65b7b98ff00b62e140a27dc322d42b3ad190c1b3728dd0000000000000000000000000000000010412f3625947b38bb380a6ed059f1677b7a7afcb91517837c563dadd0e285b95740a200ddff6570d4d92bb636b625bb0000000000000000000000000000000015f4f9a480a57bd1b2388532ab045a1ba93d2f6589a3022c585fe06a1d611165c99d70be06251812405c9c37d6e9f7730000000000000000000000000000000001a78e6c5062a6634a56e9853ff5afacb2e7cf31fd0ea5f0d8c8ac6174c88133cf2f63450ec4590544c9a0e37daac1f900000000000000000000000000000000043c4ff154778330b4d5457b7811b551dbbf9701b402230411c527282fb5d2ba12cb445709718d5999e79fdd74c0a6700000000000000000000000000000000018c690fc5571f69793ec3c82915ac9513726ec891312f4f11dd3ba0ee95cc98b50d925099b0642e58a106e8456bbcbed0000000000000000000000000000000001c2d8d353d5983f22a5313ddd58fdc0d9c994b2915dbc87a9b65b7b98ff00b62e140a27dc322d42b3ad190c1b3728dd0000000000000000000000000000000010412f3625947b38bb380a6ed059f1677b7a7afcb91517837c563dadd0e285b95740a200ddff6570d4d92bb636b625bb0000000000000000000000000000000015f4f9a480a57bd1b2388532ab045a1ba93d2f6589a3022c585fe06a1d611165c99d70be06251812405c9c37d6e9f7730000000000000000000000000000000001a78e6c5062a6634a56e9853ff5afacb2e7cf31fd0ea5f0d8c8ac6174c88133cf2f63450ec4590544c9a0e37daac1f9', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_17', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000009f9a78a70b9973c43182ba54bb6e363c6984d5f7920c1d347c5ff82e6093e73f4fb5e3cd985c9ddf9af936b16200e880000000000000000000000000000000008d7489c2d78f17b2b9b1d535f21588d8761b8fb323b08fa9af8a60f39b26e98af76aa883522f21e083c8a14c2e7edb6000000000000000000000000000000000818e567aea83eaf3142984bb736b443743659626c407987b604a30c79756081fa6ae6beeb2e6c652dbfe9cf62d44e3900000000000000000000000000000000193f0317305fde1046acda2c9491e376aa67244f68ef6495845d049e1293082af91f880be935d9d8ad0e25ad918caae200000000000000000000000000000000109224b8178be58ea4e4a194ca66bef9d14f6fc2c625d25feaa4f32e0f4d72d91024d96839bc96e6a624c5ad6221bd94000000000000000000000000000000000e42decf8a987efaeb4ede37236b637e61249bf6245679be7fd4d633e2d814ed4748b73890ad3c4fcbcfb4960cb67ae70000000000000000000000000000000009f9a78a70b9973c43182ba54bb6e363c6984d5f7920c1d347c5ff82e6093e73f4fb5e3cd985c9ddf9af936b16200e88000000000000000000000000000000001129c94e0c06f51f1f808a62e42a5449dd159289c14a09c4cc382c91bcfe878b6f3555767c310de1b1c275eb3d17bcf5000000000000000000000000000000000818e567aea83eaf3142984bb736b443743659626c407987b604a30c79756081fa6ae6beeb2e6c652dbfe9cf62d44e3900000000000000000000000000000000193f0317305fde1046acda2c9491e376aa67244f68ef6495845d049e1293082af91f880be935d9d8ad0e25ad918caae200000000000000000000000000000000109224b8178be58ea4e4a194ca66bef9d14f6fc2c625d25feaa4f32e0f4d72d91024d96839bc96e6a624c5ad6221bd94000000000000000000000000000000000e42decf8a987efaeb4ede37236b637e61249bf6245679be7fd4d633e2d814ed4748b73890ad3c4fcbcfb4960cb67ae7', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_18', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000010fcfe8af8403a52400bf79e1bd0058f66b9cab583afe554aa1d82a3e794fffad5f0e19d385263b2dd9ef69d1154f10a000000000000000000000000000000000aba6a0b58b49f7c6c2802afd2a5ed1320bf062c7b93135f3c0ed7a1d7b1ee27b2b986cde732a60fa585ca6ab7cc154b000000000000000000000000000000000ca0d865f8c8ce0a476f7a6edb3ce4bd5e6c3a8d905d8fb5a10e66542f4325a9963c2f8d96f804f4d295f8993b5204df0000000000000000000000000000000005a966f6254f0ef4f93f082a97abe07db56f00c2ade047d2f0027edef6f00a0dfecaa24d50faa778fa29087302211f7e00000000000000000000000000000000121c51da366557c09af1bbd927521da88dfab3e2e9a95b6effb0a968795486f281f0c887e37f51837557b9e3808987130000000000000000000000000000000001a5524975400b1e88f3fff8dd34dadf5d75564cfc0026df31ee9c2c1d48b0f69a48e1e4a48cc4b7db61f023a79157800000000000000000000000000000000010fcfe8af8403a52400bf79e1bd0058f66b9cab583afe554aa1d82a3e794fffad5f0e19d385263b2dd9ef69d1154f10a000000000000000000000000000000000f46a7dee0cb471ddef3a50670a5bfc443b8455877f1ff602b21faff1eff07fc6bf27930ca2159f01479359548339560000000000000000000000000000000000ca0d865f8c8ce0a476f7a6edb3ce4bd5e6c3a8d905d8fb5a10e66542f4325a9963c2f8d96f804f4d295f8993b5204df0000000000000000000000000000000005a966f6254f0ef4f93f082a97abe07db56f00c2ade047d2f0027edef6f00a0dfecaa24d50faa778fa29087302211f7e00000000000000000000000000000000121c51da366557c09af1bbd927521da88dfab3e2e9a95b6effb0a968795486f281f0c887e37f51837557b9e3808987130000000000000000000000000000000001a5524975400b1e88f3fff8dd34dadf5d75564cfc0026df31ee9c2c1d48b0f69a48e1e4a48cc4b7db61f023a7915780', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_19', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000013c5ebfb853f0c8741f12057b6b845c4cdbf72aecbeafc8f5b5978f186eead8685f2f3f125e536c465ade1a00f212b0900000000000000000000000000000000082543b58a13354d0cce5dc3fb1d91d1de6d5927290b2ff51e4e48f40cdf2d490730843b53a92865140153888d73d4af0000000000000000000000000000000002b51851ef3b44481d13f42e5111fa4fec04be0bf6acc7e59dec3a8c8113e5bb7b604c6dbdc5e8eddc2a1ffb81bc2baf0000000000000000000000000000000018ddb483ae75402852b7f285277ff7308ff78a3364cca8b0e0e1fa9182de275fd55c1e8ec3dbde180379c4280787ba8000000000000000000000000000000000170539890c89a4f91acd59efd413b5d1059f0c8fd8718e8f722e865dd106a4eb02e6fb0cd71b34ebc4b94375b52e4dd60000000000000000000000000000000001c2e9392f5d4b75efc5ff10fe97f37e2671cad7e4710765866e92aec99b0130e6ff1314502d069fb7b5f86bfce4300e0000000000000000000000000000000013c5ebfb853f0c8741f12057b6b845c4cdbf72aecbeafc8f5b5978f186eead8685f2f3f125e536c465ade1a00f212b090000000000000000000000000000000011dbce34af6cb14d3e4d49f2482e1b058609f25dca79e2ca48e289ace9d1c8db177b7bc35daad79aa5fdac77728bd5fc0000000000000000000000000000000002b51851ef3b44481d13f42e5111fa4fec04be0bf6acc7e59dec3a8c8113e5bb7b604c6dbdc5e8eddc2a1ffb81bc2baf0000000000000000000000000000000018ddb483ae75402852b7f285277ff7308ff78a3364cca8b0e0e1fa9182de275fd55c1e8ec3dbde180379c4280787ba8000000000000000000000000000000000170539890c89a4f91acd59efd413b5d1059f0c8fd8718e8f722e865dd106a4eb02e6fb0cd71b34ebc4b94375b52e4dd60000000000000000000000000000000001c2e9392f5d4b75efc5ff10fe97f37e2671cad7e4710765866e92aec99b0130e6ff1314502d069fb7b5f86bfce4300e', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_20', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000053a12f6a1cb64272c34e042b7922fabe879275b837ba3b116adfe1eb2a6dc1c1fa6df40c779a7cdb8ed8689b8bc5ba800000000000000000000000000000000097ec91c728ae2d290489909bbee1a30048a7fa90bcfd96fe1d9297545867cbfee0939f20f1791329460a4fe1ac719290000000000000000000000000000000011bbc566a10eadf16009c1d2655cfae6adfb0f56f5e55b31dc000414be1b4cee9a0b9f7d9eab4c6829037c327914d5640000000000000000000000000000000009b28329096d8644dfcba6e92477eafff29f7477da4581ce76d1493f03034d7f5d3acaadbe42c76a83ca51db79d456d10000000000000000000000000000000019f75a303fdede5d97f3e521b03ef6b9d7c008d770b59ce3ac38900b340895e008342701ad1b41830b9c010936f4ff1700000000000000000000000000000000161aa1853edbb56fa3bd685c9c6b88e466dfa3c4f194f6774b4d9b1f30b016993bd0d65e8e9d6dea6caa196ff735bd6700000000000000000000000000000000053a12f6a1cb64272c34e042b7922fabe879275b837ba3b116adfe1eb2a6dc1c1fa6df40c779a7cdb8ed8689b8bc5ba800000000000000000000000000000000108248cdc6f503c7bad30eac875d92a75feccbdbe7b5394f8557a92bb12a796430a2c60ca23c6ecd259e5b01e53891820000000000000000000000000000000011bbc566a10eadf16009c1d2655cfae6adfb0f56f5e55b31dc000414be1b4cee9a0b9f7d9eab4c6829037c327914d5640000000000000000000000000000000009b28329096d8644dfcba6e92477eafff29f7477da4581ce76d1493f03034d7f5d3acaadbe42c76a83ca51db79d456d10000000000000000000000000000000019f75a303fdede5d97f3e521b03ef6b9d7c008d770b59ce3ac38900b340895e008342701ad1b41830b9c010936f4ff1700000000000000000000000000000000161aa1853edbb56fa3bd685c9c6b88e466dfa3c4f194f6774b4d9b1f30b016993bd0d65e8e9d6dea6caa196ff735bd67', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_21', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001354dd8a230fde7c983dcf06fa9ac075b3ab8f56cdd9f15bf870afce2ae6e7c65ba91a1df6255b6f640bb51d7fed302500000000000000000000000000000000130f139ca118869de846d1d938521647b7d27a95b127bbc53578c7b66d88d541adb525e7028a147bf332607bd760deac000000000000000000000000000000000ae7289aa9bf20c4a9c807f2b3ac32f0db24e9a0a360c92e5ce4f8253f0e3e7853f771597c8141d705062bef12d4fea80000000000000000000000000000000001d2f610d79110f93145faad2e34f3408316b1dc3a72852e811b324577d9037035e24af25002ddd100cd9283b70ddcad0000000000000000000000000000000012947315d5c0ec670619125eed0de3dd259a008baee4379b82accf2391e70a2bdad264cda04c3bc1b5394a62559fa0ef000000000000000000000000000000001239e687c4d3417c3c9b655035f8d8a649c255f9a8e6f03b785eed0d416a1cd6ef7c8b45563acb4616af24f64dbccac4000000000000000000000000000000001354dd8a230fde7c983dcf06fa9ac075b3ab8f56cdd9f15bf870afce2ae6e7c65ba91a1df6255b6f640bb51d7fed30250000000000000000000000000000000006f1fe4d98675ffc62d4d5dd0af9968faca4d0ef425d56fa31b80aea892820e270f6da17aec9eb83c6cc9f84289ecbff000000000000000000000000000000000ae7289aa9bf20c4a9c807f2b3ac32f0db24e9a0a360c92e5ce4f8253f0e3e7853f771597c8141d705062bef12d4fea80000000000000000000000000000000001d2f610d79110f93145faad2e34f3408316b1dc3a72852e811b324577d9037035e24af25002ddd100cd9283b70ddcad0000000000000000000000000000000012947315d5c0ec670619125eed0de3dd259a008baee4379b82accf2391e70a2bdad264cda04c3bc1b5394a62559fa0ef000000000000000000000000000000001239e687c4d3417c3c9b655035f8d8a649c255f9a8e6f03b785eed0d416a1cd6ef7c8b45563acb4616af24f64dbccac4', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_22', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000003f76a6dc6da31a399b93f4431bfabb3e48d86745eaa4b24d6337305006e3c7fc7bfcc85c85e2f3514cd389fec4e70580000000000000000000000000000000010e4280374c532ed0df44ac0bac82572f839afcfb8b696eea617d5bd1261288dfa90a7190200687d470992fb4827ff32000000000000000000000000000000001179ee329771b5913d07818e70f6ce5a58d74ea0b573eaa1bd3d97e45d3eeb27fcc7d37dba127af7a38354cb6ff48f7c000000000000000000000000000000000c898abe6eb76ef99f5143cfb8d840a918bcc9096ce25caa45d0bf5d20814cb01b024f1fd2cbecb6bef65d9456070dd90000000000000000000000000000000008e2a4fd746e86f90484f9b9b7b47b6afe5833762e515ccb276c554f00df88dd9aa0fb792c5f419dda0465cfed838e7c0000000000000000000000000000000012b5e6f7070c0045ade96f548ed6428c5030fa20c6f6f37a42fde9dbb5cd01def0fd8585bf8aeef913e7d42b9ef22efa0000000000000000000000000000000003f76a6dc6da31a399b93f4431bfabb3e48d86745eaa4b24d6337305006e3c7fc7bfcc85c85e2f3514cd389fec4e705800000000000000000000000000000000091ce9e6c4bab3ad3d275cf5888387646c3d9bb53ace7bd0c118fce3e44fcd96241b58e5af53978272f56d04b7d7ab79000000000000000000000000000000001179ee329771b5913d07818e70f6ce5a58d74ea0b573eaa1bd3d97e45d3eeb27fcc7d37dba127af7a38354cb6ff48f7c000000000000000000000000000000000c898abe6eb76ef99f5143cfb8d840a918bcc9096ce25caa45d0bf5d20814cb01b024f1fd2cbecb6bef65d9456070dd90000000000000000000000000000000008e2a4fd746e86f90484f9b9b7b47b6afe5833762e515ccb276c554f00df88dd9aa0fb792c5f419dda0465cfed838e7c0000000000000000000000000000000012b5e6f7070c0045ade96f548ed6428c5030fa20c6f6f37a42fde9dbb5cd01def0fd8585bf8aeef913e7d42b9ef22efa', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_23', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000009439f061c7d5fada6e5431c77fd093222285c98449951f6a6c4c8f225b316144875bc764be5ca51c7895773a9f1a640000000000000000000000000000000000ebdef273e2288c784c061bef6a45cd49b0306ac1e9faab263c6ff73dea4627189c8f10a823253d86a8752769cc4f8f2000000000000000000000000000000000fe2e61bc8e9085d2b472a6791d4851762d6401fd3e7d3f3ba61620dc70b773f2102df1c9d6f1462144662fb2f15359700000000000000000000000000000000031f160cde626ca11f67613884a977fb5d3248d78ddbf23e50e52c3ba4090268c1f6cd8156fa41d848a482a0ca39eb04000000000000000000000000000000000eb61ba51124be7f3ee9be1488aa83cbd2333aa7e09ae67fef63c890534cb37ca7de3d16046b984e72db21e1f5c57a8a0000000000000000000000000000000006bf6f5d65aa7d19613141018ac8bf5d1e6fe494a9f30da215a2313a0241779006bce33a776aeedae5de5ea6ee5a9b9e0000000000000000000000000000000009439f061c7d5fada6e5431c77fd093222285c98449951f6a6c4c8f225b316144875bc764be5ca51c7895773a9f1a640000000000000000000000000000000000b4322c2fb5d5dd2c65b45f74ca75002c97444d8d4e5680d0369d32d180c93b294e30ef42f21ac274f77ad89633ab1b9000000000000000000000000000000000fe2e61bc8e9085d2b472a6791d4851762d6401fd3e7d3f3ba61620dc70b773f2102df1c9d6f1462144662fb2f15359700000000000000000000000000000000031f160cde626ca11f67613884a977fb5d3248d78ddbf23e50e52c3ba4090268c1f6cd8156fa41d848a482a0ca39eb04000000000000000000000000000000000eb61ba51124be7f3ee9be1488aa83cbd2333aa7e09ae67fef63c890534cb37ca7de3d16046b984e72db21e1f5c57a8a0000000000000000000000000000000006bf6f5d65aa7d19613141018ac8bf5d1e6fe494a9f30da215a2313a0241779006bce33a776aeedae5de5ea6ee5a9b9e', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_24', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001478ee0ffebf22708a6ab88855081daba5ee2f279b5a2ee5f5f8aec8f97649c8d5634fec3f8b28ad60981e6f29a091b10000000000000000000000000000000011efaeec0b1a4057b1e0053263afe40158790229c5bfb08062c90a252f59eca36085ab35e4cbc70483d29880c5c2f8c200000000000000000000000000000000196044a5cdbc5300ee837dca745a44379070e9297697f5db28df4a37307cc740abed45cc778a3f4e3b8c9890ab6c3c70000000000000000000000000000000001176f5de6a3577ad67863bd3d9152ab9e8184964c6ac276e95946788f5a76394047580077c0971d874a40d510eb0443e00000000000000000000000000000000147dd55dff69213c5760e8d22b700dd7a9c7c33c434a3be95bd5281b97b464fb934a3dff7c23f3e59c5d8d26faa426bf0000000000000000000000000000000019efcf03ddb0934b0f0dba3569809d5b48b863d50d3be4973b504244414e1e1db56adff51d33265ce102b320c552781f000000000000000000000000000000001478ee0ffebf22708a6ab88855081daba5ee2f279b5a2ee5f5f8aec8f97649c8d5634fec3f8b28ad60981e6f29a091b100000000000000000000000000000000081162fe2e65a642993ba283df9bc8d60bfe495b2dc5623f0467c87bc7570980be2654c8cc8838fb362c677f3a3cb1e900000000000000000000000000000000196044a5cdbc5300ee837dca745a44379070e9297697f5db28df4a37307cc740abed45cc778a3f4e3b8c9890ab6c3c70000000000000000000000000000000001176f5de6a3577ad67863bd3d9152ab9e8184964c6ac276e95946788f5a76394047580077c0971d874a40d510eb0443e00000000000000000000000000000000147dd55dff69213c5760e8d22b700dd7a9c7c33c434a3be95bd5281b97b464fb934a3dff7c23f3e59c5d8d26faa426bf0000000000000000000000000000000019efcf03ddb0934b0f0dba3569809d5b48b863d50d3be4973b504244414e1e1db56adff51d33265ce102b320c552781f', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_25', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000150d43c64cb1dbb7b981f455e90b740918e2d63453ca17d8eeecb68e662d2581f8aa1aea5b095cd8fc2a941d6e2728390000000000000000000000000000000006dc2ccb10213d3f6c3f10856888cb2bf6f1c7fcb2a17d6e63596c29281682cafd4c72696ecd6af3cce31c440144ebd10000000000000000000000000000000005d8edbabf37a47a539d84393bb2747d0a35a52b80a7c99616c910479306e204e5db1f0fa3fe69f35af3164c7e5726b50000000000000000000000000000000005015082d6975649fbc172035da04f8aeb6d0dd88fdfac3fbd68ec925dc199413ed670488dc6588f9bd34c4ff527f149000000000000000000000000000000001312d53088ca58dfc325772b8dc0e1b20cebf7b2d5b6b4c560759987b44060bf4a59a68d1a5623bbb3cc5b0bc3986b810000000000000000000000000000000012110cd462c6fabf04f67d652639d19640c46f51aadd6c4f9a6dd7806cffb6192d95c198f4c8284151feaa2e2a0dbc1f00000000000000000000000000000000150d43c64cb1dbb7b981f455e90b740918e2d63453ca17d8eeecb68e662d2581f8aa1aea5b095cd8fc2a941d6e272839000000000000000000000000000000001324e51f295ea95adedc9730dac2e1ab6d85838840e3955103d76677ce9a7359215f8d954286950bed1be3bbfebabeda0000000000000000000000000000000005d8edbabf37a47a539d84393bb2747d0a35a52b80a7c99616c910479306e204e5db1f0fa3fe69f35af3164c7e5726b50000000000000000000000000000000005015082d6975649fbc172035da04f8aeb6d0dd88fdfac3fbd68ec925dc199413ed670488dc6588f9bd34c4ff527f149000000000000000000000000000000001312d53088ca58dfc325772b8dc0e1b20cebf7b2d5b6b4c560759987b44060bf4a59a68d1a5623bbb3cc5b0bc3986b810000000000000000000000000000000012110cd462c6fabf04f67d652639d19640c46f51aadd6c4f9a6dd7806cffb6192d95c198f4c8284151feaa2e2a0dbc1f', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_26', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000f46bb86e827aa9c0c570d93f4d7d6986668c0099e4853927571199e1ce9e756d9db951f5b0325acafb2bf6e8fec2a1b0000000000000000000000000000000006d38cc6cc1a950a18e92e16287f201af4c014aba1a17929dd407d0440924ce5f08fad8fe0c50f7f733b285bf282acfc00000000000000000000000000000000117fd5016ddb779a6979d2bffe18032d9a5cdc5a6c7feeaa412381983d49ab894cb067f671163ccbe6225c3d85219db6000000000000000000000000000000000dcf01077dcce35c283bea662f4e4d16f871717eb78e630d9f95a200cc104fe67b0d69d95f6704d9812b46c92b1bc9de00000000000000000000000000000000121f212cd7251697ef6a7e3aa93eb0d7d0157cf1247d4411430c36c7277bf8acfccc4ed8590b5e8d0f760e0e4ed7e95a0000000000000000000000000000000007d22d78b486f575e01e21e1239cbedc4628ba7e01ecf4a3459bd78a9716e2969f26ea3f2449685f60397e1ab2aa7352000000000000000000000000000000000f46bb86e827aa9c0c570d93f4d7d6986668c0099e4853927571199e1ce9e756d9db951f5b0325acafb2bf6e8fec2a1b00000000000000000000000000000000132d85236d655190323279a01acc8cbc6fb736d951e3999589f0559cb61ea93e2e1c526ed08ef08046c3d7a40d7cfdaf00000000000000000000000000000000117fd5016ddb779a6979d2bffe18032d9a5cdc5a6c7feeaa412381983d49ab894cb067f671163ccbe6225c3d85219db6000000000000000000000000000000000dcf01077dcce35c283bea662f4e4d16f871717eb78e630d9f95a200cc104fe67b0d69d95f6704d9812b46c92b1bc9de00000000000000000000000000000000121f212cd7251697ef6a7e3aa93eb0d7d0157cf1247d4411430c36c7277bf8acfccc4ed8590b5e8d0f760e0e4ed7e95a0000000000000000000000000000000007d22d78b486f575e01e21e1239cbedc4628ba7e01ecf4a3459bd78a9716e2969f26ea3f2449685f60397e1ab2aa7352', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_27', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000010cde0dbf4e18009c94ba648477624bbfb3732481d21663dd13cea914d6c54ec060557010ebe333d5e4b266e1563c631000000000000000000000000000000000fb24d3d4063fd054cd5b7288498f107114ff323226aca58d3336444fc79c010db15094ceda6eb99770c168d459f0da0000000000000000000000000000000000224cbea61c5136987d8dbc8deafa78ae002255c031bb54335bcf99e56a57768aa127506fca1761e8b835e67e88bb4dd0000000000000000000000000000000018cbf072b544df760c051d394ff68ad2dd5a8c731377fa2a5f61e61481ad5b42645704a2d083c7d45ed4774e5448141e000000000000000000000000000000000740b8b7d7bce78a51809713656c94cf98de72887676050f65f74c57cbe574278dd3634c44e057ea95babcc3d230e3c40000000000000000000000000000000006696058a191c7012a4ee7c973c2005ac51af02a85cbb60e3164809a583b4431dda2b59e1c9ceeb652b3ac7021d116a60000000000000000000000000000000010cde0dbf4e18009c94ba648477624bbfb3732481d21663dd13cea914d6c54ec060557010ebe333d5e4b266e1563c631000000000000000000000000000000000a4ec4acf91be994fe45f08dbeb2bbd053275861d11a486693fd6e5bfa3736134396f6b1c3ad146642f2e972ba609d0b000000000000000000000000000000000224cbea61c5136987d8dbc8deafa78ae002255c031bb54335bcf99e56a57768aa127506fca1761e8b835e67e88bb4dd0000000000000000000000000000000018cbf072b544df760c051d394ff68ad2dd5a8c731377fa2a5f61e61481ad5b42645704a2d083c7d45ed4774e5448141e000000000000000000000000000000000740b8b7d7bce78a51809713656c94cf98de72887676050f65f74c57cbe574278dd3634c44e057ea95babcc3d230e3c40000000000000000000000000000000006696058a191c7012a4ee7c973c2005ac51af02a85cbb60e3164809a583b4431dda2b59e1c9ceeb652b3ac7021d116a6', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_28', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000008c0a4c543b7506e9718658902982b4ab7926cd90d4986eceb17b149d8f5122334903300ad419b90c2cb56dc6d2fe976000000000000000000000000000000000824e1631f054b666893784b1e7edb44b9a53596f718a6e5ba606dc1020cb6e269e9edf828de1768df0dd8ab8440e053000000000000000000000000000000001522e0a4ccd607f117fc6fc8f9abcd704e9850d96adb95d9bfaab210b76bfb2c5dc75163b922bd7a886541250bc1d8630000000000000000000000000000000018a6e4327d633108a292a51abed43e95230e951e4476dc385ceea9c72ed528bf3e06c42d10cefbd4aa75b134936e4747000000000000000000000000000000001198587188e793ad2ec2fa0fa1d0da9b61ed48444fe6722e523aeac270f17f73f56b1e726ab811bb54a6e42e506d70a20000000000000000000000000000000004bedd94182e0f16c71223ac3d68ab327d28ee0ccdcd2c2db07faf69e1babe3fbf3ba09c28b146eca7ab047b592947030000000000000000000000000000000008c0a4c543b7506e9718658902982b4ab7926cd90d4986eceb17b149d8f5122334903300ad419b90c2cb56dc6d2fe9760000000000000000000000000000000011dc30871a7a9b33e2882f6b24ccd192aad215edfc6c6bd9acd064dff4a43f41b4c212068875e896daf127547bbeca58000000000000000000000000000000001522e0a4ccd607f117fc6fc8f9abcd704e9850d96adb95d9bfaab210b76bfb2c5dc75163b922bd7a886541250bc1d8630000000000000000000000000000000018a6e4327d633108a292a51abed43e95230e951e4476dc385ceea9c72ed528bf3e06c42d10cefbd4aa75b134936e4747000000000000000000000000000000001198587188e793ad2ec2fa0fa1d0da9b61ed48444fe6722e523aeac270f17f73f56b1e726ab811bb54a6e42e506d70a20000000000000000000000000000000004bedd94182e0f16c71223ac3d68ab327d28ee0ccdcd2c2db07faf69e1babe3fbf3ba09c28b146eca7ab047b59294703', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_29', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000159d94fb0cf6f4e3e26bdeb536d1ee9c511a29d32944da43420e86c3b5818e0f482a7a8af72880d4825a50fee6bc8cd8000000000000000000000000000000000c2ffe6be05eccd9170b6c181966bb8c1c3ed10e763613112238cabb41370e2a5bb5fef967f4f8f2af944dbef09d265e00000000000000000000000000000000148b7dfc21521d79ff817c7a0305f1048851e283be13c07d5c04d28b571d48172838399ba539529e8d037ffd1f7295580000000000000000000000000000000003015abea326c15098f5205a8b2d3cd74d72dac59d60671ca6ef8c9c714ea61ffdacd46d1024b5b4f7e6b3b569fabaf20000000000000000000000000000000011f0c512fe7dc2dd8abdc1d22c2ecd2e7d1b84f8950ab90fc93bf54badf7bb9a9bad8c355d52a5efb110dca891e4cc3d0000000000000000000000000000000019774010814d1d94caf3ecda3ef4f5c5986e966eaf187c32a8a5a4a59452af0849690cf71338193f2d8435819160bcfb00000000000000000000000000000000159d94fb0cf6f4e3e26bdeb536d1ee9c511a29d32944da43420e86c3b5818e0f482a7a8af72880d4825a50fee6bc8cd8000000000000000000000000000000000dd1137e592119c134103b9e29e4f14b48387a767d4effae44f807e5b579e7f9c2f60105495f070d0a6ab2410f62844d00000000000000000000000000000000148b7dfc21521d79ff817c7a0305f1048851e283be13c07d5c04d28b571d48172838399ba539529e8d037ffd1f7295580000000000000000000000000000000003015abea326c15098f5205a8b2d3cd74d72dac59d60671ca6ef8c9c714ea61ffdacd46d1024b5b4f7e6b3b569fabaf20000000000000000000000000000000011f0c512fe7dc2dd8abdc1d22c2ecd2e7d1b84f8950ab90fc93bf54badf7bb9a9bad8c355d52a5efb110dca891e4cc3d0000000000000000000000000000000019774010814d1d94caf3ecda3ef4f5c5986e966eaf187c32a8a5a4a59452af0849690cf71338193f2d8435819160bcfb', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_30', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad6242000000000000000000000000000000000353d6521a17474856ad69582ce225f27d60f5a8319bea8cefded2c3f6b862d76fe633c77ed8ccdf99d2b10430253fc8000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c0533455013242330000000000000000000000000000000019c822a4d44ac22f6fbaef356c37ceff93c1d6933e8c8f3b55784cfe62e5705930be48607c3f7a4a2ca146945cad62420000000000000000000000000000000016ad3b981f689f51f46e3e5e166986e4e71655dcc1e928327751ffdcfff8934caec5cc37327b3320202c4efbcfda6ae3000000000000000000000000000000000805892f21889cab3cfe62226eaff6a8d3586d4396692b379efc7e90b0eaad4c9afbdf0f56b30f0c07ae0bc4013343b30000000000000000000000000000000007853f0e75c8dee034c2444299da58c98f22de367a90550dbc635fb52c9a8f61ccc100f70f10208944e48d09507fdce100000000000000000000000000000000064afd6b3ef7ff7ec34f1fa330877b42958a46a7698c6d21adf73bfdfcab7793b312e21e5988652e655f2d42edb8a673000000000000000000000000000000000ea8a2217c3dbcc0f6e562de9cb2f334c896577d0b3a7108d96b1aba2d705dbf531e870d4023cec2c053345501324233', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_31', + Gas: 151000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000d4441801d287ba8de0e2fb6b77f766dbff07b4027098ce463cab80e01eb31d9f5dbd7ac935703d68c7032fa5128ff170000000000000000000000000000000011798ea9c137acf6ef9483b489c0273d4f69296959922a352b079857953263372b8d339115f0576cfabedc185abf2086000000000000000000000000000000001498b1412f52b07a0e4f91cbf5e1852ea38fc111613523f1e61b97ebf1fd7fd2cdf36d7f73f1e33719c0b63d7bf66b8f0000000000000000000000000000000004c56d3ee9931f7582d7eebeb598d1be208e3b333ab976dc7bb271969fa1d6caf8f467eb7cbee4af5d30e5c66d00a4e2000000000000000000000000000000000de29857dae126c0acbe966da6f50342837ef5dd9994ad929d75814f6f33f77e5b33690945bf6e980031ddd90ebc76ce00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000cbcd06a1c576af16d0d77ff8bcc3669a486d044cc7b85db03661a92f4c5c44a28d028521dfcfc292d8ecd05aed6ab940000000000000000000000000000000011798ea9c137acf6ef9483b489c0273d4f69296959922a352b079857953263372b8d339115f0576cfabedc185abf2086000000000000000000000000000000001498b1412f52b07a0e4f91cbf5e1852ea38fc111613523f1e61b97ebf1fd7fd2cdf36d7f73f1e33719c0b63d7bf66b8f0000000000000000000000000000000004c56d3ee9931f7582d7eebeb598d1be208e3b333ab976dc7bb271969fa1d6caf8f467eb7cbee4af5d30e5c66d00a4e2000000000000000000000000000000000de29857dae126c0acbe966da6f50342837ef5dd9994ad929d75814f6f33f77e5b33690945bf6e980031ddd90ebc76ce00000000000000000000000000000000189bf269a72de2872706983835afcbd09f6f4dfcabe0241b4e9fe1965a250d230d6f793ab17ce7cac456af7be4376be6000000000000000000000000000000000d4441801d287ba8de0e2fb6b77f766dbff07b4027098ce463cab80e01eb31d9f5dbd7ac935703d68c7032fa5128ff170000000000000000000000000000000011798ea9c137acf6ef9483b489c0273d4f69296959922a352b079857953263372b8d339115f0576cfabedc185abf2086000000000000000000000000000000001498b1412f52b07a0e4f91cbf5e1852ea38fc111613523f1e61b97ebf1fd7fd2cdf36d7f73f1e33719c0b63d7bf66b8f00000000000000000000000000000000153ba4ab4fecc724c843b8f78db2db1943e91051b8cb9be2eb7e610a570f1f5925b7981334951b505cce1a3992ff05c9000000000000000000000000000000000c1e79925e9ebfd99e5d11489c56a994e0f855a759f0652cc9bb5151877cfea5c37896f56b949167b9cd2226f14333dd', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_32', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c8129292540000000000000000000000000000000013a3d49e58274c2b4a534b95b7071b6d2f42b17b887bf128627c0f8894c19d3d69c1a419373ca4bd1bb6d4efc78e1d3f000000000000000000000000000000001755d8a095e087ca66f8a118e0d2c7d5e4d8427dda8fe3049080f4aff12a8746f8c2679c310f4be0d94c5bef0414a7a600000000000000000000000000000000069c84c6419ed5c0441975ee8410065a56c65f07a4b545ff596b657dc4620c7405fd4d092b281e272773d2281a6359a8000000000000000000000000000000000e751ccbd475fe7eda1c62df626c1d37e8ae6853cc9b2109beef3e8c6f26d41a5e4e0a91bbc3371c7ab6ba780b5db41600000000000000000000000000000000184097644c9b44d543ebc0934825610590cc9f8b17ed08e9c06592bf85591d2702b18cf48a70b378926057e541eb8ac50000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c81292925400000000000000000000000000000000065d3d4be1589a6f00c85c208c44916a35349a096b09219704b4c31861ef58e6b4ea5be57a175b429e482b1038718d6c000000000000000000000000000000001755d8a095e087ca66f8a118e0d2c7d5e4d8427dda8fe3049080f4aff12a8746f8c2679c310f4be0d94c5bef0414a7a600000000000000000000000000000000069c84c6419ed5c0441975ee8410065a56c65f07a4b545ff596b657dc4620c7405fd4d092b281e272773d2281a6359a8000000000000000000000000000000000e751ccbd475fe7eda1c62df626c1d37e8ae6853cc9b2109beef3e8c6f26d41a5e4e0a91bbc3371c7ab6ba780b5db41600000000000000000000000000000000184097644c9b44d543ebc0934825610590cc9f8b17ed08e9c06592bf85591d2702b18cf48a70b378926057e541eb8ac50000000000000000000000000000000003299542a0c40efbb55d169a92ad11b4d6d7a6ed949cb0d6477803fbedcf74e4bd74de854c4c8b7f200c85c8129292540000000000000000000000000000000013a3d49e58274c2b4a534b95b7071b6d2f42b17b887bf128627c0f8894c19d3d69c1a419373ca4bd1bb6d4efc78e1d3f000000000000000000000000000000001755d8a095e087ca66f8a118e0d2c7d5e4d8427dda8fe3049080f4aff12a8746f8c2679c310f4be0d94c5bef0414a7a600000000000000000000000000000000069c84c6419ed5c0441975ee8410065a56c65f07a4b545ff596b657dc4620c7405fd4d092b281e272773d2281a6359a8000000000000000000000000000000000b8bf51e6509e81b70ff44d6e0df8f9f7bc8e33126e9f1b5a8419414878a2209c05df56cf590c8e33f484587f4a1f6950000000000000000000000000000000001c07a85ece4a1c5072fe722fb264bd1d3aaabf9db9809d5a6cb3fe17157d8fd1bfa730a26e34c87279ea81abe141fe6', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_33', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda0000000000000000000000000000000014a461f829e0a76ba89f42eb57dffb4f5544df2008163bd0ea1af824f7ff910b27418a0e4f86cb8046dc1f3139cab9af000000000000000000000000000000000213e5d2d46523203ae07f36fdeb6c304fb86f552fb9adb566711c31262629efb0b1561585f85d2ac7be174682229bd8000000000000000000000000000000000b3336b5a4f7c0d16db9615e77bcdd55b7cb5b5c1591d835f34f5c1f1468e3cef954608667fb97a32e4595f43b845612000000000000000000000000000000001869606dde1688e5ae9f1c466c5897fce7794f3735234b5af1ad3617f0688529499bbdc9f0b911840a3d99fd9c49150d00000000000000000000000000000000001bfd33df4a6059608ada794e03d7456e78317145eb4d5677c00d482ac4cf470053d33583cf602feb67b6f972c9973900000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda00000000000000000000000000000000055caff20f9f3f2ea27c64caeb6bb1880f326c64eb6ed6ee7d15da7bfeb16518f76a75f061cd347f7322e0cec634f0fc000000000000000000000000000000000213e5d2d46523203ae07f36fdeb6c304fb86f552fb9adb566711c31262629efb0b1561585f85d2ac7be174682229bd8000000000000000000000000000000000b3336b5a4f7c0d16db9615e77bcdd55b7cb5b5c1591d835f34f5c1f1468e3cef954608667fb97a32e4595f43b845612000000000000000000000000000000001869606dde1688e5ae9f1c466c5897fce7794f3735234b5af1ad3617f0688529499bbdc9f0b911840a3d99fd9c49150d00000000000000000000000000000000001bfd33df4a6059608ada794e03d7456e78317145eb4d5677c00d482ac4cf470053d33583cf602feb67b6f972c9973900000000000000000000000000000000121b540a0465b39f2f093112c20a9822fc82497105778937c9d5cdcfe039d62998d47d4f41c76482c31f39a79352beda0000000000000000000000000000000014a461f829e0a76ba89f42eb57dffb4f5544df2008163bd0ea1af824f7ff910b27418a0e4f86cb8046dc1f3139cab9af000000000000000000000000000000000213e5d2d46523203ae07f36fdeb6c304fb86f552fb9adb566711c31262629efb0b1561585f85d2ac7be174682229bd8000000000000000000000000000000000b3336b5a4f7c0d16db9615e77bcdd55b7cb5b5c1591d835f34f5c1f1468e3cef954608667fb97a32e4595f43b845612000000000000000000000000000000000197b17c5b695db49c7c8b6fd6f314da7cfdfc4dbe61c76475839c89064870fad5104234c09aee7bafc1660263b6959e0000000000000000000000000000000019e514b65a358640ea90cd3cf547d591f5ff1a13ad99c568ef70c558cbec26dd1e582cc92d849fcfce9749068d361372', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_34', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000016404bd07b6c6480af2d23301940e61817ee2e61fc625c100b31e1b324c369a583b61048dd57ab97b80b1fe6cd64c5c30000000000000000000000000000000004ac6e6077d4eddd0e23f30cfd64b7aa1525c85424224e70c15d7535e02aea7a312ef24ba2dcf70b926acb851da2530c0000000000000000000000000000000006ad07d3e8f45cedfb4279913bf0a29e37604810463d6020b4fa8c8c4977d69cffaa33e1149706f04eb237194dcafa520000000000000000000000000000000002c536dd2f05f4a7eaa33fd884262b22a2ab2a88e7b63cb08ebb67fc0f143da7d6b18dd394c424161f7cf703acdc82f50000000000000000000000000000000002d1d9ff74e20ea9b03c478784f57e7a58a21ca2b1e552319f33305f367f5ae4daf8138505f953db4f86c0ec1d96d5f0000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000003c0c619be1382199bee84862a0ac6bf4c891d22f722b6af5bfef0edd1ed8c7e9af5efb5d3fc546801f3e019329ae4e80000000000000000000000000000000004ac6e6077d4eddd0e23f30cfd64b7aa1525c85424224e70c15d7535e02aea7a312ef24ba2dcf70b926acb851da2530c0000000000000000000000000000000006ad07d3e8f45cedfb4279913bf0a29e37604810463d6020b4fa8c8c4977d69cffaa33e1149706f04eb237194dcafa520000000000000000000000000000000002c536dd2f05f4a7eaa33fd884262b22a2ab2a88e7b63cb08ebb67fc0f143da7d6b18dd394c424161f7cf703acdc82f50000000000000000000000000000000002d1d9ff74e20ea9b03c478784f57e7a58a21ca2b1e552319f33305f367f5ae4daf8138505f953db4f86c0ec1d96d5f0000000000000000000000000000000001383bc4d6c748d5c76ab4ba04f8fcd4c0fed9a49ea080c548893440819833ad72a8249f77391d5fbff78329eb319d3830000000000000000000000000000000016404bd07b6c6480af2d23301940e61817ee2e61fc625c100b31e1b324c369a583b61048dd57ab97b80b1fe6cd64c5c30000000000000000000000000000000004ac6e6077d4eddd0e23f30cfd64b7aa1525c85424224e70c15d7535e02aea7a312ef24ba2dcf70b926acb851da2530c0000000000000000000000000000000006ad07d3e8f45cedfb4279913bf0a29e37604810463d6020b4fa8c8c4977d69cffaa33e1149706f04eb237194dcafa5200000000000000000000000000000000173bdb0d0a79f1f2607867ddbf2581b4c1cc20fc0bced60ed8756aa4e79cb87c47fa722b1c8fdbe99a8208fc532327b600000000000000000000000000000000172f37eac49dd7f09adf602ebe562e5d0bd52ee2419fc08dc7fda241c0319b3f43b3ec79ab5aac246a783f13e268d4bb', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_35', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a0300000000000000000000000000000000053ee41f6a51c49b069f12de32e3e6b0b355cd2c3ba87a149c7de86136a5d9c5b7b59f2d1237964e548d1b62ec36c8db000000000000000000000000000000001913ce14bcd1d7bbb47f8efd92d7ffd155ed1990a1dbf1ee7d5e6d592a92bcbec6e865199362950afd6c8fc49b3e10a400000000000000000000000000000000020df729079e76cf06f84e3355e683e093dafad38c2ba92cf7a9faa0515f2f44d814f971046ea20116cc4b0014d7ec350000000000000000000000000000000018db123e05404eea8707f9356f417c3966312b9e41765a6fd8449879ddc4c9850c38434481b235a5bc35db1b8ee86d43000000000000000000000000000000000b4162715717e9065a3849a9294cfe39b351e57ab5a6790f3e725ad9fbf0e4b9d6a3554e872af9c37df33bb896dada5c0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a030000000000000000000000000000000014c22dcacf2e21ff447c94d81067c626b1217e58b7dc98aacab2ea3fc00b1c5e66f660d19f1c69b16571e49d13c8e1d0000000000000000000000000000000001913ce14bcd1d7bbb47f8efd92d7ffd155ed1990a1dbf1ee7d5e6d592a92bcbec6e865199362950afd6c8fc49b3e10a400000000000000000000000000000000020df729079e76cf06f84e3355e683e093dafad38c2ba92cf7a9faa0515f2f44d814f971046ea20116cc4b0014d7ec350000000000000000000000000000000018db123e05404eea8707f9356f417c3966312b9e41765a6fd8449879ddc4c9850c38434481b235a5bc35db1b8ee86d43000000000000000000000000000000000b4162715717e9065a3849a9294cfe39b351e57ab5a6790f3e725ad9fbf0e4b9d6a3554e872af9c37df33bb896dada5c0000000000000000000000000000000006bc68c6510c15a5d7bc6eebce04f7c5fce3bb02f9f89ea14ab0dfb43645b6346af7e25a8e044e842b7a3d06fe9b1a0300000000000000000000000000000000053ee41f6a51c49b069f12de32e3e6b0b355cd2c3ba87a149c7de86136a5d9c5b7b59f2d1237964e548d1b62ec36c8db000000000000000000000000000000001913ce14bcd1d7bbb47f8efd92d7ffd155ed1990a1dbf1ee7d5e6d592a92bcbec6e865199362950afd6c8fc49b3e10a400000000000000000000000000000000020df729079e76cf06f84e3355e683e093dafad38c2ba92cf7a9faa0515f2f44d814f971046ea20116cc4b0014d7ec35000000000000000000000000000000000125ffac343f97afc413ae80d40a309dfe461fe6b20eb84f8eec3a2718ec2c9f1273bcba2fa1ca59fdc924e471173d68000000000000000000000000000000000ebfaf78e267fd93f0e35e0d19feae9db125660a3dde99b028be77c6fac0116a4808aab02a29063c3c0bc4476924d04f', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_36', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000009cd91a281b96a881b20946fda164a987243c052378fcd8fee3926b75576dfa1d29a0aaca4b653da4e61da82577218080000000000000000000000000000000008be924b49e05c45419e328340f1cbcdd3350bacf832a372417d8331c942df200493a3f7f2e46ad2cdaf3544cfd8cd8600000000000000000000000000000000028cd100457f4e930fc0f55996a6b588c5361816bb853d1f522806e5ec1c455eb200343476feeb07ca77e961fc2adc1f000000000000000000000000000000000f6adad0a3bab3610165be2fadb1b020f25488a0af3d418b7d7cf1165812e17aefcbc23308ebcd31d22ba4ca5773dd87000000000000000000000000000000001657ff792e3d89d5d35767bd0cc788411b0420665a5e0704f4d2399b9d9a5ad3c027ee030fdf495e5a6e2a4c69d0571200000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000010338047b7c67c122ffb13466935623ef2338b32bbf5452f78f7abe9a13a16824c11f5520c9dac256b9d257da88d92a30000000000000000000000000000000008be924b49e05c45419e328340f1cbcdd3350bacf832a372417d8331c942df200493a3f7f2e46ad2cdaf3544cfd8cd8600000000000000000000000000000000028cd100457f4e930fc0f55996a6b588c5361816bb853d1f522806e5ec1c455eb200343476feeb07ca77e961fc2adc1f000000000000000000000000000000000f6adad0a3bab3610165be2fadb1b020f25488a0af3d418b7d7cf1165812e17aefcbc23308ebcd31d22ba4ca5773dd87000000000000000000000000000000001657ff792e3d89d5d35767bd0cc788411b0420665a5e0704f4d2399b9d9a5ad3c027ee030fdf495e5a6e2a4c69d0571200000000000000000000000000000000024ca57c2dc2a7deec3082f2f2110b6788c57a8cdc43515044d275fe7d6f20540055bde823b7b091134fb811d23468ce0000000000000000000000000000000009cd91a281b96a881b20946fda164a987243c052378fcd8fee3926b75576dfa1d29a0aaca4b653da4e61da82577218080000000000000000000000000000000008be924b49e05c45419e328340f1cbcdd3350bacf832a372417d8331c942df200493a3f7f2e46ad2cdaf3544cfd8cd8600000000000000000000000000000000028cd100457f4e930fc0f55996a6b588c5361816bb853d1f522806e5ec1c455eb200343476feeb07ca77e961fc2adc1f000000000000000000000000000000000a96371995c5333949b5e9869599fcb67222c2e44447d133e9b3e18a9e9e14a92ee03dcba86832cde7d35b35a88bcd240000000000000000000000000000000003a912710b425cc477c43ff93684249649732b1e99270bba725e990559169b505e8411fba174b6a15f90d5b3962f5399', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_37', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000011bf87b12734a6360d3dda4b452deede34470fba8e62a68f79153cc288a8e7fed98c74af862883b9861d2195a58262e0000000000000000000000000000000000a5048d860b997a9fb352e58284ebbc026622d9be73de79b2807a0c9b431f41f379c255a2db0dd67413c18217cb21b7200000000000000000000000000000000045a701a3f46ca801c02a5419c836b2ab3d74ebd6f4fd1e7dddb1965b49c9a278f6e89950e7c35ebc6724569d34e364c0000000000000000000000000000000004cb55008ccb5b2b8ece69fac7283f5a9ef9e622e2a0e42bed5bdd77faa550882643afc1759b1a327c4f2277e13a3d4f000000000000000000000000000000001690dee40c6c824dc2588fc47dbf93f68ac250b9357e1112db72ded905ed7b101b5f877bdc42d56afb5b6202403a91c4000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000008418a39124b40643dddcd6afe1dbdf930303bca65226c2fee1b95de6e080e25451f8b4f2b2b7c4633e1de6a5a7d47cb000000000000000000000000000000000a5048d860b997a9fb352e58284ebbc026622d9be73de79b2807a0c9b431f41f379c255a2db0dd67413c18217cb21b7200000000000000000000000000000000045a701a3f46ca801c02a5419c836b2ab3d74ebd6f4fd1e7dddb1965b49c9a278f6e89950e7c35ebc6724569d34e364c0000000000000000000000000000000004cb55008ccb5b2b8ece69fac7283f5a9ef9e622e2a0e42bed5bdd77faa550882643afc1759b1a327c4f2277e13a3d4f000000000000000000000000000000001690dee40c6c824dc2588fc47dbf93f68ac250b9357e1112db72ded905ed7b101b5f877bdc42d56afb5b6202403a91c4000000000000000000000000000000001305e1b9706c7fc132aea63f0926146557d4dd081b7a2913dae02bab75b0409a515d0f25ffa3eda81cf4764de15741f60000000000000000000000000000000011bf87b12734a6360d3dda4b452deede34470fba8e62a68f79153cc288a8e7fed98c74af862883b9861d2195a58262e0000000000000000000000000000000000a5048d860b997a9fb352e58284ebbc026622d9be73de79b2807a0c9b431f41f379c255a2db0dd67413c18217cb21b7200000000000000000000000000000000045a701a3f46ca801c02a5419c836b2ab3d74ebd6f4fd1e7dddb1965b49c9a278f6e89950e7c35ebc6724569d34e364c000000000000000000000000000000001535bce9acb48b6ebc4d3dbb7c236d7cc57d656210e42e9379d4f528fc0ba59bf868503d3bb8e5cd3dafdd881ec56d5c00000000000000000000000000000000037033062d13644c88c317f1c58c18e0d9b4facbbe0701ac8bbdf3c7f0c37b14034c7882d5112a94bea39dfdbfc518e7', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_38', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000f26fdf1af1b8ad442ef4494627c815ca01ae84510944788b87f4aa2c8600ed310b9579318bc617a689b916bb7731dcb00000000000000000000000000000000153cec9690a6420a10e5a5a8ca46fd9d9f90e2a139886a07b375eeecce9083a5f5418e6baf64ef0f34176e432bc5343a000000000000000000000000000000000d87c1f37f83ae78a51af9c420e2584a64337d2d2dd8dc3b64f252c521901924e5eec1d9899594db5e64c93c7a01ef020000000000000000000000000000000017078538092ace26cc88b94360871fc9a6bb9992172158ef3a16467919955083accf8d55d48c7ec462a743dbbca7b448000000000000000000000000000000000289b703157a02fc1d687a5aa595495be8bbb3eb0d70554728255a44b7820e0ee82d984d5493c800f1d9d8ca0c9381dc0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000ada13f88a645bc6082c6321e0cf2b7ac45c633fe2f0cb36aeb187fe2e50e7510df2a86b98979e8551636e94488c8ce000000000000000000000000000000000153cec9690a6420a10e5a5a8ca46fd9d9f90e2a139886a07b375eeecce9083a5f5418e6baf64ef0f34176e432bc5343a000000000000000000000000000000000d87c1f37f83ae78a51af9c420e2584a64337d2d2dd8dc3b64f252c521901924e5eec1d9899594db5e64c93c7a01ef020000000000000000000000000000000017078538092ace26cc88b94360871fc9a6bb9992172158ef3a16467919955083accf8d55d48c7ec462a743dbbca7b448000000000000000000000000000000000289b703157a02fc1d687a5aa595495be8bbb3eb0d70554728255a44b7820e0ee82d984d5493c800f1d9d8ca0c9381dc0000000000000000000000000000000012662b26f03fc8179f090f29894e86155cff4ec2def43393e054f417bbf375edd79f5032a5333ab4eba4418306ed0153000000000000000000000000000000000f26fdf1af1b8ad442ef4494627c815ca01ae84510944788b87f4aa2c8600ed310b9579318bc617a689b916bb7731dcb00000000000000000000000000000000153cec9690a6420a10e5a5a8ca46fd9d9f90e2a139886a07b375eeecce9083a5f5418e6baf64ef0f34176e432bc5343a000000000000000000000000000000000d87c1f37f83ae78a51af9c420e2584a64337d2d2dd8dc3b64f252c521901924e5eec1d9899594db5e64c93c7a01ef020000000000000000000000000000000002f98cb2305518737e92ee72e2c48d0dbdbbb1f2dc63b9d02d1a8c27dd1ba5a071dc72a8dcc7813b5757bc244357f6630000000000000000000000000000000017775ae72405e39e2db32d5b9db6637b7bbb9799e614bd783f0b785c3f2ee815367e67b15cc037fec8252735f36c28cf', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_39', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a370000000000000000000000000000000003d2c7fe67cada2213e842ac5ec0dec8ec205b762f2a9c05fa12fa120c80eba30676834f0560d11ce9939fe210ad6c6300000000000000000000000000000000057f975064a29ba6ad20d6e6d97a15bd314d6cd419948d974a16923d52b38b9203f95937a0a0493a693099e4fa17ea540000000000000000000000000000000014396ce4abfc32945a6b2b0eb4896a6b19a041d4eae320ba18507ec3828964e56719fffaa47e57ea4a2e3bd1a149b6b600000000000000000000000000000000048b3e4ba3e2d1e0dbf5955101cf038dc22e87b0855a57b631ef119d1bd19d56c38a1d72376284c8598e866b6dba37530000000000000000000000000000000007c0b98cda33be53cf4ef29d0500ff5e7a3c2df6f83dfc1c36211d7f9c696b77dfa6571169cf7935d2fb5a6463cceac6000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a3700000000000000000000000000000000162e49ebd1b50c7837336509e48ace0e7856f00ec45a76b96d1dd88eea300a8118357cafabf32ee2d06b601def523e4800000000000000000000000000000000057f975064a29ba6ad20d6e6d97a15bd314d6cd419948d974a16923d52b38b9203f95937a0a0493a693099e4fa17ea540000000000000000000000000000000014396ce4abfc32945a6b2b0eb4896a6b19a041d4eae320ba18507ec3828964e56719fffaa47e57ea4a2e3bd1a149b6b600000000000000000000000000000000048b3e4ba3e2d1e0dbf5955101cf038dc22e87b0855a57b631ef119d1bd19d56c38a1d72376284c8598e866b6dba37530000000000000000000000000000000007c0b98cda33be53cf4ef29d0500ff5e7a3c2df6f83dfc1c36211d7f9c696b77dfa6571169cf7935d2fb5a6463cceac6000000000000000000000000000000001837f0f18bed66841b4ff0b0411da3d5929e59b957a0872bce1c898a4ef0e13350bf4c7c8bcff4e61f24feca1acd5a370000000000000000000000000000000003d2c7fe67cada2213e842ac5ec0dec8ec205b762f2a9c05fa12fa120c80eba30676834f0560d11ce9939fe210ad6c6300000000000000000000000000000000057f975064a29ba6ad20d6e6d97a15bd314d6cd419948d974a16923d52b38b9203f95937a0a0493a693099e4fa17ea540000000000000000000000000000000014396ce4abfc32945a6b2b0eb4896a6b19a041d4eae320ba18507ec3828964e56719fffaa47e57ea4a2e3bd1a149b6b6000000000000000000000000000000001575d39e959d14b96f261265417ca949a248c3d46e2abb093541c103dadf58cd5b21e28c79f17b376070799492457358000000000000000000000000000000001240585d5f4c28467bccb5193e4aad78ea3b1d8dfb4716a3310fb5215a478aac3f05a8ed478486c9e703a59b9c32bfe5', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_40', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000b02ca2b0e6e0989ea917719b89caf1aa84b959e45b6238813bf02f40db95fbb3bf43d3017c3f9c57eab1be617f18032000000000000000000000000000000000b6069a2c375471d34029d2a776e56b86b0210c35d3eb530bf116205b70995e4929fc90349a7db057168dbe6c39857970000000000000000000000000000000014251a0a154731f73513b99d830f70b6fc4bcf05d11f52d2cbe9795ee8ffc5a5f717ad25770b8ecad6d0e9f8066e0cba000000000000000000000000000000001172684b21c4dfe02a55e13b57bbf105c954daec849d4c6df5276b02872c004fdf09d24f4eef366bc82eb72fe91bf70d000000000000000000000000000000001151aeb9441c5a8fabe80867b5c791420645241eae1400bbcc064d75bedd39de2ef585138fe9f65725efa1b1e5888d0300000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000efe47bf2b11dd10608a309c8aaefdbcbc2bb5e6adceef375371cface8f79668e2b7c2ce9990063a3b53e419e80e2a79000000000000000000000000000000000b6069a2c375471d34029d2a776e56b86b0210c35d3eb530bf116205b70995e4929fc90349a7db057168dbe6c39857970000000000000000000000000000000014251a0a154731f73513b99d830f70b6fc4bcf05d11f52d2cbe9795ee8ffc5a5f717ad25770b8ecad6d0e9f8066e0cba000000000000000000000000000000001172684b21c4dfe02a55e13b57bbf105c954daec849d4c6df5276b02872c004fdf09d24f4eef366bc82eb72fe91bf70d000000000000000000000000000000001151aeb9441c5a8fabe80867b5c791420645241eae1400bbcc064d75bedd39de2ef585138fe9f65725efa1b1e5888d0300000000000000000000000000000000181dc6fd3668d036a37d60b214d68f1a6ffe1949ec6b22f923e69fb373b9c70e8bcc5cdace068024c631c27f28d994e5000000000000000000000000000000000b02ca2b0e6e0989ea917719b89caf1aa84b959e45b6238813bf02f40db95fbb3bf43d3017c3f9c57eab1be617f18032000000000000000000000000000000000b6069a2c375471d34029d2a776e56b86b0210c35d3eb530bf116205b70995e4929fc90349a7db057168dbe6c39857970000000000000000000000000000000014251a0a154731f73513b99d830f70b6fc4bcf05d11f52d2cbe9795ee8ffc5a5f717ad25770b8ecad6d0e9f8066e0cba00000000000000000000000000000000088ea99f17bb06ba20c5c67aeb8fbbd19b2270986ee7c6517209679e6f84f5d43fa22daf6264c993f1d048d016e3b39e0000000000000000000000000000000008af6330f5638c0a9f339f4e8d841b955e322766457112039b2a852b37d3bc45efb67aeb216a09a8940f5e4e1a771da8', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_41', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c187229000000000000000000000000000000000096713619bf088bd9e12752cab83e9cdd58296ada8d338c86a749f00ba014087a3836ce10adaaf2e815f431235bff4f000000000000000000000000000000000161b70d0f384e589d8117938602f3d696f941c24e3c1ca5a9be090b670456c9df315d6fde52daed55c9d8335928a7a3c00000000000000000000000000000000186bb9e6f5ba70dd2c66a641d3b711844977939904c59946d4e9f49ac2d8c00890a43ccb20d4a62bfff63ce4a0a44e8e000000000000000000000000000000001995b9d697bded656236430e78726f0f6ef963db9a5a24d455c12db38aeab0f8629e5dc2d04920156f2a057d69613096000000000000000000000000000000001119b13caf82c18fadcb65c9c166914bfd822534bb9def3feae6c9e572c97c84e97fab3b345cf59358436a404075493d000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c1872290000000000000000000000000000000001099fe889d8f5ddcad09328997c7c3098ef4b4d74ab1d9f6fcbc33a03cafb59c7b28931da67950d1389fbcedca3fb5bb00000000000000000000000000000000161b70d0f384e589d8117938602f3d696f941c24e3c1ca5a9be090b670456c9df315d6fde52daed55c9d8335928a7a3c00000000000000000000000000000000186bb9e6f5ba70dd2c66a641d3b711844977939904c59946d4e9f49ac2d8c00890a43ccb20d4a62bfff63ce4a0a44e8e000000000000000000000000000000001995b9d697bded656236430e78726f0f6ef963db9a5a24d455c12db38aeab0f8629e5dc2d04920156f2a057d69613096000000000000000000000000000000001119b13caf82c18fadcb65c9c166914bfd822534bb9def3feae6c9e572c97c84e97fab3b345cf59358436a404075493d000000000000000000000000000000001329a75975b714c861064d743092866d61c4467e0c0316b78142e6db7e74538a376a09487cb09ee89583d547c187229000000000000000000000000000000000096713619bf088bd9e12752cab83e9cdd58296ada8d338c86a749f00ba014087a3836ce10adaaf2e815f431235bff4f000000000000000000000000000000000161b70d0f384e589d8117938602f3d696f941c24e3c1ca5a9be090b670456c9df315d6fde52daed55c9d8335928a7a3c00000000000000000000000000000000186bb9e6f5ba70dd2c66a641d3b711844977939904c59946d4e9f49ac2d8c00890a43ccb20d4a62bfff63ce4a0a44e8e00000000000000000000000000000000006b5813a1c1f934e8e564a7cad93dc7f57de7a9592aedeb116fa4ed6bc6452bbc0da23be10adfea4ad4fa82969e7a150000000000000000000000000000000008e760ad89fd250a9d5041ec81e51b8b66f5265037e7237f7c4a08bb83e7799f352c54c37cf70a6c61bb95bfbf8a616e', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_42', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a90000000000000000000000000000000002b03f02b45aa15b39e030c4b88c89a285dff5c4bbfe16f643f3f87d91db774f8ab7019285fda0b236ff7eec16496e5e0000000000000000000000000000000017d1ffcad218efd8b09c68eba34dbbc30b0a62ae250368ee37e5f6fd40479b8580563416afdbd92c0622c341331e20a30000000000000000000000000000000009f0eb3805ed78aa3952a0a437966258ed38cb72912756253a7a2f9113f0dd9a4e187062b0423e0587d93e904d88f50d0000000000000000000000000000000001bca57e985906695e14882f2aaeef75de5009e8717eb59962e978aa11e9d0a4d9a9e203df774cb1e993b1c6ecd6048c000000000000000000000000000000000695b11cc32740c91546eb7d554ca8b1f3afc942ad977345031be8b94b78b57a87ab049ca2d3676e039efccbf24d0c47000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a9000000000000000000000000000000001750d2e78525453f113b76f18abf2334de9755c03786fbc9233cda2364d57ed493f4fe6c2b565f4d82ff8113e9b63c4d0000000000000000000000000000000017d1ffcad218efd8b09c68eba34dbbc30b0a62ae250368ee37e5f6fd40479b8580563416afdbd92c0622c341331e20a30000000000000000000000000000000009f0eb3805ed78aa3952a0a437966258ed38cb72912756253a7a2f9113f0dd9a4e187062b0423e0587d93e904d88f50d0000000000000000000000000000000001bca57e985906695e14882f2aaeef75de5009e8717eb59962e978aa11e9d0a4d9a9e203df774cb1e993b1c6ecd6048c000000000000000000000000000000000695b11cc32740c91546eb7d554ca8b1f3afc942ad977345031be8b94b78b57a87ab049ca2d3676e039efccbf24d0c47000000000000000000000000000000001195502bc48c44b37e3f8f4e6f40295c1156f58dbc00b04b3018d237b574a20512599d18af01c50192db37cb8eb2c8a90000000000000000000000000000000002b03f02b45aa15b39e030c4b88c89a285dff5c4bbfe16f643f3f87d91db774f8ab7019285fda0b236ff7eec16496e5e0000000000000000000000000000000017d1ffcad218efd8b09c68eba34dbbc30b0a62ae250368ee37e5f6fd40479b8580563416afdbd92c0622c341331e20a30000000000000000000000000000000009f0eb3805ed78aa3952a0a437966258ed38cb72912756253a7a2f9113f0dd9a4e187062b0423e0587d93e904d88f50d0000000000000000000000000000000018446c6ba126e030ed071f87189cbd618627419c82065d26044759f6e4c7257f45021dfad1dcb34dd06b4e391329a61f00000000000000000000000000000000136b60cd7658a5d135d4bc38edff042570c7824245ed9f7a6414e9e7ab3840a99700fb620e809891b66003340db29e64', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_43', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb00000000000000000000000000000000185e8671e2ddb8e36380e39fe4eafefbac9769935603c28caac7d3f7f0f3e8ad14e925024b55aeb67d68b219875c9d79000000000000000000000000000000000546a0cb9d9f1ef9ec4a1e576fa0047557a56c0217baed8691c4085b88c84a0e12d44043aab8671393d02c4a764407ee00000000000000000000000000000000131884c1386980a181353548da9602db70ab495a661e76235c4b0a32b54acb0dfd8846e17bebd731e8041c4aebb8776600000000000000000000000000000000135b3db43511dbd8b3bd5a91880d6da1a2bd1383000e0d6f0a521bf88a5836a3b5f7cb9c0c02aa861a1c2d339f3c11f20000000000000000000000000000000000e1337271bd3302a1cab762161ccfbf2a18b7800e6efe58cf897d4adbfe4cb3bf14f4b59307fffc548179bda70c18bf000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb0000000000000000000000000000000001a28b7856a22db6e79ac4165e60addbb7dfe1f19d815032bc68fea905bd0d7709c2dafc65fe51493c964de678a30d32000000000000000000000000000000000546a0cb9d9f1ef9ec4a1e576fa0047557a56c0217baed8691c4085b88c84a0e12d44043aab8671393d02c4a764407ee00000000000000000000000000000000131884c1386980a181353548da9602db70ab495a661e76235c4b0a32b54acb0dfd8846e17bebd731e8041c4aebb8776600000000000000000000000000000000135b3db43511dbd8b3bd5a91880d6da1a2bd1383000e0d6f0a521bf88a5836a3b5f7cb9c0c02aa861a1c2d339f3c11f20000000000000000000000000000000000e1337271bd3302a1cab762161ccfbf2a18b7800e6efe58cf897d4adbfe4cb3bf14f4b59307fffc548179bda70c18bf000000000000000000000000000000000d7e1651f3e172dcca8774a7a0d58ab47178d3e759933289e1d3eb0da414160ff9e890a608bf8ccdf2820c4aea6e11cb00000000000000000000000000000000185e8671e2ddb8e36380e39fe4eafefbac9769935603c28caac7d3f7f0f3e8ad14e925024b55aeb67d68b219875c9d79000000000000000000000000000000000546a0cb9d9f1ef9ec4a1e576fa0047557a56c0217baed8691c4085b88c84a0e12d44043aab8671393d02c4a764407ee00000000000000000000000000000000131884c1386980a181353548da9602db70ab495a661e76235c4b0a32b54acb0dfd8846e17bebd731e8041c4aebb877660000000000000000000000000000000006a5d436046e0ac1975e4d24bb3e3f35c1ba3801f37705505cdeb6a86c58bf8068b43462a55155799fe2d2cc60c398b900000000000000000000000000000000191fde77c7c2b397a950f0542d2edd183a5e9404e516146697a755561ab2a9705f970b491e4c0003657d864258f391ec', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_44', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e2700000000000000000000000000000000123f973ab6bd3c2e5b0512a0c77ea0ac3003fd891e1262137f9444cd07b927b564e618205ba09220320ea1aa4564e82000000000000000000000000000000000113dc3354146ca79eb103b31b61fe8bc6f33dcb9c59a7c39d989bd9411c1afce4239034f84e6b00a084be061c73e69c0000000000000000000000000000000000ae33bf68f24978c7ea9fc58d8d76047ec45d01fdbc880e6a5ba02a22a49a3a8253afe0678ecfa6013f4849da3401df70000000000000000000000000000000012c5b00376a1dd31378ec44f2dc8e321e17185d903cfc5c15345a01c33f2f151b21b938d31816550594a7a1e7216c5b00000000000000000000000000000000013d79f825c44775c68e90932d0496a5cae53f04a1edb19f8abeb5948a3dd325dfec4a8b6f58c7fbca9cf3c09b909d8b2000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e270000000000000000000000000000000007c17aaf82c2aa6bf01695157bcd0c2b34734dfbd572b0abe79c8dd3eef7ce6eb9c5e7de55b36ddf87f05e55ba9ac28b00000000000000000000000000000000113dc3354146ca79eb103b31b61fe8bc6f33dcb9c59a7c39d989bd9411c1afce4239034f84e6b00a084be061c73e69c0000000000000000000000000000000000ae33bf68f24978c7ea9fc58d8d76047ec45d01fdbc880e6a5ba02a22a49a3a8253afe0678ecfa6013f4849da3401df70000000000000000000000000000000012c5b00376a1dd31378ec44f2dc8e321e17185d903cfc5c15345a01c33f2f151b21b938d31816550594a7a1e7216c5b00000000000000000000000000000000013d79f825c44775c68e90932d0496a5cae53f04a1edb19f8abeb5948a3dd325dfec4a8b6f58c7fbca9cf3c09b909d8b2000000000000000000000000000000001454d4a82163a155446467164904cefd7e1e3c67ae99bf65c581a75c72716fb011e2fd030eaf3d36977fbb0ff5156e2700000000000000000000000000000000123f973ab6bd3c2e5b0512a0c77ea0ac3003fd891e1262137f9444cd07b927b564e618205ba09220320ea1aa4564e82000000000000000000000000000000000113dc3354146ca79eb103b31b61fe8bc6f33dcb9c59a7c39d989bd9411c1afce4239034f84e6b00a084be061c73e69c0000000000000000000000000000000000ae33bf68f24978c7ea9fc58d8d76047ec45d01fdbc880e6a5ba02a22a49a3a8253afe0678ecfa6013f4849da3401df700000000000000000000000000000000073b61e6c2de0969138ce3671582c9b58305c5abefb54cfe13eb3284c2be04d26c906c717fd29aaf60b485e18de8e4fb0000000000000000000000000000000006297267dd3b6f3de2329e837302427ab6235b3ad4a9f8c6bb45795852d3c3c61fe75747bbc78043102fc3f646f5d1f9', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_45', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000002ec930fb58c898ede931384c5a5f9edd2f5c70b8c3794edb83a12f23be5400949f95e81c96c666c1a72dffb50b811580000000000000000000000000000000006ccaf6c08f831be9c99a97714f5257a985cc2a29b5f5c81bc8d794dd0d8d1a41eb5413bed654c0140dbacfd0dda9e1800000000000000000000000000000000144e9cf91580800dfaa47c98ff7d002a576be76d9e44ae1f8335a3f733e1162af0636372e143174d872c7ea89f4c743900000000000000000000000000000000101e143b838c8a3f5f80fb1412081091b875230f1e2f9cf374d4bcd595392f6daa9552dbb6d5834e27b1b3dafe061ed300000000000000000000000000000000072463400b3e875395a1cdd31d73d51396e34347cd86d9f6f43f42253b3cdb24b89ed7434b1522af95ba1ee2d29ed1bb000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000017147eda83f35d0b6c8894317da5b2e991818479674d7dd1aef6bfaebacbb61ad4b2a17ce7e799939f8c2004af4799530000000000000000000000000000000006ccaf6c08f831be9c99a97714f5257a985cc2a29b5f5c81bc8d794dd0d8d1a41eb5413bed654c0140dbacfd0dda9e1800000000000000000000000000000000144e9cf91580800dfaa47c98ff7d002a576be76d9e44ae1f8335a3f733e1162af0636372e143174d872c7ea89f4c743900000000000000000000000000000000101e143b838c8a3f5f80fb1412081091b875230f1e2f9cf374d4bcd595392f6daa9552dbb6d5834e27b1b3dafe061ed300000000000000000000000000000000072463400b3e875395a1cdd31d73d51396e34347cd86d9f6f43f42253b3cdb24b89ed7434b1522af95ba1ee2d29ed1bb000000000000000000000000000000000178e6828261ee6855b38234ed15c27551bb1648ac6ec9a9e70744643cd1f134b2309dd0c34b1e59ddfe3f831ab814c90000000000000000000000000000000002ec930fb58c898ede931384c5a5f9edd2f5c70b8c3794edb83a12f23be5400949f95e81c96c666c1a72dffb50b811580000000000000000000000000000000006ccaf6c08f831be9c99a97714f5257a985cc2a29b5f5c81bc8d794dd0d8d1a41eb5413bed654c0140dbacfd0dda9e1800000000000000000000000000000000144e9cf91580800dfaa47c98ff7d002a576be76d9e44ae1f8335a3f733e1162af0636372e143174d872c7ea89f4c74390000000000000000000000000000000009e2fdaeb5f35c5aeb9aaca231439c45ac022875d55575cbf25c15cb6177c6b67416ad22fa7e7cb1924d4c2501f98bd80000000000000000000000000000000012dcaeaa2e415f46b579d9e325d7d7c3cd94083d25fe38c872f1907bbb741aff660d28bb663edd502444e11d2d60d8f0', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_46', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f100000000000000000000000000000000033f481fc62ab0a249561d180da39ff641a540c9c109cde41946a0e85d18c9d60b41dbcdec370c5c9f22a9ee9de00ccd000000000000000000000000000000001354146aa546754e10ada6e0fe98f04f5f3a3f8a8350d0295e02b8e9c80735b04c3061412e08ddb13c80ac36e5638e540000000000000000000000000000000012ab26513534b4dc1b71eec46b73199c4157ba9369e66fbe4d2d8f62237fc7c6fad31854ebd878f989b8c5cf35c7cfe0000000000000000000000000000000000eb731bc99cdadf7f2280385c7e17d72d34bcbdbdc725d5bc94e841036115e8cb95df08084221696f9be479821fbdd7400000000000000000000000000000000143ba7d3f66445249d9a81a6949f24ff40e7c4d270fa044a8b80200a4369b07806c5497a0ef9e9dbb87b9e63694623ee0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f10000000000000000000000000000000016c1c9ca735535f801c58a9e35a80ce122d20abb327b44db4dea31b899982c4e136a2430c51cf3a31adc5611621f9dde000000000000000000000000000000001354146aa546754e10ada6e0fe98f04f5f3a3f8a8350d0295e02b8e9c80735b04c3061412e08ddb13c80ac36e5638e540000000000000000000000000000000012ab26513534b4dc1b71eec46b73199c4157ba9369e66fbe4d2d8f62237fc7c6fad31854ebd878f989b8c5cf35c7cfe0000000000000000000000000000000000eb731bc99cdadf7f2280385c7e17d72d34bcbdbdc725d5bc94e841036115e8cb95df08084221696f9be479821fbdd7400000000000000000000000000000000143ba7d3f66445249d9a81a6949f24ff40e7c4d270fa044a8b80200a4369b07806c5497a0ef9e9dbb87b9e63694623ee0000000000000000000000000000000001ea88d0f329135df49893406b4f9aee0abfd74b62e7eb5576d3ddb329fc4b1649b7c228ec39c6577a069c0811c952f100000000000000000000000000000000033f481fc62ab0a249561d180da39ff641a540c9c109cde41946a0e85d18c9d60b41dbcdec370c5c9f22a9ee9de00ccd000000000000000000000000000000001354146aa546754e10ada6e0fe98f04f5f3a3f8a8350d0295e02b8e9c80735b04c3061412e08ddb13c80ac36e5638e540000000000000000000000000000000012ab26513534b4dc1b71eec46b73199c4157ba9369e66fbe4d2d8f62237fc7c6fad31854ebd878f989b8c5cf35c7cfe0000000000000000000000000000000000b49e02d9fb238a258f3a4307b6a2f64912b7fa91712b5639de24e90c09f9797654e0f7e2d31e968c040b867de03cd370000000000000000000000000000000005c56a16431ba175ad81260faeac87d8238f86b2828b0e74dbb0b296b34745ac17e6b684a25a16240183619c96b986bd', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_47', + Gas: 194000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be10000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe90000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000068edef3169c58920509ed4e7069229bd8038a45d2ce5773451cc18b396d2838c9539ecb52298a27eebd714afacb907c0000000000000000000000000000000004c5346765a62f2d2e700aadccf747acb3322c250435ce2cf358c08f1e286427cabace052327c4b30135c8482c5c0eb90000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be100000000000000000000000000000000084486ebc81878331aab7d6f53ca3c773fda7b181b56a93e5ee0bfa189afbb7fd7a05c5bea35ec1054c0e1ddc2e2dac20000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000068edef3169c58920509ed4e7069229bd8038a45d2ce5773451cc18b396d2838c9539ecb52298a27eebd714afacb907c0000000000000000000000000000000004c5346765a62f2d2e700aadccf747acb3322c250435ce2cf358c08f1e286427cabace052327c4b30135c8482c5c0eb90000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be10000000000000000000000000000000011bc8afe71676e6730702a46ef817060249cd06cd82e6981085012ff6d013aa4470ba3a2c71e13ef653e1e223d1ccfe90000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000137232f722e38e084611ba67d2e28a3b8c73c13f20b6bb4c22141115bd43cdeb555861335f2a75d7cb418eb505341a2f00000000000000000000000000000000153bdd82d3d9b76d1cab9d087654652ab1451f5fef4f449273d81211d88891fc53f131f98e2c3b4cb8c937b7d3a39bf20000000000000000000000000000000008d8c4a16fb9d8800cce987c0eadbb6b3b005c213d44ecb5adeed713bae79d606041406df26169c35df63cf972c94be100000000000000000000000000000000084486ebc81878331aab7d6f53ca3c773fda7b181b56a93e5ee0bfa189afbb7fd7a05c5bea35ec1054c0e1ddc2e2dac20000000000000000000000000000000013a3de1d25380c44ca06321151e89ca22210926c1cd4e3c1a9c3aa6c709ab5fdd00f8df19243ce058bc753ccf03424ed000000000000000000000000000000001657dbebf712cbda6f15d1d387c87b3fb9b386d5d754135049728a2a856ba2944c741024131a93c78655fdb7bfe3c80300000000000000000000000000000000137232f722e38e084611ba67d2e28a3b8c73c13f20b6bb4c22141115bd43cdeb555861335f2a75d7cb418eb505341a2f00000000000000000000000000000000153bdd82d3d9b76d1cab9d087654652ab1451f5fef4f449273d81211d88891fc53f131f98e2c3b4cb8c937b7d3a39bf2', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_48', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000fa57c1436615442bbb049d08ac46e501c07736cd239298752bb94d1904bd38cc687759987cadd99bd3c4d45ba07193a000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000f6fdc4e5dceb555c9eb4c912fedbfb3cb1b842345f73ded02cfaf8d397c4378809721094aa4a4113a368e0787effeb500000000000000000000000000000000143ac06258c579c11c05569669a2a10babc63ecc86f85c91791d8ea48af700a2067c5f13d2700b8d5cf59bcca8fbf7c600000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000a5b95d6031e92578f6b5de5b8873e87486fd818214be93814753dcf6665229758248a6529892265fcc2b2ba45f89171000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000f6fdc4e5dceb555c9eb4c912fedbfb3cb1b842345f73ded02cfaf8d397c4378809721094aa4a4113a368e0787effeb500000000000000000000000000000000143ac06258c579c11c05569669a2a10babc63ecc86f85c91791d8ea48af700a2067c5f13d2700b8d5cf59bcca8fbf7c600000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000fa57c1436615442bbb049d08ac46e501c07736cd239298752bb94d1904bd38cc687759987cadd99bd3c4d45ba07193a000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000a91359bdbb1314481305b25135ded23995bc761ad8dd4d264612313bd34b2ab9e14def566af5bee7fc871f8780fabf60000000000000000000000000000000005c65187e0ba6cd92f16511fd9a90bcbb8b10cb86c8cb62dee1343fc6bb9f582182fa0eadee3f4725d0964335703b2e500000000000000000000000000000000120ddc1cd9e3a7b298673b1036d162c31dbb35d6e83b39b2564b3be16e446a836c96907e8a6af1e677e906bf5ed73159000000000000000000000000000000000a5b95d6031e92578f6b5de5b8873e87486fd818214be93814753dcf6665229758248a6529892265fcc2b2ba45f89171000000000000000000000000000000000dd75b4aebed3bd6bd020c3af671aaed67bf1582aceb6c8b5a476968c0c500753e4d0f3276341b79d87af38850893d92000000000000000000000000000000000e9b3be06afd6157eb6df52be4f2db2bcccd650f720661f8d6fcff3f71d69e152e17100ce60b7b90a7f798c4cdd02209000000000000000000000000000000000a91359bdbb1314481305b25135ded23995bc761ad8dd4d264612313bd34b2ab9e14def566af5bee7fc871f8780fabf60000000000000000000000000000000005c65187e0ba6cd92f16511fd9a90bcbb8b10cb86c8cb62dee1343fc6bb9f582182fa0eadee3f4725d0964335703b2e5', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_49', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b600000000000000000000000000000000175bdd42583cbbf733242510c152380525aff7649273acef1ec20569804ffba7f029ca06878dbafde84540cece173822000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc500000000000000000000000000000000192f3e8ae2588f9223de77f5e872115f1edec96d6a0f403a47879410c2562e79853c9a706e423b83fbf3154234edb6f80000000000000000000000000000000015084258d58fd1a07bbdb2e90df5a56ae15a787037eff4fe55f660e45f04820c6fc8982303b5e82074cf0cdcbde61307000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b60000000000000000000000000000000002a534a7e1432aa317f782a581f974d23ec75420611165d0486ecd377660fa7c2e8235f829c64501d1b9bf3131e87289000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc500000000000000000000000000000000192f3e8ae2588f9223de77f5e872115f1edec96d6a0f403a47879410c2562e79853c9a706e423b83fbf3154234edb6f80000000000000000000000000000000015084258d58fd1a07bbdb2e90df5a56ae15a787037eff4fe55f660e45f04820c6fc8982303b5e82074cf0cdcbde61307000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b600000000000000000000000000000000175bdd42583cbbf733242510c152380525aff7649273acef1ec20569804ffba7f029ca06878dbafde84540cece173822000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc50000000000000000000000000000000000d1d35f57275708273d2fc05ad99b78459882178975d2851fa93e90345ac7aa996f658e4311c47bbe0beabdcb11f3b30000000000000000000000000000000004f8cf9163f014f9cf5df4cd3556076c831cd314bb951dc1113a71bc97ac7417aee367dbad9e17df452ff323421997a4000000000000000000000000000000000e3ccaa4fa358a5a885094cbb0b8baa106fbcca66edbe31511ac2f6f3d14edbd8701979d6e4690853555c625091392b60000000000000000000000000000000002a534a7e1432aa317f782a581f974d23ec75420611165d0486ecd377660fa7c2e8235f829c64501d1b9bf3131e87289000000000000000000000000000000000057bbf62cdf3c56e146f60f8ce6b6bdebe7aae7d9410c6902c7a505b589ae26ce3ab67d9b8da047185f9d37ab27595e000000000000000000000000000000000843e55c07bba3573592d3f649938654a5c51f9ced0f92bcb3e4f431141fe91a1de3695324b21e31dd2ae0a328055cc50000000000000000000000000000000000d1d35f57275708273d2fc05ad99b78459882178975d2851fa93e90345ac7aa996f658e4311c47bbe0beabdcb11f3b30000000000000000000000000000000004f8cf9163f014f9cf5df4cd3556076c831cd314bb951dc1113a71bc97ac7417aee367dbad9e17df452ff323421997a4', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_50', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000cbf7a31e6fef4f4664bca4bc87ec7c0b12ced7224300aa4e1a6a7cbdedfcef07482b5d20fa607e3f03fdd6dd03fd10c000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f000000000000000000000000000000000477b55bd7fff14e0d1807bfc21edb9481be01c12abb1460d78b1aafe42953730167e32e694c2ddfb0d442e8cea57d460000000000000000000000000000000004b884c6ea36f189dbc3c0e9cf88f08baf5d868579998f63b752e61fcce3cf2c901bb9b51959d3597c4ef53cff41fc260000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000d4197b85280f1a5e4cfdd6a7acce516b34a5e12cf55081a858a2ad517d12733aa294a2ca1adf81bc9bf22922fbfd99f000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f000000000000000000000000000000000477b55bd7fff14e0d1807bfc21edb9481be01c12abb1460d78b1aafe42953730167e32e694c2ddfb0d442e8cea57d460000000000000000000000000000000004b884c6ea36f189dbc3c0e9cf88f08baf5d868579998f63b752e61fcce3cf2c901bb9b51959d3597c4ef53cff41fc260000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000cbf7a31e6fef4f4664bca4bc87ec7c0b12ced7224300aa4e1a6a7cbdedfcef07482b5d20fa607e3f03fdd6dd03fd10c000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f0000000000000000000000000000000015895c8e617ff54c3e039ff6812cd142e2b949c3c8c9fe5e8fa5b7f11287a2b11d441cd04807d220092abd17315a2d650000000000000000000000000000000015488d234f48f5106f57e6cc73c2bc4bb519c4ff79eb835bafddec8129cd26f78e90464997fa2ca63db00ac300bdae850000000000000000000000000000000001bc359baeac07a93aca770174ea6444aac9f04affdaa77c8a47b30c60ee2b527c061a4344139264e541d4134f42bfd0000000000000000000000000000000000d4197b85280f1a5e4cfdd6a7acce516b34a5e12cf55081a858a2ad517d12733aa294a2ca1adf81bc9bf22922fbfd99f000000000000000000000000000000000bcec23e092111b38a2f7dc957cf455312ffd33528d084204314492440d29248cb5719346a4f7a490d17ba149e30de5200000000000000000000000000000000194605e5680cc80bd2685949efa3cce90d345b9151ba72f3adf226dd299c23464c4344a42b8834131a51a4156038585f0000000000000000000000000000000015895c8e617ff54c3e039ff6812cd142e2b949c3c8c9fe5e8fa5b7f11287a2b11d441cd04807d220092abd17315a2d650000000000000000000000000000000015488d234f48f5106f57e6cc73c2bc4bb519c4ff79eb835bafddec8129cd26f78e90464997fa2ca63db00ac300bdae85', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_51', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa0000000000000000000000000000000005aa892b0a056ff61706430f1daa3f0263dc01337eadabd8a7fd58152affd9aaa329e8c11ea98692134d9718cb4119bf00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac800000000000000000000000000000000183b7b917aaaa94f0ea9959273ed4701102346be2a9d72531bd18fef908ecb0579a6ac10ed42a91f1147fc3a05b2e81900000000000000000000000000000000070983b1582a97d9797782e4f960a298aaa8ec509720495acdbf176d8ecb9ec9e041c2b5ed6b7dfb46fdeaae3fb341500000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa00000000000000000000000000000000145688bf2f7a76a4341564a725a16dd5009b4a5174d766e6bf337a8bcbb11c797b82173d92aa796da6b168e734be90ec00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac800000000000000000000000000000000183b7b917aaaa94f0ea9959273ed4701102346be2a9d72531bd18fef908ecb0579a6ac10ed42a91f1147fc3a05b2e81900000000000000000000000000000000070983b1582a97d9797782e4f960a298aaa8ec509720495acdbf176d8ecb9ec9e041c2b5ed6b7dfb46fdeaae3fb341500000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa0000000000000000000000000000000005aa892b0a056ff61706430f1daa3f0263dc01337eadabd8a7fd58152affd9aaa329e8c11ea98692134d9718cb4119bf00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac80000000000000000000000000000000001c59658bed53d4b3c721223cf5e65d6545404c6c8e7a06c4b5f42b166222b1ea50553edc41156e0a8b703c5fa4cc2920000000000000000000000000000000012f78e38e1554ec0d1a424d149eb0a3eb9ce5f345c64c9649971bb3367e5575a3e6a3d48c3e8820473011551c04c695b0000000000000000000000000000000006b06ae8cb0981bf5167ad51e19d132db77548c4376697f855c8397b835743c42771096ed7b0a4b18af9494e42ee89aa00000000000000000000000000000000145688bf2f7a76a4341564a725a16dd5009b4a5174d766e6bf337a8bcbb11c797b82173d92aa796da6b168e734be90ec00000000000000000000000000000000073341309b6fbabb18f3cf0842817905e9248db98b582dc0efb2b741a80cdbb13d0df4bce920f257996b95029891a36f0000000000000000000000000000000012d19e09dc254bd1e84afce75aa215c96dd38bcac3f6d4cf08d9e2e8d20345b7c534a0b14ffcdfd4fa3600730e2eeac80000000000000000000000000000000001c59658bed53d4b3c721223cf5e65d6545404c6c8e7a06c4b5f42b166222b1ea50553edc41156e0a8b703c5fa4cc2920000000000000000000000000000000012f78e38e1554ec0d1a424d149eb0a3eb9ce5f345c64c9649971bb3367e5575a3e6a3d48c3e8820473011551c04c695b', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_52', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a0300000000000000000000000000000000166ce33c0482b5957c6e746c16908ba579d6402b230bc977d3ff29ac2a4a800748d9c14608f2519e2ac4d1fe4daf29b2000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b0000000000000000000000000000000010f7bf9f6711ba723bb71a004a90109ee22be6643d56d410da18103ef44a1b3d50f10c4b94222c7f05fd3c28acbdc8ee00000000000000000000000000000000007af41f09e6d0adcb1935d6a93ea1f6156fa0157a63f265a3a7ceffe82f6635b8511e7e8f21e8f3be7a73513ff597b10000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a030000000000000000000000000000000003942eae34fd3104cead334a2cbb2131eaa10b59d07949479331a8f4cc66761cd5d23eb8a861ae618f3a2e01b25080f9000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b0000000000000000000000000000000010f7bf9f6711ba723bb71a004a90109ee22be6643d56d410da18103ef44a1b3d50f10c4b94222c7f05fd3c28acbdc8ee00000000000000000000000000000000007af41f09e6d0adcb1935d6a93ea1f6156fa0157a63f265a3a7ceffe82f6635b8511e7e8f21e8f3be7a73513ff597b10000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a0300000000000000000000000000000000166ce33c0482b5957c6e746c16908ba579d6402b230bc977d3ff29ac2a4a800748d9c14608f2519e2ac4d1fe4daf29b2000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b000000000000000000000000000000000909524ad26e2c280f648db5f8bb9c38824b6520b62e3eae8d18c2620266dae6cdbaf3b31d31d380b401c3d75341e1bd0000000000000000000000000000000019861dcb2f9915ec800271df9a0d0ae14f07ab6f79212059c38903a10e818fee665ae1802232170bfb848caec00a12fa0000000000000000000000000000000015dc9f87213e4781863ad43f6bbccd547967d9bcf6a35d95d530cbfbf0d7307981aee5bc4ccd41254841651717393a030000000000000000000000000000000003942eae34fd3104cead334a2cbb2131eaa10b59d07949479331a8f4cc66761cd5d23eb8a861ae618f3a2e01b25080f9000000000000000000000000000000000dca3b392f75583b5266a8def02bd66bf44f26b8a0a27aced57299756cffaf9e1af3538beb08b2a5939b745c8f016fee000000000000000000000000000000000d7feafc9ec0935d5b7be7cd5e2a3c57b667aba9fcc87fd5b8a585010be6958c4e7538a6d2a1f46c9641ff7b8598d74b000000000000000000000000000000000909524ad26e2c280f648db5f8bb9c38824b6520b62e3eae8d18c2620266dae6cdbaf3b31d31d380b401c3d75341e1bd0000000000000000000000000000000019861dcb2f9915ec800271df9a0d0ae14f07ab6f79212059c38903a10e818fee665ae1802232170bfb848caec00a12fa', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_53', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f6046300000000000000000000000000000000148b5454f9b9868aefd2accc3318ddabfe618c5026e8c04f8a6bce76cd88e350bebcd779f2021fe7ceda3e8b4d438a0b0000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a0000000000000000000000000000000003a6cc74cc398f38d535b4341faa37c968daf2009c3f05ace1f938b33bbe4002d81d18d30c2c856b21afe7a22b83c37a000000000000000000000000000000000452d1b2da6392f9df1bfd35e4575c565333703b2f83f56e0a88a0c8195968c5321296b07f6750584e23597304a5472e00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f60463000000000000000000000000000000000575bd953fc6600f5b48faea1032cf2b6615bf34cc9c526fdcc5042a292812d35fef2884bf51e017eb24c174b2bc20a00000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a0000000000000000000000000000000003a6cc74cc398f38d535b4341faa37c968daf2009c3f05ace1f938b33bbe4002d81d18d30c2c856b21afe7a22b83c37a000000000000000000000000000000000452d1b2da6392f9df1bfd35e4575c565333703b2f83f56e0a88a0c8195968c5321296b07f6750584e23597304a5472e00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f6046300000000000000000000000000000000148b5454f9b9868aefd2accc3318ddabfe618c5026e8c04f8a6bce76cd88e350bebcd779f2021fe7ceda3e8b4d438a0b0000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a00000000000000000000000000000000165a45756d46576175e5f38223a1750dfb9c598457460d12853799edbaf2b621468ee72ba5277a94984f185dd47be7310000000000000000000000000000000015ae40375f1c53a06bffaa805ef450811143db49c4011d515ca831d8dd578d5eec99694e31ecafa76bdba68cfb5a637d00000000000000000000000000000000171fbc9cec717964c4324aa0d7dcf56a59b947c24a9092157f4f8c78ae43b8e4222fd1e8acdbf5989d0d17ea10f60463000000000000000000000000000000000575bd953fc6600f5b48faea1032cf2b6615bf34cc9c526fdcc5042a292812d35fef2884bf51e017eb24c174b2bc20a00000000000000000000000000000000019e05ccf064f7cdad9748d328170b3e4bcfa6787dbfa93011d16f6d031648faa10dbfb7cc4d7c884d75480c4c864bb75000000000000000000000000000000001999d5f54ee66b3c0dedf9f46450e0ed463fa9c6cd9e0db317a35ec6ce78efae9bea9b64e3b2aaf7f70fbcace71b075a00000000000000000000000000000000165a45756d46576175e5f38223a1750dfb9c598457460d12853799edbaf2b621468ee72ba5277a94984f185dd47be7310000000000000000000000000000000015ae40375f1c53a06bffaa805ef450811143db49c4011d515ca831d8dd578d5eec99694e31ecafa76bdba68cfb5a637d', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_54', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a00000000000000000000000000000000016d2c22eabd4a06a5ae67b890a25fbede7d0e96c625b80329b19be6aa861f44b6e85778130d0bdf69f2abd491ee9751a0000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf780000000000000000000000000000000007a9cf48dbe005c5c59b2c731cf4117e5fadc9cb2cd8f486f1ed58b2909092ee8f36d88b8f719db94715641b418ab4240000000000000000000000000000000004ba40d4766b91bf8da1cc2526f62791a1b5f6fc24ffc54b522dd30cde2d29a6a6f81e8429d518710843d43705f3b4e60000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a000000000000000000000000000000000032e4fbb8dab462ff0352c2d3925b0e97ca662189129928ccc1714364e4f01d8b026887d808342091ad442b6e11635910000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf780000000000000000000000000000000007a9cf48dbe005c5c59b2c731cf4117e5fadc9cb2cd8f486f1ed58b2909092ee8f36d88b8f719db94715641b418ab4240000000000000000000000000000000004ba40d4766b91bf8da1cc2526f62791a1b5f6fc24ffc54b522dd30cde2d29a6a6f81e8429d518710843d43705f3b4e60000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a00000000000000000000000000000000016d2c22eabd4a06a5ae67b890a25fbede7d0e96c625b80329b19be6aa861f44b6e85778130d0bdf69f2abd491ee9751a0000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf7800000000000000000000000000000000125742a15d9fe0d485807b4326579b5904c981b9c6ac1e38754379ee662063358f75277321e2624672e99be4be74f687000000000000000000000000000000001546d115c31454dabd79db911c558545c2c15488ce854d741502ff941883cc7d77b3e17a877ee78eb1bb2bc8fa0bf5c50000000000000000000000000000000018724e2b9a2f383329207ee85577805f35d5c5bb9f6903e3c962e57ab7eb9d1639d1e9adbde53499863b299f576325a000000000000000000000000000000000032e4fbb8dab462ff0352c2d3925b0e97ca662189129928ccc1714364e4f01d8b026887d808342091ad442b6e11635910000000000000000000000000000000004506802747afd8777904c46ad9bf0b06859a1b395ca3474a93ca4151ca158d2fd41b3a21e0ce0bc950b3241256e10d800000000000000000000000000000000115f41d2c173c3c2c7ecdff1a4aaa3c2e67c803db7a588d6143fe913961eef743d8b1f9d32e3ef1fc0475f41572faf7800000000000000000000000000000000125742a15d9fe0d485807b4326579b5904c981b9c6ac1e38754379ee662063358f75277321e2624672e99be4be74f687000000000000000000000000000000001546d115c31454dabd79db911c558545c2c15488ce854d741502ff941883cc7d77b3e17a877ee78eb1bb2bc8fa0bf5c5', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_55', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000f1afe9b199362f51cc84edb1d3cf2faf8e5bc0a734a646851ab83e213f73a3734114f255b611ec18db75694dcb0df910000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c7952820000000000000000000000000000000008ceb842a17953578013ceee519a28ef1b37f73e13564def5ffe08a64dc53aa680784e26138176c89269477ee003d16700000000000000000000000000000000159791b6f2c26ed611ca40bfbd2059c15cfec9d073a84254ad9b509ef786d62d17fdc67ab13092cf0b7b3482866f4c320000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000ae6134f1fec83a52e5358db260eb9dc6b918f7a803aae5715854ebee2b9bbecea9ab0d955f2e13e2c47a96b234ecb1a0000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c7952820000000000000000000000000000000008ceb842a17953578013ceee519a28ef1b37f73e13564def5ffe08a64dc53aa680784e26138176c89269477ee003d16700000000000000000000000000000000159791b6f2c26ed611ca40bfbd2059c15cfec9d073a84254ad9b509ef786d62d17fdc67ab13092cf0b7b3482866f4c320000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000f1afe9b199362f51cc84edb1d3cf2faf8e5bc0a734a646851ab83e213f73a3734114f255b611ec18db75694dcb0df910000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c79528200000000000000000000000000000000113259a798069342cb07d8c7f1b183e8493f5446e02ec4d00732c9faa8ebbb7d9e33b1d89dd289372795b8811ffbd944000000000000000000000000000000000469803346bd77c4395166f6862b5316077881b47fdcd06ab9958201ff2a1ff706ae398400236d30ae83cb7d79905e790000000000000000000000000000000010fcf5e5e478ac6442b218ce261878d8f61b405c0b9549512e23ead1f26a2240771993f8c039fbce4008a1707aeaaf25000000000000000000000000000000000ae6134f1fec83a52e5358db260eb9dc6b918f7a803aae5715854ebee2b9bbecea9ab0d955f2e13e2c47a96b234ecb1a0000000000000000000000000000000019cc0ec24da141f27b38a53aef0b3d93c4c2b981c1b248014be277002d39d7bde66f6957a659a89adcd3477dfe4f897a000000000000000000000000000000000e4c01d7425e35be84e3cf806aa76a079cf4557732980f7e8f8ce9a879483e28f223694ed8dd45706e12272f4c79528200000000000000000000000000000000113259a798069342cb07d8c7f1b183e8493f5446e02ec4d00732c9faa8ebbb7d9e33b1d89dd289372795b8811ffbd944000000000000000000000000000000000469803346bd77c4395166f6862b5316077881b47fdcd06ab9958201ff2a1ff706ae398400236d30ae83cb7d79905e79', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_56', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000019275491a51599736722295659dd5589f4e3f558e3d45137a66b4c8066c7514ae66ec35c862cd00bce809db528040c04000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf000000000000000000000000000000001272c63693873e1dabe2c2739310f627d3d9b5bcaa615402c3849ffd8dfe72b40fea4a068064655f2c8f46f074e6518d0000000000000000000000000000000000161a8e5e1de10938e5bce241ae73d76173022127822d744b23e656095c28f2f8d142ceb48b72a1dbc36b6143f8af95000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000000d9bd58946a4d26e3f97e5fe96e574d6f93562c0fb0c187c0c586208fe9a4d9383d3ca22b272ff3eb7e624ad7fb9ea7000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf000000000000000000000000000000001272c63693873e1dabe2c2739310f627d3d9b5bcaa615402c3849ffd8dfe72b40fea4a068064655f2c8f46f074e6518d0000000000000000000000000000000000161a8e5e1de10938e5bce241ae73d76173022127822d744b23e656095c28f2f8d142ceb48b72a1dbc36b6143f8af95000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000019275491a51599736722295659dd5589f4e3f558e3d45137a66b4c8066c7514ae66ec35c862cd00bce809db528040c04000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf00000000000000000000000000000000078e4bb3a5f8a87c9f38e542b03ab6af909d95c84923bebca3ac32a368b283700ec1b5f830ef9aa08d6fb90f8b19591e0000000000000000000000000000000019eaf75bdb6205911235ead4019d390003044963cc02e54b1c0cec4aed54cd3125dabd2ffcc88d5dde3b949ebc06fb16000000000000000000000000000000000f75bc9feb74110697c9f353686910c6246e587dd71d744aab99917f1aea7165b41deb333e6bd14843f28b2232f799830000000000000000000000000000000000d9bd58946a4d26e3f97e5fe96e574d6f93562c0fb0c187c0c586208fe9a4d9383d3ca22b272ff3eb7e624ad7fb9ea7000000000000000000000000000000000040d03956c821010969a67c91a6546800c5aa7ac392b16a9895136c941f4ca9f378c55446161562feace3b5b65f3c4f000000000000000000000000000000000e4b299f9fb25caec655d21c390bdad3c1256ca29faa33466a13aaa6d86310106d95fc8d8a0409fbd228fd3be7965cdf00000000000000000000000000000000078e4bb3a5f8a87c9f38e542b03ab6af909d95c84923bebca3ac32a368b283700ec1b5f830ef9aa08d6fb90f8b19591e0000000000000000000000000000000019eaf75bdb6205911235ead4019d390003044963cc02e54b1c0cec4aed54cd3125dabd2ffcc88d5dde3b949ebc06fb16', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_57', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000a896c5a84cbd03e52ae77000eb0285f5704993664a744a89ff6b346efd2efec1a519b67229a3b87e1f80e6aa17e2946000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a220000000000000000000000000000000018a236ea02b1971d6e193a6eb92e1298956679d86864042fb6a0c36dd91c0e385944d779dedd0149fa8a1b3d6a07949d00000000000000000000000000000000048eac7d116b5a7906bce070e2b51ee7c4c493f1415abdb6fd2d35676036d3b741d14b7135419645a6906018e9d3f150000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000f77a58fb4b4165bf86d30b6349b84780d72b24e8eddce16c73a1f5a06de0638045a64978eb9c477d806f1955e818165000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a220000000000000000000000000000000018a236ea02b1971d6e193a6eb92e1298956679d86864042fb6a0c36dd91c0e385944d779dedd0149fa8a1b3d6a07949d00000000000000000000000000000000048eac7d116b5a7906bce070e2b51ee7c4c493f1415abdb6fd2d35676036d3b741d14b7135419645a6906018e9d3f150000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000a896c5a84cbd03e52ae77000eb0285f5704993664a744a89ff6b346efd2efec1a519b67229a3b87e1f80e6aa17e2946000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a2200000000000000000000000000000000015edb0036ce4f7cdd026d478a1d9a3ecf10d1ac8b210e8fb0900f331d94e7ebc5672884d276feb5bf74e4c295f8160e000000000000000000000000000000001572656d28148c21445ec74560968def9fb2b793b22a55086a039d39967a226cdcdab48d7c1269ba136e9fe7162bb95b000000000000000000000000000000000a87d0ccfb9c01148703d48993de04059d22a4cc48c5dabd2571ad4f7e60d6abfbcc5fb3bf363fd311fec675486c2a20000000000000000000000000000000000f77a58fb4b4165bf86d30b6349b84780d72b24e8eddce16c73a1f5a06de0638045a64978eb9c477d806f1955e818165000000000000000000000000000000000b50dc0957eccf5ad941b148a3824e82464bb7345a05125a0aa64f6ba34e34e767d4f679e9916faaacf82b3c79c9bddc00000000000000000000000000000000087152b3cb0db88776a7144fbafc1b210d150b637ca7148e3df600989231bce613fcf8e310fcc53aa2dc934bcbf86a2200000000000000000000000000000000015edb0036ce4f7cdd026d478a1d9a3ecf10d1ac8b210e8fb0900f331d94e7ebc5672884d276feb5bf74e4c295f8160e000000000000000000000000000000001572656d28148c21445ec74560968def9fb2b793b22a55086a039d39967a226cdcdab48d7c1269ba136e9fe7162bb95b', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_58', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000001450bddfa14033ed8cdb94386715013ed9b2c4f9d65944e9d32c0b3545a085113e173e5afcfccb78878414a464d318400000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c95384000000000000000000000000000000000003c96c6f20d7ac31ee7ca77d11e8d25ea78cdf13e5f4d317752320e059e19196f14c15b5a18ca712f3a7cc6f09be6d4000000000000000000000000000000000ebd71f61fcddf1652675f577bbaeec26b892dd954965b057ffb431d6e37cc5425a2a42a0059482c2bd75adb2a120b0b000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000018bc060c3f6be35b724dee72bcda5cc376dc1f35561f7e70c9fe11eda256edd30aca8c19018433483186beb5b9b2792700000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c95384000000000000000000000000000000000003c96c6f20d7ac31ee7ca77d11e8d25ea78cdf13e5f4d317752320e059e19196f14c15b5a18ca712f3a7cc6f09be6d4000000000000000000000000000000000ebd71f61fcddf1652675f577bbaeec26b892dd954965b057ffb431d6e37cc5425a2a42a0059482c2bd75adb2a120b0b000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000001450bddfa14033ed8cdb94386715013ed9b2c4f9d65944e9d32c0b3545a085113e173e5afcfccb78878414a464d318400000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c9538400000000000000000000000000000000019c47b2347726bd72c33dd3e722d1fb179fe7d93b525c58defdea092f112dd0aaf973ea3573b358e8ac483390f63c3d7000000000000000000000000000000000b439ff419b20783f8b4485ec790be14f8ee1dab9eeeb7b9e7358f83887929cff9095bd4b0fab7d38e27a524d5ed9fa0000000000000000000000000000000000d35ffa284655a94c3050213f4f14e927c162818bbfd0480bad2e07000dd3081274056715c96408f243589d83365c9f20000000000000000000000000000000018bc060c3f6be35b724dee72bcda5cc376dc1f35561f7e70c9fe11eda256edd30aca8c19018433483186beb5b9b2792700000000000000000000000000000000094fdcc2119b4f674b5639653dfabcac59c2adb1ee2ec06c55c3f148c9361351ff0acb2519e4638cb2cde98efaec8f4400000000000000000000000000000000051d5edcbd6eadac808222f0423bada165fcb98f98a89f335c981262b0ca7ea1c536d41aa41b49b25f0c43f53c9538400000000000000000000000000000000019c47b2347726bd72c33dd3e722d1fb179fe7d93b525c58defdea092f112dd0aaf973ea3573b358e8ac483390f63c3d7000000000000000000000000000000000b439ff419b20783f8b4485ec790be14f8ee1dab9eeeb7b9e7358f83887929cff9095bd4b0fab7d38e27a524d5ed9fa0', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_59', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f35556500000000000000000000000000000000120935947070451885bf0c328bd83def193831ab9353844a01130074f16a1ff4d20df8459b5ad6a57d5f1959d37aae920000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e4000000000000000000000000000000000174ffb89d7715866562d9882acb81ce40758644ca3e0decd546c8f5c349b24fce88214956e7540fac36bcfc105cf34a0000000000000000000000000000000003e06c5f607ccf1e2991828034fcdf91106295e7174b4dca21926169451ee58e737d535af45073e2378206e03c81c421000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f3555650000000000000000000000000000000007f7dc55c90fa181c55c9b83b7736ee84b3f19d960318e75661dd22c0546d62f4c9e07b915f9295a3c9fe6a62c84fc190000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e4000000000000000000000000000000000174ffb89d7715866562d9882acb81ce40758644ca3e0decd546c8f5c349b24fce88214956e7540fac36bcfc105cf34a0000000000000000000000000000000003e06c5f607ccf1e2991828034fcdf91106295e7174b4dca21926169451ee58e737d535af45073e2378206e03c81c421000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f35556500000000000000000000000000000000120935947070451885bf0c328bd83def193831ab9353844a01130074f16a1ff4d20df8459b5ad6a57d5f1959d37aae920000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e400000000000000000000000000000000188c12319c08d113e5b8ce2e18802b092401c540294704d291ea09ab336743d45023deb55a6cabf00dc84303efa2b761000000000000000000000000000000001620a58ad903177c218a25360e4ecd465414b59ddc39c4f5459e7137b1921095ab2eaca3bd038c1d827cf91fc37de68a000000000000000000000000000000000344cafaca754db423544657de1b77025164ccc702f8d45697fb73602302a3cb4511c38f0a76a37415d683398f3555650000000000000000000000000000000007f7dc55c90fa181c55c9b83b7736ee84b3f19d960318e75661dd22c0546d62f4c9e07b915f9295a3c9fe6a62c84fc190000000000000000000000000000000014b0862ac988a169342a4abacfebc5e7e7e8f8ff1166c6ca8fa53613c5fc28fd8b02d9c8d5e7a264b2fa59cd33a0f33c000000000000000000000000000000000f0f79631e7790192c18187144388373d52653cf11dd076688877fa9b5cf58e65fe4332874c301563089b9b3fa2322e400000000000000000000000000000000188c12319c08d113e5b8ce2e18802b092401c540294704d291ea09ab336743d45023deb55a6cabf00dc84303efa2b761000000000000000000000000000000001620a58ad903177c218a25360e4ecd465414b59ddc39c4f5459e7137b1921095ab2eaca3bd038c1d827cf91fc37de68a', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_60', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce00000000000000000000000000000000144f438d86d1d808d528ea60c5d343b427124af6e43d4d9652368ddc508daab32fd9c9425cba44fba72e3449e366b1700000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000b15d92f2301075ab0e3215aa72cf9b130bc8e1bcd9fa36375c4b9d7da430ae3e2b24f417336d8729f44542ee7f561d300000000000000000000000000000000197d90090501e8cdea28eb7963231f1a7b5f716cc3a086acb6e7626600d6544132cac943e8d5cefb5daf0a2f8d4006290000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce0000000000000000000000000000000005b1ce5cb2ae0e9175f2bd557d7869233d65008e0f47c52914fa44c4a6234b70eed236bc5499bb0412d0cbb61c98f93b0000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000b15d92f2301075ab0e3215aa72cf9b130bc8e1bcd9fa36375c4b9d7da430ae3e2b24f417336d8729f44542ee7f561d300000000000000000000000000000000197d90090501e8cdea28eb7963231f1a7b5f716cc3a086acb6e7626600d6544132cac943e8d5cefb5daf0a2f8d4006290000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce00000000000000000000000000000000144f438d86d1d808d528ea60c5d343b427124af6e43d4d9652368ddc508daab32fd9c9425cba44fba72e3449e366b1700000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000eeb38bb167edf3f9a38865b9c1eb32633babd6925e56f5bf16c18c91c6deb403bf9b0bd3e1d278d1abaabd1180a48d800000000000000000000000000000000008381e1347dfdcc60f2bc3ce0288dbce917da182fe48c12b049703af5daa1e2ebe136bac87e31045c4ff5d072bfa4820000000000000000000000000000000008797f704442e133d3b77a5f0020aa304d36ce326ea75ca47e041e4d8a721754e0579ce82b96a69142cb7185998d18ce0000000000000000000000000000000005b1ce5cb2ae0e9175f2bd557d7869233d65008e0f47c52914fa44c4a6234b70eed236bc5499bb0412d0cbb61c98f93b0000000000000000000000000000000006a3a773638c0b4a13e7ea399ac319f5ea55ed533aca32a933d69d8198ae997a66d1e32a02683e7fc5c1ec597106848f00000000000000000000000000000000155ef036f60a5b11697581265293cc4c6eebd3fdf500540529b6997c27a3be31212aee5cdfea6cd95d6d5bf83a8ce5aa000000000000000000000000000000000eeb38bb167edf3f9a38865b9c1eb32633babd6925e56f5bf16c18c91c6deb403bf9b0bd3e1d278d1abaabd1180a48d800000000000000000000000000000000008381e1347dfdcc60f2bc3ce0288dbce917da182fe48c12b049703af5daa1e2ebe136bac87e31045c4ff5d072bfa482', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_61', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ec0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d0000000000000000000000000000000007efcb9da7b7ff0f4a1d92489ad76c59158bcc42c5c7a93067772a6d9ef1d3b6df9360d0fc1214e7dec02aaaf7b118bf0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf2300000000000000000000000000000000005c35f3372f1ec9845bd04ea722fbed2be1388abf59e622dd3dafb4b3af49bc5fba9e20235e7e58973fedf4b8b720691000000000000000000000000000000001111d18d621070509805d306a31c109701288fd55d4c0644349deb080c6591b6e852b4f7e009b80019513de7f2fce17d00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d000000000000000000000000000000001211464c91c7e78b00fe156da874407e4eeb7f422dbd698effb9a83357bf226d3f189f2db541eb17db3ed555084e91ec0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf23000000000000000000000000000000000143db2b6c68dfa02055ea2cbd11bee04a663c2d8fde6b0919355d755bbbc5a5e23021dfc7b6c1a76460020b4748da41a0000000000000000000000000000000008ef405cd76f7649b315d4afa02f9c40634ebbaf96390c7b3292e798ea4b646d36594b06d14a47ffa0adc2180d02c92e00000000000000000000000000000000000707c711f77bb425cddc71ecf96a18b6eb0bed7f012c4f6cc9431003f2e1ac17f7c1f68c4965a4fcc273a3db93451d0000000000000000000000000000000007efcb9da7b7ff0f4a1d92489ad76c59158bcc42c5c7a93067772a6d9ef1d3b6df9360d0fc1214e7dec02aaaf7b118bf0000000000000000000000000000000006a90568fa25b401756e3f86b5300c4d3b626dc6274f4685e8a9f56ec5ca2afce36a1fdc6d3414edc8780c4e650f10dc0000000000000000000000000000000012e41e8e0dd10b3ee31fa866753aa5d9db7669153b141114cdb2ef7fa6df5db27aef0cc70e76a741eae504b038ecf23000000000000000000000000000000000143db2b6c68dfa02055ea2cbd11bee04a663c2d8fde6b0919355d755bbbc5a5e23021dfc7b6c1a76460020b4748da41a0000000000000000000000000000000008ef405cd76f7649b315d4afa02f9c40634ebbaf96390c7b3292e798ea4b646d36594b06d14a47ffa0adc2180d02c92e', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_62', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000b4e7355aea3488234552d3dddfa2d1ad3164056407770e6c54f764193c9dc044cb7f2b157a1c4153b2045867d6f99c5000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000000e7e532ee4b892af39f8a3db7a05cc77a6eb0b3d977c17076bac4a52d5ba003a0ac1f902a4257791a45370eb88426a70000000000000000000000000000000016a556050e4905fa74b5061e3874f05cc7a6c5b049bd3bb7c34adef5a77c393239a600542a4401c3e61978ee6515a30e0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000eb29e948adc9e1816c67a7865517fbc91610b2eb30da1d8a1e15c5f62e71a1fd1f40d4d59b23bea7edeba79829010e6000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000000e7e532ee4b892af39f8a3db7a05cc77a6eb0b3d977c17076bac4a52d5ba003a0ac1f902a4257791a45370eb88426a70000000000000000000000000000000016a556050e4905fa74b5061e3874f05cc7a6c5b049bd3bb7c34adef5a77c393239a600542a4401c3e61978ee6515a30e0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000b4e7355aea3488234552d3dddfa2d1ad3164056407770e6c54f764193c9dc044cb7f2b157a1c4153b2045867d6f99c5000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000019192cb74b345d6f577c1d788bab500fea089ad11a0d514ef0760dfbc95556207dffe06e8711a8869fb9c8f1477b840400000000000000000000000000000000035bbbe52b36e09fd666a1980ad6bc7a9cd085d4a9c7d707a3e5f3ab4f34bcf1e505ffaa870ffe3bd3e587119aea079d0000000000000000000000000000000004b3c0e8b240b79c55f02833c2c20fa158e35c941e9e8e48247b96cb1d4923641b97e766637a3ced9fbef275ca9bd1ea000000000000000000000000000000000eb29e948adc9e1816c67a7865517fbc91610b2eb30da1d8a1e15c5f62e71a1fd1f40d4d59b23bea7edeba79829010e6000000000000000000000000000000001310a8cebed1491bb6399abe3a08fb25ad6ca00feb5db62069bc5bd45a57c167aaf06a628a3f18aa990bb389173855b100000000000000000000000000000000134655489380a9ae9cfbc3f4c6a1aa5b6dbe0a994e681915602c1d197c54bf3da6fb2df54eec3634ea87bf3fa92a69740000000000000000000000000000000019192cb74b345d6f577c1d788bab500fea089ad11a0d514ef0760dfbc95556207dffe06e8711a8869fb9c8f1477b840400000000000000000000000000000000035bbbe52b36e09fd666a1980ad6bc7a9cd085d4a9c7d707a3e5f3ab4f34bcf1e505ffaa870ffe3bd3e587119aea079d', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_63', + Gas: 237000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d2900000000000000000000000000000000179c34ba9578d5ff90272a2c7f756794670a047f79a53215da69937152bad0f86576945b12176d3e13cac38d26335c51000000000000000000000000000000000dcc715907e4e17824e24c1f513c09597965941e3ed0aaad6d0c59029b54fb039d716a998c9c418110bd49c5e365507f000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d0000000000000000000000000000000002f2e4467cdc15f1e57d75d6f5c172637df589590863bb437cc5166314e6362b7cd0d7499176b94529979849624cb432000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d2900000000000000000000000000000000179c34ba9578d5ff90272a2c7f756794670a047f79a53215da69937152bad0f86576945b12176d3e13cac38d26335c51000000000000000000000000000000000dcc715907e4e17824e24c1f513c09597965941e3ed0aaad6d0c59029b54fb039d716a998c9c418110bd49c5e365507f000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d29000000000000000000000000000000000264dd2fa407109abaf47d89c3d64542fd6d470579dfe0a98cc73f2fa3f6252bb9356ba39f3c92c1a6343c72d9cc4e5a000000000000000000000000000000000c34a091319b052226395b96f20fa37deb11b766b4b46811fa24799e5b5bfb20813a956524b7be7ea941b63a1c9a5a2c000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d0000000000000000000000000000000002f2e4467cdc15f1e57d75d6f5c172637df589590863bb437cc5166314e6362b7cd0d7499176b94529979849624cb432000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d29000000000000000000000000000000000264dd2fa407109abaf47d89c3d64542fd6d470579dfe0a98cc73f2fa3f6252bb9356ba39f3c92c1a6343c72d9cc4e5a000000000000000000000000000000000c34a091319b052226395b96f20fa37deb11b766b4b46811fa24799e5b5bfb20813a956524b7be7ea941b63a1c9a5a2c000000000000000000000000000000001465358836eb5c6e173e425f675aa231f9c62e9b122584078f2ab9af7440a4ce4ac2cd21ce35a0017b01e4913b40f73d00000000000000000000000000000000170e2da3bca3d0a8659e31df4d8a3a73e681c22beb21577bea6bbc3de1cabff8a1db28b51fdd46ba906767b69db2f679000000000000000000000000000000001360612f80227a2fc50a2dbdb3a49db16bd9f0ae401e2fb69408d990284cec05a1c29696f98b16d83a3dab6eac8678310000000000000000000000000000000001223232338ce1ac91e28b4c00ef4e3561f21f34fc405e479599cced3a86b7c36f541370bfd0176f785326f741699d2900000000000000000000000000000000179c34ba9578d5ff90272a2c7f756794670a047f79a53215da69937152bad0f86576945b12176d3e13cac38d26335c51000000000000000000000000000000000dcc715907e4e17824e24c1f513c09597965941e3ed0aaad6d0c59029b54fb039d716a998c9c418110bd49c5e365507f', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_64', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c853000000000000000000000000000000001643567a0f22b90fefee96c8e2f5851623384c2c68bce9589cdf64c933d494a8d805edce2fd18a6db80f4819391dd1f9000000000000000000000000000000000e4e40ab1969bf9f00ee3b984947ae95bf7b9579bdaeeee926638f9566f8ab26debb4c8d4009535cb6422b2c2ab7282d000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000cab5ed8dc53e9c891df449bd199776adbfc193fc8d6bebf9716610fd4db6def608df059bf29fe43dbf1bf0aa52c1b7f0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c853000000000000000000000000000000001643567a0f22b90fefee96c8e2f5851623384c2c68bce9589cdf64c933d494a8d805edce2fd18a6db80f4819391dd1f9000000000000000000000000000000000e4e40ab1969bf9f00ee3b984947ae95bf7b9579bdaeeee926638f9566f8ab26debb4c8d4009535cb6422b2c2ab7282d000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c8530000000000000000000000000000000003bdbb702a5d2d8a5b2d10ed605627c1413eff588ac82966ca516dd7c2dc617b46a612308182759201efb7e6c6e1d8b2000000000000000000000000000000000bb2d13f201626fb4a2d6c1dfa03fe41a4fbb60b35d623d640cd430b8fb84afd3ff0b371714aaca303bcd4d3d548827e000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000cab5ed8dc53e9c891df449bd199776adbfc193fc8d6bebf9716610fd4db6def608df059bf29fe43dbf1bf0aa52c1b7f0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c8530000000000000000000000000000000003bdbb702a5d2d8a5b2d10ed605627c1413eff588ac82966ca516dd7c2dc617b46a612308182759201efb7e6c6e1d8b2000000000000000000000000000000000bb2d13f201626fb4a2d6c1dfa03fe41a4fbb60b35d623d640cd430b8fb84afd3ff0b371714aaca303bcd4d3d548827e000000000000000000000000000000000ab6e2a649ed97be4574603b3b4a210f0748d8cddf132079e0543ec776ceb63902e48598b7698cf79fd5130cebaf0250000000000000000000000000000000000d55b3115d2bfcd1b93c631a71b2356c887b32452aae53ffd01a719121d58834be1e0fa4f22a01bbde0d40f55ad38f2c0000000000000000000000000000000002fec3b2e25d9300b9757cbe77857d7220d91a53fc29f3b7a0da5c4e0815882d1cc51a40a60fa8e1ae01296c209eda0a00000000000000000000000000000000041ff1a77aca41f7aaeec13fb5238c24d038e2e566b611203c430d7ac6251d545ed4a60e9e0087d6baa36272c7b1c853000000000000000000000000000000001643567a0f22b90fefee96c8e2f5851623384c2c68bce9589cdf64c933d494a8d805edce2fd18a6db80f4819391dd1f9000000000000000000000000000000000e4e40ab1969bf9f00ee3b984947ae95bf7b9579bdaeeee926638f9566f8ab26debb4c8d4009535cb6422b2c2ab7282d', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_65', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f700000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000a27fe0a29c761ce29a731ead969b1db3ae9ef4c05493cc370a128d97ef956c55d9a500991b3e7bf9600383633778ebb000000000000000000000000000000000dbb997ef4970a472bfcf03e959acb90bb13671a3d27c91698975a407856505e93837f46afc965363f21c35a3d194ec0000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf1000000000000000000000000000000001528dcaae381eb764333992e28ed557034ba5413c5b64df40ef3150d2771e5d1cd8c211ca22075c7436e2582960ab3b400000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000a27fe0a29c761ce29a731ead969b1db3ae9ef4c05493cc370a128d97ef956c55d9a500991b3e7bf9600383633778ebb000000000000000000000000000000000dbb997ef4970a472bfcf03e959acb90bb13671a3d27c91698975a407856505e93837f46afc965363f21c35a3d194ec0000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f700000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000fd913e00fb884cc217475cb69e1fafc298d5c38ee3bd5fbf68fa9c777b79f5ec111aff51fa0184023fec7c9cc881bf0000000000000000000000000000000000c45786b44e8dc531f1eb777adb0e146a963e46ab65d49a8ce9978607e5aa5c58b2880b8018a9ac97add3ca5c2e65beb000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf1000000000000000000000000000000001528dcaae381eb764333992e28ed557034ba5413c5b64df40ef3150d2771e5d1cd8c211ca22075c7436e2582960ab3b400000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000fd913e00fb884cc217475cb69e1fafc298d5c38ee3bd5fbf68fa9c777b79f5ec111aff51fa0184023fec7c9cc881bf0000000000000000000000000000000000c45786b44e8dc531f1eb777adb0e146a963e46ab65d49a8ce9978607e5aa5c58b2880b8018a9ac97add3ca5c2e65beb000000000000000000000000000000001654e99ebd103ed5709ae412a6df1751add90d4d56025667a4640c1d51435e7cad5464ff2c8b08cca56e34517b05acf10000000000000000000000000000000004d8353f55fdfb2407e80e881a5e57672fbcf7712dcec4cb583dbd93cf3f1052511fdee20f338a387690da7d69f4f6f700000000000000000000000000000000123a19e1427bac55eabdaec2aeeefadfca6e2b7581a5726c393bede2efd78af04e6cb986aa8d8d5c845bbbc28d62e7a00000000000000000000000000000000018026687f43591dac03a16fce0c4b8020469ec309bdbf9f0f270cf75e262abf4ae55d46f0b4ff130b7bbe2430bd0c9f4000000000000000000000000000000000a27fe0a29c761ce29a731ead969b1db3ae9ef4c05493cc370a128d97ef956c55d9a500991b3e7bf9600383633778ebb000000000000000000000000000000000dbb997ef4970a472bfcf03e959acb90bb13671a3d27c91698975a407856505e93837f46afc965363f21c35a3d194ec0', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_66', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d200000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000eb3f5d24d1a4f520032534f6f81a6806c54df33cbd10c30203423aa4f33620b474cda321e924802b636daaeb34400470000000000000000000000000000000016f004f1dfbf140de042e4f57303928a576d9064f2da5b3ad392331f5c43327c7d2a6fd57456d5ef58b54a3e5ec275080000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c5100000000000000000000000000000000010ee94e9470765ac32b5648f1cd7d745a793dbd46dc95fa32db86929eec385e50cb35755120480be0956a2a342a46d900000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000eb3f5d24d1a4f520032534f6f81a6806c54df33cbd10c30203423aa4f33620b474cda321e924802b636daaeb34400470000000000000000000000000000000016f004f1dfbf140de042e4f57303928a576d9064f2da5b3ad392331f5c43327c7d2a6fd57456d5ef58b54a3e5ec275080000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d200000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000b4d1c17ec6597484ae95466d3ca0656f8226c5127b4068f46fcaef6a77d9418d75f25cc92c1b7fd03c825514cbbaa640000000000000000000000000000000003110cf859c0d28c6ad8c2c0d0481a4d0d09bb2000aab784939e9f819a6dc3a7a18190293cfd2a106149b5c1a13d35a30000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c5100000000000000000000000000000000010ee94e9470765ac32b5648f1cd7d745a793dbd46dc95fa32db86929eec385e50cb35755120480be0956a2a342a46d900000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000b4d1c17ec6597484ae95466d3ca0656f8226c5127b4068f46fcaef6a77d9418d75f25cc92c1b7fd03c825514cbbaa640000000000000000000000000000000003110cf859c0d28c6ad8c2c0d0481a4d0d09bb2000aab784939e9f819a6dc3a7a18190293cfd2a106149b5c1a13d35a30000000000000000000000000000000001bb1e11a1ccc0b70ce46114caca7ac1aba2a607fea8c6a0e01785e17559b271a0e8b5afbfa8705ecb77420473e81c510000000000000000000000000000000018f2289ba50f703f87f0516d517e2f6309fe0dc7aca87cc534554c0e57c4bdc5cde0ca896033b7f3d96995d5cbd563d200000000000000000000000000000000000353798691ffba215b6458a47823d149e4e2e48c9e5f65df61d6b995889f3b0e2b34824e4ffa73296d03148c607c26000000000000000000000000000000001190ba585a928413dc3cef3d77b2cff99b053cadcb13b2529c74171a094d479a259678dd43a3ef2a2e597223eb7fd35c000000000000000000000000000000000eb3f5d24d1a4f520032534f6f81a6806c54df33cbd10c30203423aa4f33620b474cda321e924802b636daaeb34400470000000000000000000000000000000016f004f1dfbf140de042e4f57303928a576d9064f2da5b3ad392331f5c43327c7d2a6fd57456d5ef58b54a3e5ec27508', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_67', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531f0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d0000000000000000000000000000000002a36d5efd3381c35ff4f361cd813a96c3e5185141c5985073b45d1319c5f392442b7aa6a253b7eb22d1b5052812be00000000000000000000000000000000000f745dd17966b6befa7f740ea360241162505d6269226ffda90546863d0fff124d8fea13c763cfb69c2f8f12b81d431f0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab0000000000000000000000000000000004acd0ba7577ffe37bdeeaf5810b5a8a4a6b51c3c02bec4e0c6f0cfb4f12283120d283c12ecb7e4be7063fefb37a578c0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d0000000000000000000000000000000002a36d5efd3381c35ff4f361cd813a96c3e5185141c5985073b45d1319c5f392442b7aa6a253b7eb22d1b5052812be00000000000000000000000000000000000f745dd17966b6befa7f740ea360241162505d6269226ffda90546863d0fff124d8fea13c763cfb69c2f8f12b81d431f0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531f0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d00000000000000000000000000000000175da48b3c4c64d6eb26b45475ca7240a0923333b1bf7a6ef37c758ddceb0291da8085580f004814972d4afad7ececab000000000000000000000000000000000a8cb418c0192fdb509c33a79feb88c60226ee228a62a2c1be2b8c1ab9a0f711d11c15eae9f030491dcf70ed47e2678c0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab0000000000000000000000000000000004acd0ba7577ffe37bdeeaf5810b5a8a4a6b51c3c02bec4e0c6f0cfb4f12283120d283c12ecb7e4be7063fefb37a578c0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d00000000000000000000000000000000175da48b3c4c64d6eb26b45475ca7240a0923333b1bf7a6ef37c758ddceb0291da8085580f004814972d4afad7ececab000000000000000000000000000000000a8cb418c0192fdb509c33a79feb88c60226ee228a62a2c1be2b8c1ab9a0f711d11c15eae9f030491dcf70ed47e2678c0000000000000000000000000000000012ecb4c2f259efb4416025e236108eff7862e54f796605cc7eb12f3e5275c80ef42aadd2acfbf84d5206f6884d8e3eab000000000000000000000000000000001554412fc407e6b6cf3cbcc0c240524d1a0bf9c1335926715ac1c5a5a79ecdf2fdd97c3d828881b3d2f8c0104c85531f0000000000000000000000000000000018b0cd0360c5d5bf8254725c19976345cd84d32d0d770286444fe29dfdbc495dd58407ee8d48ec1004971f249453b8460000000000000000000000000000000009a6ea13f5a5a279ec3bb86cc028a1685d84135ed5fe99cd6b6fb380a42c3af5497e3ba5ea558618487cf953172a376d0000000000000000000000000000000002a36d5efd3381c35ff4f361cd813a96c3e5185141c5985073b45d1319c5f392442b7aa6a253b7eb22d1b5052812be00000000000000000000000000000000000f745dd17966b6befa7f740ea360241162505d6269226ffda90546863d0fff124d8fea13c763cfb69c2f8f12b81d431f', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_68', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e7879000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000000397dbdcc3edf976e8c507f5e70299da8c7765772115bf8edf7dc9024050c2ed98746c2bf7dd4400ab1fb89af991e43f00000000000000000000000000000000139bd5f917f59e2cb6c41c59024c12cdaf95285f3947b80267f36e3bd2701f9548b561c49003fc5ddeee3fe7bc8f5b5b00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e20000000000000000000000000000000012ee6884c9d68bdabe8f4aa92aa613129993aad6a7aafffef1922c910cbd3f8b4ae8a810c59a0b9de0a79d4e5db13232000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000000397dbdcc3edf976e8c507f5e70299da8c7765772115bf8edf7dc9024050c2ed98746c2bf7dd4400ab1fb89af991e43f00000000000000000000000000000000139bd5f917f59e2cb6c41c59024c12cdaf95285f3947b80267f36e3bd2701f9548b561c49003fc5ddeee3fe7bc8f5b5b00000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e7879000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000001669360d7591ed2362569fc05c4912fcd7ffe60dd26f533087b3099eb6603336863793d2b976bbff0edf4765066dc66c0000000000000000000000000000000006653bf1218a486d94578b5d40ff9a09b4e22325ba3d5abcff3d64652440d68ed5f69e3a215003a1db10c01843704f5000000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e20000000000000000000000000000000012ee6884c9d68bdabe8f4aa92aa613129993aad6a7aafffef1922c910cbd3f8b4ae8a810c59a0b9de0a79d4e5db13232000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000001669360d7591ed2362569fc05c4912fcd7ffe60dd26f533087b3099eb6603336863793d2b976bbff0edf4765066dc66c0000000000000000000000000000000006653bf1218a486d94578b5d40ff9a09b4e22325ba3d5abcff3d64652440d68ed5f69e3a215003a1db10c01843704f5000000000000000000000000000000000010dac3e5885cc55f3e53b3fdd5d28b2d78ceeea2b669757a187de0ce3f28b586e451b119cdb7dc8b97d603f2bb700e2000000000000000000000000000000000712a9656fa95abf8c8c5d0d18a599c4cae3a0ae4bda12c0759ea60fe9f3b698d3c357edebb9f461d95762b1a24e7879000000000000000000000000000000001431c5161fc51024c5708496a1f9545c3d4c05ef9e2c91154e22ebfe251017fc61ba54c679ba2ad6b8314bfd8d6272c900000000000000000000000000000000098f2e8b6d3fcf9fb27e912af57b45d3d35a7c5471b9ea2c85262c0efb44c435cd949f23d7d40f14b6b6d4d92cb8412e000000000000000000000000000000000397dbdcc3edf976e8c507f5e70299da8c7765772115bf8edf7dc9024050c2ed98746c2bf7dd4400ab1fb89af991e43f00000000000000000000000000000000139bd5f917f59e2cb6c41c59024c12cdaf95285f3947b80267f36e3bd2701f9548b561c49003fc5ddeee3fe7bc8f5b5b', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_69', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b00000000000000000000000000000000197ed996d62fc0628d8ea4adee487df31c794e05e7c327aaa140c6be0109031bb763c5f84bc35a0597dc61e93d23a9bf000000000000000000000000000000001056c1f3c6ae36be26430d142d34b0e807685c79935496414e004cb85900d85a18454bde9c0f2650f19db35eb3dd468d000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e5590000000000000000000000000000000006abf7ef1d5e3484992225b5a59791a68cc7e1e0f8aaf2415a9f759f2dff53f62aecf23e0443fdf37bb3775be9f5c981000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b00000000000000000000000000000000197ed996d62fc0628d8ea4adee487df31c794e05e7c327aaa140c6be0109031bb763c5f84bc35a0597dc61e93d23a9bf000000000000000000000000000000001056c1f3c6ae36be26430d142d34b0e807685c79935496414e004cb85900d85a18454bde9c0f2650f19db35eb3dd468d000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b000000000000000000000000000000000082385363502637bd8d030855032ee447fdfd7f0bc1eb14c5f00be2f5a7f30867483a066590a5fa22229e16c2dc00ec0000000000000000000000000000000009aa4ff672d1afdc24d89aa21616fbef5d0eef0b60307c7e193085e89db01dca0666b4201544d9aec8614ca14c22641e000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e5590000000000000000000000000000000006abf7ef1d5e3484992225b5a59791a68cc7e1e0f8aaf2415a9f759f2dff53f62aecf23e0443fdf37bb3775be9f5c981000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b000000000000000000000000000000000082385363502637bd8d030855032ee447fdfd7f0bc1eb14c5f00be2f5a7f30867483a066590a5fa22229e16c2dc00ec0000000000000000000000000000000009aa4ff672d1afdc24d89aa21616fbef5d0eef0b60307c7e193085e89db01dca0666b4201544d9aec8614ca14c22641e000000000000000000000000000000001889ef0e20d5ddbeeb4380b97ed7d4be97ef0def051d232598b2459a72845d97fa5c1264802ab18d76b15d8fbd25e55900000000000000000000000000000000135519fb1c21b215b1f982009db41b30d7af69a3fada207e0c915d01c8b1a22df3bf0dc0ad10020c3e4b88a41609e12a000000000000000000000000000000000caecf650a12bb629ebd3b978ef9c2d4486f8ce21d515451ecdf01d27740f41b719d5a952e737c83641953a8c8b3a1bb000000000000000000000000000000001641ca29ff6016af335499dfc7167b3d961a25b7f61008c27b3cb13d3cb28fb5096413b1c7f1ca18e5d3b5017d6fed1b00000000000000000000000000000000197ed996d62fc0628d8ea4adee487df31c794e05e7c327aaa140c6be0109031bb763c5f84bc35a0597dc61e93d23a9bf000000000000000000000000000000001056c1f3c6ae36be26430d142d34b0e807685c79935496414e004cb85900d85a18454bde9c0f2650f19db35eb3dd468d', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_70', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f50000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f0000000000000000000000000000000008789ffe0a8676c6a56742a30a48e5e65b88aafd71859d704fb9f69e5e274ccb6942bc51ad36c5671406052aacf19df9000000000000000000000000000000000c7607f4fc69a25aff00a54369f213c4587404644358da4abf26d151dfa4905ba9731dcfb12e2a3f2c551cacd0f4e47f0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf9250000000000000000000000000000000001b7a86c4142843a854dd0937bdbfd833a34fb15303d753e3f41eaf19f4fd9a6af785804d5ae2c3b99044cc13e6ca4b60000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f0000000000000000000000000000000008789ffe0a8676c6a56742a30a48e5e65b88aafd71859d704fb9f69e5e274ccb6942bc51ad36c5671406052aacf19df9000000000000000000000000000000000c7607f4fc69a25aff00a54369f213c4587404644358da4abf26d151dfa4905ba9731dcfb12e2a3f2c551cacd0f4e47f0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f50000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f00000000000000000000000000000000118871ec2ef96fd3a5b465133902c6f108eea08781ff754f1776dc029889a958b56943ad041d3a98a5f8fad5530e0cb2000000000000000000000000000000000d8b09f53d16443f4c1b0272d95999130c034720b02c3874a80a014f170c65c87538e22f0025d5c08da9e3532f0ac62c0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf9250000000000000000000000000000000001b7a86c4142843a854dd0937bdbfd833a34fb15303d753e3f41eaf19f4fd9a6af785804d5ae2c3b99044cc13e6ca4b60000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f00000000000000000000000000000000118871ec2ef96fd3a5b465133902c6f108eea08781ff754f1776dc029889a958b56943ad041d3a98a5f8fad5530e0cb2000000000000000000000000000000000d8b09f53d16443f4c1b0272d95999130c034720b02c3874a80a014f170c65c87538e22f0025d5c08da9e3532f0ac62c0000000000000000000000000000000008726a32d489a5ea1c1b314dc4d400d995d0eb8b49d47e65a6ac8fd0e6ec0cda1c637ee314c0c5d1ad72cd3588ebf925000000000000000000000000000000001849697df83d625fc5cdd722c76faf542a42506fc3479d8127eee7af57611c7d6f33a7f9dba5d3c420fab33ec19305f50000000000000000000000000000000009c7164f8d40c7e9ca571c46f8edf1c4a961779e55f6b10ffc44d76da78adadb83195d757949be39631c6a53d2d67fae0000000000000000000000000000000012cd5149125e7cc21bb5349be7fe03d5854ee73ba515021b6dc87e81ce1e1fa3e386fcb0de80977b9329e72ad54f929f0000000000000000000000000000000008789ffe0a8676c6a56742a30a48e5e65b88aafd71859d704fb9f69e5e274ccb6942bc51ad36c5671406052aacf19df9000000000000000000000000000000000c7607f4fc69a25aff00a54369f213c4587404644358da4abf26d151dfa4905ba9731dcfb12e2a3f2c551cacd0f4e47f', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_71', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567300000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000b060965391bfd4afe3271c6ddb91eecb8c7a60451c469d63bb178b1361617000f589c33c35b5deda2f072c6edf2eb370000000000000000000000000000000011c8c988379cd2b82cb8ebd81c3e14d2c01c09dde5690b97623c0876c7554f52ccbaa33d17fb0f0cf331cc85749340cd000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000008151a15a13daeee49a82737118d488005fa7ed1869bc458f8af88e7341e0a48b5d8f129f6eb071fb07c11887f4d543800000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000b060965391bfd4afe3271c6ddb91eecb8c7a60451c469d63bb178b1361617000f589c33c35b5deda2f072c6edf2eb370000000000000000000000000000000011c8c988379cd2b82cb8ebd81c3e14d2c01c09dde5690b97623c0876c7554f52ccbaa33d17fb0f0cf331cc85749340cd000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567300000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000efb08850063e94f4ce935ef65928deaabafa580a1c0a8e92b7f59efc09adf240f5363caedf8a212170e8d39120cbf74000000000000000000000000000000000838486201e313e21e62bbde270d9804a45b41a70e1c072804f4ca2a2f5ba6d151f15cc19958f0f2c6cd337a8b6c69de000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000008151a15a13daeee49a82737118d488005fa7ed1869bc458f8af88e7341e0a48b5d8f129f6eb071fb07c11887f4d543800000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000efb08850063e94f4ce935ef65928deaabafa580a1c0a8e92b7f59efc09adf240f5363caedf8a212170e8d39120cbf74000000000000000000000000000000000838486201e313e21e62bbde270d9804a45b41a70e1c072804f4ca2a2f5ba6d151f15cc19958f0f2c6cd337a8b6c69de000000000000000000000000000000001688c63e325569855bc2e51d668cef112b2479efa33519fe7f45eab89e275e2c4652cf8c2814f179935ccf1d24d8bd0f0000000000000000000000000000000011ebf7d4984237ac0173807f31be64575e7cccb36ce94e666e8149b9c292ebdb68d30ed4ba68f8e00982ee7780b2567300000000000000000000000000000000093c423917d10edc429acd927def56ab4f07254b3892762aa7056f24224528aa0f528fe8538ca996ca63506c84af73270000000000000000000000000000000003fd3ba68878485e25ccaa2539eed0a97743ae9f5b848e9d83c8ea60f7ad0f1cc6d94a59498f79dcab2bfcc2fdbacfed000000000000000000000000000000000b060965391bfd4afe3271c6ddb91eecb8c7a60451c469d63bb178b1361617000f589c33c35b5deda2f072c6edf2eb370000000000000000000000000000000011c8c988379cd2b82cb8ebd81c3e14d2c01c09dde5690b97623c0876c7554f52ccbaa33d17fb0f0cf331cc85749340cd', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_72', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc300000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000f05a111b41a54e0ca78c3a1fff3b80bee7c1505a06b9a4faf36a73b87121d2952cc4f4c4e0dcb6633cad12b0caffc620000000000000000000000000000000018daa0f9a2bb347517eee63463b9d6a5e850446e8a94d0986f2921bf81a9f7541e8fee9d7bbb6d9181021af945fce3e3000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a07060000000000000000000000000000000000876cf6553b21053e0d7a4449cd137fd946f2de0f7032f535f54914a8ae7da5afbe765bdfa3a0cdea0a50e1ed43bce800000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000f05a111b41a54e0ca78c3a1fff3b80bee7c1505a06b9a4faf36a73b87121d2952cc4f4c4e0dcb6633cad12b0caffc620000000000000000000000000000000018daa0f9a2bb347517eee63463b9d6a5e850446e8a94d0986f2921bf81a9f7541e8fee9d7bbb6d9181021af945fce3e3000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc300000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000afb70d8856591b980a2e4144357f4cb75fb367f5319786fb7fa2b656f9ed8facbdfb0b26346349986342ed4f34fae4900000000000000000000000000000000012670f096c4b225332cc181df91d6317c27071668f04226f807b0e17506fed0001c11613598926e38fce506ba02c6c8000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a07060000000000000000000000000000000000876cf6553b21053e0d7a4449cd137fd946f2de0f7032f535f54914a8ae7da5afbe765bdfa3a0cdea0a50e1ed43bce800000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000afb70d8856591b980a2e4144357f4cb75fb367f5319786fb7fa2b656f9ed8facbdfb0b26346349986342ed4f34fae4900000000000000000000000000000000012670f096c4b225332cc181df91d6317c27071668f04226f807b0e17506fed0001c11613598926e38fce506ba02c6c8000000000000000000000000000000000bb6f731b345bb1319b9acab09c186449a51dad8b6526251bc58e958cfd933137067e6f778b019f131cc7b23e08a0706000000000000000000000000000000001979a4f3e444c5950d0e2d71f97e99578b3058a6e414dfca313b898c4e02787e6eed89a2d1b05f31cff4af1e12bbedc300000000000000000000000000000000039d8e90425810a0b2fb5c915905863eb2da363ad4188e42cedce678bdd0f51eca0a96b78ab9e082d59dcd10e3c3c97a000000000000000000000000000000001973250dc31d16f658323d021dddc5439ef4396b6ed735f108cd7b27feb1b508daf863ab6431a77ec0b10cf7e001244f000000000000000000000000000000000f05a111b41a54e0ca78c3a1fff3b80bee7c1505a06b9a4faf36a73b87121d2952cc4f4c4e0dcb6633cad12b0caffc620000000000000000000000000000000018daa0f9a2bb347517eee63463b9d6a5e850446e8a94d0986f2921bf81a9f7541e8fee9d7bbb6d9181021af945fce3e3', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_73', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a9035050000000000000000000000000000000017d9e9e2008501981068cb0403e73c270d99defd468cc9dc2d5bbc57750a4a58236f8f7a8df4f8b607095b6a80e7de49000000000000000000000000000000000ebddf4fc74f25be3c358b72a20d1c093f980adfc943b898266592f691e11413c60151a0085d6c9aec8c2d329abbac0d00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c2000000000000000000000000000000001093356407cff41779ce8f3d53dfe7a04edc8ce7192ddfeeb4329c38152cf1875d0df9ffeced95f1c7fae7d124649f21000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a9035050000000000000000000000000000000017d9e9e2008501981068cb0403e73c270d99defd468cc9dc2d5bbc57750a4a58236f8f7a8df4f8b607095b6a80e7de49000000000000000000000000000000000ebddf4fc74f25be3c358b72a20d1c093f980adfc943b898266592f691e11413c60151a0085d6c9aec8c2d329abbac0d00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a903505000000000000000000000000000000000227280838fae5023ab2dcb23f6470b056dd6c87acf848e339d5164981a6abcbfb3c7084235f0749b2f5a4957f17cc62000000000000000000000000000000000b43329a7230c0dc0ee61c43a13e90ce24df40a52a415a2740cb3faa64cfe21058aaae5ea8f69364cd72d2cd6543fe9e00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c2000000000000000000000000000000001093356407cff41779ce8f3d53dfe7a04edc8ce7192ddfeeb4329c38152cf1875d0df9ffeced95f1c7fae7d124649f21000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a903505000000000000000000000000000000000227280838fae5023ab2dcb23f6470b056dd6c87acf848e339d5164981a6abcbfb3c7084235f0749b2f5a4957f17cc62000000000000000000000000000000000b43329a7230c0dc0ee61c43a13e90ce24df40a52a415a2740cb3faa64cfe21058aaae5ea8f69364cd72d2cd6543fe9e00000000000000000000000000000000078cca0bfd6957f9aff9731b45fdbdbeca6691f6fe6bf0b7847859c77478037e14864b202b235953ac7da231367324c200000000000000000000000000000000096ddc8631aff282d14d1878ef6bc537159abe9dda5732d0b2fe3668e184049cc19e05fec4666a0df204182edb9b0b8a000000000000000000000000000000000eff44a5e3b9fc8ffe31771fbcabea6efbd68384c5931216a2b7465aaa2566ee116b7daeea632677f35379107f7334f0000000000000000000000000000000000c3c942373f69c2c9631cef1c6bbb1a4567d5b95500409d4f2c6bf4a66ee263e6f167e22790badea0eac4a541a9035050000000000000000000000000000000017d9e9e2008501981068cb0403e73c270d99defd468cc9dc2d5bbc57750a4a58236f8f7a8df4f8b607095b6a80e7de49000000000000000000000000000000000ebddf4fc74f25be3c358b72a20d1c093f980adfc943b898266592f691e11413c60151a0085d6c9aec8c2d329abbac0d', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_74', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa300000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000001fdc4256cc997934a65c68ab9767b09c7aad14b5765dbeedb72ab2429231cb333ab9f9143414359376d76857e8972d9000000000000000000000000000000001362f417875259b47cfd9e4c5feda52b949dcbf5b8178318428fd3e70c384020e58f515b9a24af5597cfa037d42491c6000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e0000000000000000000000000000000007007c89288b69f16870dc857a02cd071db8178e578fd2b78fcd5edb5050dcded107a1c1c0071d45e4c4af364bc9400800000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000001fdc4256cc997934a65c68ab9767b09c7aad14b5765dbeedb72ab2429231cb333ab9f9143414359376d76857e8972d9000000000000000000000000000000001362f417875259b47cfd9e4c5feda52b949dcbf5b8178318428fd3e70c384020e58f515b9a24af5597cfa037d42491c6000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa300000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000018034dc4ccb64f0700b5e12b89d531cd9ccc7a399c1f36d08bbe277ccd8dd970eb00606d6e12bca68291897a817637d200000000000000000000000000000000069e1dd2b22d8ce5ce1e0969e35e07abcfd97f8f3b6d8fa724a0feb9ea78b603391caea3172f50aa222f5fc82bdb18e5000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e0000000000000000000000000000000007007c89288b69f16870dc857a02cd071db8178e578fd2b78fcd5edb5050dcded107a1c1c0071d45e4c4af364bc9400800000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000018034dc4ccb64f0700b5e12b89d531cd9ccc7a399c1f36d08bbe277ccd8dd970eb00606d6e12bca68291897a817637d200000000000000000000000000000000069e1dd2b22d8ce5ce1e0969e35e07abcfd97f8f3b6d8fa724a0feb9ea78b603391caea3172f50aa222f5fc82bdb18e5000000000000000000000000000000000b3a1dfe2d1b62538ed49648cb2a8a1d66bdc4f7a492eee59942ab810a306876a7d49e5ac4c6bb1613866c158ded993e000000000000000000000000000000001300956110f47ca8e2aacb30c948dfd046bf33f69bf54007d76373c5a66019454da45e3cf14ce2b9d53a50c9b4366aa300000000000000000000000000000000081da74d812a6718e351c062e93f9edb24eff830be5c44c3f21cca606f5b1287de8ba65a60d42cbf9740c9522fcdc9eb000000000000000000000000000000000eb1d38fd394b7e78dfaeb3b3b97d3d928c16472ee74ae0be1ec3efa510b9bb64cec369793219ceab55a0ed0ece23de80000000000000000000000000000000001fdc4256cc997934a65c68ab9767b09c7aad14b5765dbeedb72ab2429231cb333ab9f9143414359376d76857e8972d9000000000000000000000000000000001362f417875259b47cfd9e4c5feda52b949dcbf5b8178318428fd3e70c384020e58f515b9a24af5597cfa037d42491c6', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_75', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c8000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000010fb029e35b3f6e156b8751415f180ee3960cd3bb6ba9b8e456715ec70b1ba1410b8bfb77998f744d3f462533b59e26c000000000000000000000000000000001472654d9aa210a41d74e3661e05a9eb6b292719b46aa65f94b6abd514bf05f679dae89d21008245d79a381b0d7f51be0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000a76ccda2ca736ce935b4b88e08bbf183f69e2b3f5a471662a5de571976e7d4264021db88b919c896bbbb8128732c3e3000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000010fb029e35b3f6e156b8751415f180ee3960cd3bb6ba9b8e456715ec70b1ba1410b8bfb77998f744d3f462533b59e26c000000000000000000000000000000001472654d9aa210a41d74e3661e05a9eb6b292719b46aa65f94b6abd514bf05f679dae89d21008245d79a381b0d7f51be0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c8000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000009060f4c03cbefb8f46332a22d5a2be92b167e493cca773121c9bcb485ff3c100df3404737bb08bae60a9dacc4a5c83f00000000000000000000000000000000058eac9c9eddd5f62da6c450254602ebf94e246b3f1a6c5fd27a26cbe1f1f02da4d1176190537db9e264c7e4f28058ed0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000a76ccda2ca736ce935b4b88e08bbf183f69e2b3f5a471662a5de571976e7d4264021db88b919c896bbbb8128732c3e3000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000009060f4c03cbefb8f46332a22d5a2be92b167e493cca773121c9bcb485ff3c100df3404737bb08bae60a9dacc4a5c83f00000000000000000000000000000000058eac9c9eddd5f62da6c450254602ebf94e246b3f1a6c5fd27a26cbe1f1f02da4d1176190537db9e264c7e4f28058ed0000000000000000000000000000000007c00b3e7e50a860e99cdc92235f45a555c343304a067a71b6aaade016ef99bc50e3b2c5e3335d4bdacb816d3c765630000000000000000000000000000000000f8a45100cd8afcbb7c05c2d62bfedbf250d68d0fde0a1593cd2ed2f5f4278e1baa9e24625c263764e4347ed78cce6c8000000000000000000000000000000000b8e764aa5afa4a6e8227d1bc720eeffd72d963458a4963a3bbe697d3da11186a30d90f7a4eda5630f6967095816913300000000000000000000000000000000085d05b570cd58def6ac2f7e80dc18658dc5d0e6a1f5a5cf4d18745e03494654eb1a6d5399ec2c5288890ade446317d00000000000000000000000000000000010fb029e35b3f6e156b8751415f180ee3960cd3bb6ba9b8e456715ec70b1ba1410b8bfb77998f744d3f462533b59e26c000000000000000000000000000000001472654d9aa210a41d74e3661e05a9eb6b292719b46aa65f94b6abd514bf05f679dae89d21008245d79a381b0d7f51be', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_76', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb21100000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d7000000000000000000000000000000000520cfc8c536a1d4e685c4eacbc2000d70abd72e1bf8ce3839d79f5cfa069ed31aafb15542f23b8d1af678bab05a2d410000000000000000000000000000000017cfffda12d21c98b79ac31c5bb696783afb7d69c2bedf0fb070cf7714959db14957a4763564b65b7ed214d7b48d399c000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c00000000000000000000000000000000124a601a06d5094945ec8528c5457ea3f8ca710137b6ad48ee7ad93db53c056059dbc8b02d9edf5e2786c575a0bff89a00000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d7000000000000000000000000000000000520cfc8c536a1d4e685c4eacbc2000d70abd72e1bf8ce3839d79f5cfa069ed31aafb15542f23b8d1af678bab05a2d410000000000000000000000000000000017cfffda12d21c98b79ac31c5bb696783afb7d69c2bedf0fb070cf7714959db14957a4763564b65b7ed214d7b48d399c000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb21100000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d70000000000000000000000000000000014e04221744944c56495e2cb7789acc9f3cb7456d78c44872d593343fcaa575103fc4ea96e61c4729f0887454fa57d6a000000000000000000000000000000000231121026adca019380e499e795165f297bce1b30c633afb6c00329e21b5872d5545b887bef49a43b2ceb284b72710f000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c00000000000000000000000000000000124a601a06d5094945ec8528c5457ea3f8ca710137b6ad48ee7ad93db53c056059dbc8b02d9edf5e2786c575a0bff89a00000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d70000000000000000000000000000000014e04221744944c56495e2cb7789acc9f3cb7456d78c44872d593343fcaa575103fc4ea96e61c4729f0887454fa57d6a000000000000000000000000000000000231121026adca019380e499e795165f297bce1b30c633afb6c00329e21b5872d5545b887bef49a43b2ceb284b72710f000000000000000000000000000000001517dd04b165c50d2b1ef2f470c821c080f604fe1a23f2fa5481f3a63e0f56e05c89c7403d4067a5f6e59d4a338d0b5c0000000000000000000000000000000007b6b1d032aadd51052f228d7e062e336bacda83bbce657678b5f9634174f0c3c4d0374e83b520a192783a8a5f3fb21100000000000000000000000000000000042280b112fdbbd94f647e5b1f4b51d864f85063a5b66e1f1fe5b1a8d280f9bf1db81ad3588f93f8801ff1a3f66b96330000000000000000000000000000000001e0887904228790d03d8b6d17bebdd8659deafa2ebd9b07069ce89fe228824a39966953d14dda1bd6ccce5faf16e4d7000000000000000000000000000000000520cfc8c536a1d4e685c4eacbc2000d70abd72e1bf8ce3839d79f5cfa069ed31aafb15542f23b8d1af678bab05a2d410000000000000000000000000000000017cfffda12d21c98b79ac31c5bb696783afb7d69c2bedf0fb070cf7714959db14957a4763564b65b7ed214d7b48d399c', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_77', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a00000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000007f786ea1cc7cd69ae1061d6b914278dfc7ebe8a714aa8cd04323860314c3b4b36054169dd5c6c60e67bfa3902d216f50000000000000000000000000000000019675b09a4de34af3c6e79452b57b31b6d499200e996008a9e7d1c910ca0ad2a352dc39cb3fd7333182476095b7aeec3000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c04200000000000000000000000000000000001b8c085fd1f34fb273da7d651602b326fef7c357c2fb7845f4c17ce95152042af9e51e7d7699b50f3605bacab563a100000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000007f786ea1cc7cd69ae1061d6b914278dfc7ebe8a714aa8cd04323860314c3b4b36054169dd5c6c60e67bfa3902d216f50000000000000000000000000000000019675b09a4de34af3c6e79452b57b31b6d499200e996008a9e7d1c910ca0ad2a352dc39cb3fd7333182476095b7aeec3000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a00000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000012098b001cb819309d0b45df8a37854967f88cfa823a69f262fe9a40c564bad8e8a6be94d3f7939ed38305c6fd2d93b6000000000000000000000000000000000099b6e094a1b1eb0ead2e7117f3f9bbf72db98409ef1234c8b3b60fea1048f9e97e3c61fd568ccca1da89f6a484bbe8000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c04200000000000000000000000000000000001b8c085fd1f34fb273da7d651602b326fef7c357c2fb7845f4c17ce95152042af9e51e7d7699b50f3605bacab563a100000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000012098b001cb819309d0b45df8a37854967f88cfa823a69f262fe9a40c564bad8e8a6be94d3f7939ed38305c6fd2d93b6000000000000000000000000000000000099b6e094a1b1eb0ead2e7117f3f9bbf72db98409ef1234c8b3b60fea1048f9e97e3c61fd568ccca1da89f6a484bbe8000000000000000000000000000000000475e66c9e4e434c4872b8537e0ab930165b39f41e04b208d74d3033e1d69dfb4b134ae3a9dc46347d30a6805508c0420000000000000000000000000000000019e585e1d9adf34a98a7cd38de35aa243d7853c19bc21747213c11240d5fa41ff3b21ae033dd664aaac8fa45354a470a00000000000000000000000000000000137e91115129cbaa1ae2bbb79abe5505436bb51ddceeb011d56dc5c3c396b6b00067d6e6108bafca40fc717737487b27000000000000000000000000000000001592fec7d33bffa7f3eebf038e3194513736cc41a143471fb8c55a44c7521c07e4d8368e5c6ee21ed0478f949f3e224e0000000000000000000000000000000007f786ea1cc7cd69ae1061d6b914278dfc7ebe8a714aa8cd04323860314c3b4b36054169dd5c6c60e67bfa3902d216f50000000000000000000000000000000019675b09a4de34af3c6e79452b57b31b6d499200e996008a9e7d1c910ca0ad2a352dc39cb3fd7333182476095b7aeec3', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_78', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b0000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000fbe421858e4109c51de57b77da4f9c4c1f950099532d9e30e2f7a8b8b4fb9f708cde1a497050d0944e089978b15321e0000000000000000000000000000000019f48a0bf0f27df65ba766a65e831a0801a4ebcd1995a6002a803f88aead1503b7c39fde8ef5c4672020307241958a880000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000c8bd020743550a6d27f0052d0037547db204e3fd752abf6758d899a3793fd3cd50c3073df6258c20a2f8e4797cbab700000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000fbe421858e4109c51de57b77da4f9c4c1f950099532d9e30e2f7a8b8b4fb9f708cde1a497050d0944e089978b15321e0000000000000000000000000000000019f48a0bf0f27df65ba766a65e831a0801a4ebcd1995a6002a803f88aead1503b7c39fde8ef5c4672020307241958a880000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b0000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000a42cfd1e09bd5fdf93d4ffec5a6b312a27dfb7b5e5238dc590158156b613c2d15de1e5a1a4ef2f6751e766874ea788d00000000000000000000000000000000000c87de488d68a3ef74410fe4c892cf62d25fb7d9ef6cbf3cb093184803e12066e86020225e3b9899decf8dbe6a20230000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000c8bd020743550a6d27f0052d0037547db204e3fd752abf6758d899a3793fd3cd50c3073df6258c20a2f8e4797cbab700000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000a42cfd1e09bd5fdf93d4ffec5a6b312a27dfb7b5e5238dc590158156b613c2d15de1e5a1a4ef2f6751e766874ea788d00000000000000000000000000000000000c87de488d68a3ef74410fe4c892cf62d25fb7d9ef6cbf3cb093184803e12066e86020225e3b9899decf8dbe6a20230000000000000000000000000000000002291ff240598e2c129ea12292e4a2fc86e03da9bd9fbbb8bddd6f25797003a4688ba2ed3bafd8dfcf0ddd44c3288c1e000000000000000000000000000000000d7541c9c54a95f3789ca7637348378f8956fd451c3266c8f1a34906bf1cf8e7499fcf8ad1f1a73dafcf71b86833ff3b0000000000000000000000000000000016aed55f56416b8f450283c4afea4c606100eed9bf7b8fea9ab4d04797a7bfe3bf0f10cf229f8ce3156869d75beabe6b0000000000000000000000000000000007e5c03e51a513c6f77179bcb5f7d147dcee32426b4365b1c95f434be7f83a5883d1ee5b0e01a636b3e5377542314b75000000000000000000000000000000000fbe421858e4109c51de57b77da4f9c4c1f950099532d9e30e2f7a8b8b4fb9f708cde1a497050d0944e089978b15321e0000000000000000000000000000000019f48a0bf0f27df65ba766a65e831a0801a4ebcd1995a6002a803f88aead1503b7c39fde8ef5c4672020307241958a88', + Expected: '0000000000000000000000000000000000000000000000000000000000000000', + Name: 'matter_pairing_79', + Gas: 280000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb9630000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb9630000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa000000000000000000000000000000001233421a38d77c59bbe1b83992a7a6c964ede5ef83c5a72bd1ba2c0a81b4205ce9a6925718cabcaf4a72ca3d216fbffc0000000000000000000000000000000016b8c22b35af7d925b5c68b6b7b63442e051fdc45542f233f2d97106c4b960eeb47f204c659d16a3a0d3b65ee38ff1480000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb0000000000000000000000000000000010b6db11d4fc3a2b449b8fd189d2e4ed4591bf4258d7b92b3eb152048cb3a3eecb87782691e9b954377fd1f34b38cb0d0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb9630000000000000000000000000000000018d31bd5a7e94ceb18d803969a2001c6eb3bfbcf82c27e88ca60d4c46807d12f116ca71c67d27270c2332205a4ea11bb00000000000000000000000000000000094a36d86483ac6f068017e4b978c7ea1ee58c429aad5994287f809c69fd5235532487d81f6a46ab827f2e0cb4c6df9e0000000000000000000000000000000016114be17b400ba35875d9009b4d8974023a57d32508c9f658a0d82a8efc6b379ce4a3dbf5ca7130c5581f5008806934000000000000000000000000000000000c68cd7b9d3c3d6c559fa3d52da48ebe68e40a44863c332bb90dd151d1281dd3faa34e6c7b07c277affbdbc1b0a43cfa0000000000000000000000000000000007cdcfd000a86a408f39ef7cb0a4060dff8965956fbf6b939576a69674fcd5c735056da7988943506f8c35c2de8feaaf0000000000000000000000000000000003484fbf03d06907efbf3eff8b95789484254dc09e42208b7457619a31f795356a2cdfb24bb6e95c192b49a11c6fb963', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_80', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b560000000000000000000000000000000016c917abe637da21e60378ea7c2682306aded4ff17ccfea742e9ba63590be1b0fd5432ff0d3b72cdcb15943763cbb6bb00000000000000000000000000000000153bdddfe73f21c3593b128d3885f621935585ba1715e1d989e87cf7271897eea3917b81f0f342790f0f7a330ca0c68f00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000c47feeb1a1d2891d986b1660810859c1bba427d43a69b4e5ddeaf77116418138bfc2b7b4aa4c0cc6df10bd116721d5000000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c00000000000000000000000000000000190f4dc14439eccc46d46c5c9b15eeba0bbf2dbca11af4183408afdb15c7bfa26f107cf5fda0c1e0236aab95728eac2e000000000000000000000000000000000db912ff1f62be087194f6503b3b273b48bd0907afde777109522329e54cde1092afd48366af3f334c0df42ee98d8d5b00000000000000000000000000000000135b96feb4f1e712661ce0d13842de1198c589f335141ab1fd7ffc6b9d58de82c300e9fe6dacdefe8e68b6db9298da5100000000000000000000000000000000046a3563d167d8b0a9f74e0c6514fdabd795110cf48caa014947ca90a9eeda3d07dd7dce58d3f2b7b86fab1143946b56000000000000000000000000000000000337fa3e53480c7865182ecbc7252aa6f9987685dbb814182447183d9da514732157ccffa4188d31eee96bc89c33f3f00000000000000000000000000000000004c5340a5240c4d6f1e095290ac5b6b5d121c5cadc6f30e5dd4855a9cf985e357b1a847cc060bd86aaef85ccf35ee41c', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_81', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000a9e191c9775f57810a511c8bd3dca14b3328e20f0983ca72e42e561b5dd1693209b42a11f2faeecd6307dd34cc01d60000000000000000000000000000000000146061b13546754c74a705776656100a9577f1ff939a82ba990d6b885b27c450f824555829bbb19f9b1f636991799cf00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d8000000000000000000000000000000000062783335b87300c97b38e03e5b1318d15a499b29a473c187f930bf34bc1214b4d822725678cbde978c7b5ae6d4bad5100000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc00000000000000000000000000000000021203675e0ae188ec782160e21492a6ee39fa97d922c1ef9bbfd79b82b3fad54fab11ba633fb8f02cf92249d85d9d800000000000000000000000000000000013d98eb6ddf8b68db36819b25d9a7b4a4ed2b1d2593dd6a6e79dc6adaaefd4d8d129d8d949c7421641374a5192b3fd5a00000000000000000000000000000000117821e6c87bb0e04882e95d36dce18ca33a2c8bd0efd5532b33d597804c08ff1799b2d64a95cc84bd31ba45c3b1e822000000000000000000000000000000000887c07c8a9ebe3154950746a4506ff192bb4a05dccb0f4a1a8ac2b8ca0da07190129ba44d9bc8e6c2666027c67d2ddc000000000000000000000000000000000f62f8cda209f1223a7695ed860de2c2b144bd6402ecd61838eded3f40d3df90fe10bd5d92245112e3ce822cb33f8d4b0000000000000000000000000000000018bb0bcf262b7f4583d1375ecce64bd6bb1fcc64fa4b6a93bd9ffbe870fe79df0f29baa92eb844e5c04d09c966e810dc', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_82', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000e96f685e6f87677cda23177f9fe7fd15726ab31e4d85a5725e93d558bdf61437dbc2c9ebcfc6a94705fa70de88a81bd00000000000000000000000000000000157ce060a46912c992587fde3db4c64a705ab7115717031778176f6ea311cb352f3a76f4839be4658470e4b0b9854f77000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a80000000000000000000000000000000013b5317e3ff7540048b19ceebd47c15538d7eb3bf402823b9c348c464afb1000ce0f7ea4c1cb668af5c8cbf77e6a92510000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34000000000000000000000000000000000e4979375cd880e26d00461de629bac880c12e24ede4a7c702f151c34a728a69a021e37b6a1af520a5f47d3a33f8c8a800000000000000000000000000000000064be06bf988929a026a0ac78603eb822b9f6048ff829083cafc465aabb5e623509c8159ef889974c43634088195185a0000000000000000000000000000000011f9a369401d2c376c77b4b414e345e6108b11594b26521b51afe6318648af232bf9f1455a99dc2f9b0207cc78339510000000000000000000000000000000000863492499f4791e71bd8d58dd2444a34e66dd3e3ca1cb3669f4182fafc9ef080a1d8111b3dd754f2405032350732b32000000000000000000000000000000000b6a1b64528770227d79763e494d2d060d50a0530eacb8684147954b6ad194e0a0efd35ff457956b499f58f2177528ee00000000000000000000000000000000048431899516d3d0b8c327d80596e68cf41c94739c6e0fa7ef196332539f2aeeef71890a2db81b9a358e1b4f467a5b34', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_83', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e0000000000000000000000000000000016002a054bdf3cd916b5f8aca47d97feb170e8864da2eff8bbbf19a5b25ac857dbe6daab97dfe15a4e82455d154652e2000000000000000000000000000000000efc6f6c595368288f5687e710e2faebf12bd63a0ca34a527c05f1d925fcedd23c5e2b6708194069a36f858fa510ee410000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000ae10eb4f791aa31e5bd7b6c4d68b04c6744262d8f5e9469b3987b101ff5a3066794e05694a9167b7050c3944b6d84f60000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a0000000000000000000000000000000017f16cffb737dadd52b3c5be258733dc47301474b7351c8dcb8ddb4c519018be08b64efea3336f2b6cfa78e0669dccf9000000000000000000000000000000000f20033541ee3c68655e2c49f5e2fc8afd33255764267e55b3985790d6bb531db7171fa81caae98449ae3c6bb49225b50000000000000000000000000000000000a8382a5f73a7d15c3ee35e5fcaf7142e6d91d71ef30ce7da9c8db2f80c95441dc93674bed244096b71aea40d43c318000000000000000000000000000000000733e9a022695ed6908caf6ec7e67211c6d5ac16ba3fb8e244227f5da787e69e7311fac1e8d102a2d84e6ba98903ff6e000000000000000000000000000000000400e7e4eda0a9c13465af099ece14d8b30662fea5e222c6ab71b8fb44562dcc42c5255319741ea56b7cbaa2eab957c9000000000000000000000000000000000b04a27de02c7e71bbc51fcf3268b1eb734b754ae6e1c86ceb2ae0c7d0b40851e24dd497a93abf96168f7a705aeebc6a', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_84', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a1000000000000000000000000000000001408beb1c3951d79fa43477c5af6894ee3c2ea9605f8ae64a78b51ee7e16ae9641134a9a75735972dbd7b53dd4c9f3bf000000000000000000000000000000000e6c6c9405ff001faa8d8c06bcbd75ee91140f477ef8283d3c5eb3039f16543ca9e7e4162177a7499edb6f3fdb01643f00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a61685420000000000000000000000000000000016aead8bd8c4d5ddc444e15bc83e8f14d377d5e8d756a0255f1387506b9a9add69592241dbd9cab95474d55ac473886200000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c00000000000000000000000000000000062168f0bfd29c44074430158708a1e3b6808bae633ce9506b32eb9124db1a0668d83f2076adffb568ccf289a6168542000000000000000000000000000000000352645e60bb10bc86d6c65a7b0d1dc290ff759c1c2e729a081d4b508b165b46b552ddbcd57a3546658a2aa53b8c224900000000000000000000000000000000050b449c2425926d961af37c4c88e671eac676a1f828def54b76dc04960d0222fb5832ed44c45d5fbb59549d9d24c236000000000000000000000000000000000c6e811987b30ed77c804e647f867186d425411e514e9bf31099cc0f695195729ae970766b2738a928e776511a44f8a10000000000000000000000000000000005f8533875eac92050d86039e855238880b460eeed8c645abfa580b2789a478ddd98b5643be0a68cde274ac22b35b6ec000000000000000000000000000000000b94a5563380e67aa08e1baf868e36e8d3633c3d748cea822ad21f9d579aa1e774c41be88fdc58b61b2390c024fe466c', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_85', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000018a8b48aabc6c003a58593a40b55e54b122994f9ab58cc229d1a0e6a3670244cfe73854f07117dc77dd5c2c81314a17e00000000000000000000000000000000062f6a0a8b9dd56001f0f57f82bb7468d709fb8f33e6729369b015685995ef27abebff9dda55c38b0d9e88a1e0b9fc6c000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000019049c394e547b9b714b5969adcf068b381def6af2b27d1d361d06e9576273a8febb5bf94b5061ccec7afdb5642c0ae8000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f000000000000000000000000000000000c60b948942652a8214d8776b77a6c559ca77eb3a537b0a9abadc3058eac8c1d7840f091acd6c0056d5a71468a2b1ceb0000000000000000000000000000000000fc75b0eb2b6afed9d04e4c957ca64c2c595c1a00d295a23113cbb79f4e827b1ff0a40566039e32cd84024a9bd39fc3000000000000000000000000000000000a8679f08643ff1c4db54e58de15a4828fc80e3f9d80a932b26b49d5c13831b1dc5dc29af2e080eb08e71938e5010fc400000000000000000000000000000000110957f7e9f8e0806bb3d2a811b91c926feab046ef983495f3f768a6cc6e4a6d95bb92facb77d989e53ce5489aa64b3c0000000000000000000000000000000001585d5f8db92696a596141237f5c78c524db68b482c469cca16c436c040d1d720387aafaa4282383c293d37eceb092d0000000000000000000000000000000013d1a7dfade2113a492ab236c090386e8d6d4ff5bf9ea02bfd80bd389d1b06fc72c00060d6fe3c74ac60775e1f45ae3f', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_86', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000d81a0809479694fde24e5a3ee7d32deacc25e77f241024666bc3372e80379a722863ea8105f345f1d09e462fc5a8c6c0000000000000000000000000000000001a5be923f1ca5ee876d660fbca5896f1634ef6a83ff8c64dca4ed76d1db2ba4875099fa5a39a09f839731278b307fb10000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000009f7d7b21882455e9f1f24ea120f3eb69f739c1320c37eb2b17e0a271cb03ac6e2b0c55d3518548a005f28b5748b7f59000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa0000000000000000000000000000000013fe38343072af8ef1d8247c3d46b4fd190086ceddfeb767787031368da6a6a6ae849cfc26a24ead499338e37fa337e30000000000000000000000000000000010093a3820fda13babfc82cc313c6e20c503af71d2c1940cb5b2c879da00bb5d3bfb3aa17c3bab75b99fd74a8b742b52000000000000000000000000000000000ba48cbd776dd03a5b69aed3a31b7d151a8d98cd9adc3b9987cf2ac94644a364ebf3d30cf31742e2152aeba0eebc9ceb0000000000000000000000000000000008793a44c730949a9e50e9439d579ff0991dfc49a67a29b1701989ab065e6e937b14ac1bbca5a3dbf79a61837ad18394000000000000000000000000000000000c7f7169a5067d4a6cf6c21254ce79f8b7b4ed0d0144107900749f2e0ead7c7cfc25c156a0f4cba09cf51b9d03a51e3f00000000000000000000000000000000185b5357fa6340abc3ae41a686a623684e425c1a6f85865a8a8be52a24d5ca7f975b6604571a5f603667ced874cf2afa', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_87', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b2720000000000000000000000000000000000b76cdde0e1205c918e6e6d324ac3f35d42ebe9bb101f1cd8955acdfa8836f22f1497bced2c93495022b0c335bcaaae0000000000000000000000000000000018340c2a8b079b88595aa50e93251d12e3a5aead2d2add3b72ce82e03a26525aa45fe9b379504392edb0a2a26d7e99dc0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000146696840e8e988d0eab90ea935dd8b5f1272bbb81eb524e523c57d34ad7c5f0f3b721566f51dac4774826b84cc1c82f0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf0000000000000000000000000000000018c6df81d810deaac0b143edf79956c92af7941f7b279db345f838bd583177912fc2eb367616ae165e261014a4d7b1b900000000000000000000000000000000059a7b662af14e0d3c7016cbafedd42173501fc97199c07114f47acdabd930332af4dea84202253b42b6d947b33de27c0000000000000000000000000000000008691df5b245399f24118badfbef3e01a4acd53dc9ab149e407c733df6122fa91f5cbe2f9d247cdbac18b266d3d8f18300000000000000000000000000000000053e6eef4ffdbe239c8bbade8cfc90461d54f281ee6180c271412bf2d64e005d3f0291d3401c324e41067f4dfcc4b272000000000000000000000000000000001949a50c589ec63db98d39491100e8e407345f9b3874f3a28e9b77d2fc28bf31ef976841c4276cb669dc4f3cca42fffd0000000000000000000000000000000001cd05bfae784b11f1c102a7b0268fc480d19cd7c65a3583f4624fc0bc8aa3c97a4c164b3803bc6ccc4e5d5d928110cf', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_88', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c6640000000000000000000000000000000011d7aff6c4512f68031aeb94ce3733ac43659f9fc58fc94c05d99ae80a7656f66b3e3e86843387d1c10f51b4284755150000000000000000000000000000000012a9e7f3804c6b5b25410a82758cd5b6ea1eb150c696b0d67d92cf9eb1f8e17752184d94a4ad2645b1520d6aee1094ed000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d0000000000000000000000000000000009d569f05e69a38231d0f636e1ef040af059a00db4ff09bd2ad82b7e04cc041a33603c2eb9b148e3b1412bdef9740ab400000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be000000000000000000000000000000000c6b634d90c2664b9fa4ccbca35913d23696825350e21f0a6dd5e9abb17497a0a499e1b7b928a57ba8c730158f63b75d00000000000000000000000000000000102ba7f9db164318194ab17f615ca8cc741dab773e8609023c58a722f1e4f209eb4bc3cff7a2b71c08bdd421068b9ff700000000000000000000000000000000042120affcefe4735ae25e192d1cf34e40afdc6d2ebdacde2e23d30709fecfb71960bc9131e3702b27b6fcd5c7a98d170000000000000000000000000000000001998caf5163b0dccec7c8423c4c56a7d0f0b26d9034f707ed07f636f42dac590a2674c1667d70be385c4e626815c66400000000000000000000000000000000082961f3752eb7324800bc217514792b2111abe52df54973615737b8ec3a9f2db36dc1782d20782df8efae4bd7b8559600000000000000000000000000000000075729f6b9337b3f25da9d33cdbed7207a589a342cee61e8e99e030244b814accc93b26a0ca6d9ba08acf29511ef15be', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_89', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e60000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e60000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca0000000000000000000000000000000018bc90cd83e1271bf0e39b0c80989f0ddcffc960ae466c64ad340cc32607dbdc73eac5b9145e1339fa02a0c3fafcc1df00000000000000000000000000000000124c4bf66a5e015f142e9e4b26421414a60e54ed76c6d4acc0f20b24a25ddf5ec7ef1f561fac9d470a94bcfb2f2698c50000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000e8b0f968ccb230517ef8980be559f410a2c4035a1101e6796d4f7a5ee5c93a19c111d38930bd5bca69405fc35fea7c20000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e60000000000000000000000000000000018129b2f00be24717c906d215beaaa136758aa1730bd0bbe9c0de9b3cbb3c0ea47911817fa322b907cc6fc720cabde05000000000000000000000000000000000b760253acb4c395332c1e3584f60d965a4b0b4f5274f457d05bdafb08546282829ae2c61e482a43136afa03ca0102e90000000000000000000000000000000001462f8080d9b51235a8aa652445f509e3e13e3073769e9a047e8b2bfa5b227f4354bef017d18bf06f7ec98c169abf1e000000000000000000000000000000000070fdbc18112b49bd83f4347922797f2bbd68bf2592ad59041c97948ba7a091bdb3622c804803ad605604ba364dbdca000000000000000000000000000000000144811cb59ebf7e5a380ca9c2b30dc987778224453ea65ab9fcc5ddd0a91a47aac13a459cf5ecc5bffc5f3c0502e8cc0000000000000000000000000000000007b4c5f3cf21e53b36ed096b1d0998c2be68f6977cbe3e12a63ec77c545316c556bce0a891a762b8af6a4304d0d911e6', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_90', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca20000000000000000000000000000000017f93d49ec5c34cdc31931cbe2d5b3ad7a6dcd3ea864862aa7b41d5b2f4618c9c92da01e246ff8f34240bcf1de4c1c450000000000000000000000000000000002180a95dbe57c43171e2607593dd3b54344bdbf409dcd0c5706a9a72ad0e26ed60b9e4cb17ea4e7b460adc5a6f6d2de000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a4700000000000000000000000000000000193118d1f237c68a8a0961fb220c0fd6a08853908a039dd57f8ed334063e5316bf83e8c3c3f44420734abbd7ddda31a600000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd000000000000000000000000000000001667fdc9b89d12fb0704fdec910cab1b51ac04219ef6e50f996688b2ceb26dca0e9e8594c5b81fca2e8fc2c8d8fa9a470000000000000000000000000000000000cff9184748200fc11245bb213f9d00c3eef7f4698174e9e7a1ff6cf072a30d5f28173aed5fbbdf46b444282225790500000000000000000000000000000000156901359e5b399168e90ccad27a054d147aa9c4a731294180e395e8e2d458f5537fdac591cdc82fd8bffa4c9fa126ed00000000000000000000000000000000143872757c0a25d85e95a86c5e09175fdbeaf59bae3d1e8a367902d59c662cc3a293ae252443b3201671ad1dbaed8ca2000000000000000000000000000000000207d4a04d23b1cc880275ea6075f929ea097e464b208c94bf7cb545c76add5a557e5fe08ce4070c77be430e21b38e660000000000000000000000000000000017e907545d9a6a5733fd81aeea0dd92221328dc5b2e745b3102a28f9cbe013b548a061b1ffd55b18059e523a5908d7cd', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_91', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c01300000000000000000000000000000000034f7418d96bdbe4f1ed5996fc9e9e99233a5cb3aad717b3717e91ff94fecaa67250ba5b27dcf59c6e36aae08d22983a00000000000000000000000000000000100cd7ea3c342aa2c15e9c6121a1cfecf611235add08290cf9cb8ea54e8ff523e17a0b5dc41e6d07992e5927e3ff6157000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000007025f1c4a5f85a9c1587d4d4a2e620d83d60568343940ffd85e6b1e4fb0f0f53bb08c4f48bf6f45a7dbc3722ecc951e00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954000000000000000000000000000000000217a4c563d730ef545e452038813301933ccc6638321ee5e217dad0be2e3ddc855a14054d0d72b6bcc692a5fb1ac7300000000000000000000000000000000012feb2cdef2060f089c32a68f91d4ac9e0a1461cbf4bd1bf8ed26782a700052ee2fb73af689490ba12233c8dd133158d00000000000000000000000000000000162ea8f985c83d59361ee6beb49cf2a797d8c909e2eccfc61fdc5359d5ac9b10fbaeef2eebea1667b5b9bf8f5d603d6e0000000000000000000000000000000018344ca9d4913e817264ed8119fe4d136f2041b0a99d4b5fe7f2b7f268256eec9fceb27fa61c4225f47babd17759c0130000000000000000000000000000000016b19dd160140ab5592e4e1f46ad0e3e413ceed148adfb0bf5b240a161b22b7dac5b45a389770a634bc8551f72dd12710000000000000000000000000000000009f439fffd4bbbf789bd0b5521a9dcea6e66282a167ce9b26d6543fba82101003d31f4a0ed3592f820d0a6d81c004954', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_92', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000013574b997ee8988aa81db0e2ddb98be2e7005603076fac5cb246f65c869aa7bb3f148c8dde970e34e5e5efce023e633c000000000000000000000000000000000998bc9d41c5d527360fc4e68ba067d3778cf5cf00e5959b5ec52c1595aabe6e2e92d40cb34faa84513d150568c8cfc00000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000dd8d1bd66f4accbc9d0c7dabef7af72f51c67a0d61384647533ad92bba44a312f0be0fa52163176f1aff4e64c00aefb0000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb0000000000000000000000000000000009ec00ea2da59d937d3154d86dbed2957667253401bce9de80e0ffe6df32f36b06404b9e3af08e912a0b4ef091f93efb000000000000000000000000000000000c28402cd28b39ce814adfdb8453fd646f5ae3e41d718e5af1fd250e3b0cabf2efa01f045f3dce88c84f0b19b3fefbb00000000000000000000000000000000001cdfae9234096578b9413f926ef8c6831f2c0f700e25d7553a746aef44238e493f8032e09f67f2fed9676c9611f60e70000000000000000000000000000000019c8bae08d3926997146f7827f00cde863684dd4050ea5da64f6798e7a930d3c1f34046bea0f44232594f5469db566280000000000000000000000000000000006a9c650ba974e0fa2fdf6d3659220f47d76f581ec156662b4e9dc4470164e68df977370d2bcf1cad4191031fdc1476f000000000000000000000000000000001068554cf7ba1173150be2cfb7ab4503ecea55b5f29f7d24086ba68b610637b5f0192bf1fe04557b68c1eafa9736daeb', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_93', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000008c7a67b89960da4309888bc6ce31e7efe74867165a8aceda7c7290f8a92687100ccbcd39d4d5a67f21f4b63ecc638320000000000000000000000000000000001cd7978ce28629ed1a9c5433c555b1ebb584f80909599282467e7b2471f591bea1d73e7b0a247aed7de4f1fecc012040000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec0000000000000000000000000000000001648030be79658c134e016a211d311841988065957b35e9bc1580fb6e05e291e747b7a960a50e26a2a3c0cd1634c3585000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a70000000000000000000000000000000014153e01c9e495c5c01c82b3cad9eaf20cf78369ccbabf57fb160ded309cbd1caea3d3df38a7ea5490c67f168e9acec00000000000000000000000000000000003b90ede51e98dd9163b911431789b534aef452b9bd1b423a5d8c2ea1652cd05aa308568a7031d958fc2f32e9cb37526000000000000000000000000000000000c78d84157dc0b102c3843e4c8e88f244cc1b2a27043e07b2fab694a58f93d47e4cf9ca1158a8e30e3d43f94a20d33b50000000000000000000000000000000004842fe0df312f735a9d8af0c2ff7c561ed9cf4add5e3e9402bcff1190f3f36ca91de8edc9472b3ebd27ee2d9afdf8770000000000000000000000000000000011396b6eafe9d8f61a831ef9d6688e586602c5138ddc65d1bf69a9916c1e8db31ddf432b1406a597c7dfb49c1339727900000000000000000000000000000000183398716b5783fb7971e27306f651b8a91efc0462ef799742c8eaeeaf919d08348e8c1700b1b850e220b0e0133f98a7', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_94', + Gas: 409000, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd0000000000000000000000000000000001652a688dbfd63a1c89452335bdaf248c97c9c6e5a3ad5a126577a6b9ab57075b22987ea8697b459611a5ab164f328400000000000000000000000000000000058a37347c5637808632ae6e8f264e8bde14ebb0ae69828f962f51b728321fea57c5a97ab694f7db175efe7a17d36cb6000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d579500000000000000000000000000000000144401f7eb69f6321eae8dad39dbe2cf4ae58e455474701dd9f1b62c85c7536813e84eb4f9def511eb62e5194288728b000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5000000000000000000000000000000001555535228eb9a24f460df9894d59aa06fc848a8bf8d6c3b51653b1d85734b3c5a2bece161309bd478d356fa198d57950000000000000000000000000000000005bd0ff24e15f0682c6d1a09096fca081991bd3f9f10a2a18d3f1c7470e9a2bc0ac3b149b7750aedce9c1ae6bd773820000000000000000000000000000000000e619d79792ac685030311a31a21203e5172d2e5d20ecf69a1e64158e7fe903b3695fd15432d3ca35562b5a8bd9cbdc20000000000000000000000000000000012394a621a503d1d92df3306649a6c6979816cabeb8f8d27450ec883c4e75f6f7411f3bfd068dc8dee58cdb8ebbd91bd00000000000000000000000000000000189be781abc010602e9262930d8dfdb2d7df81be0de1656554cb5afa3d059f1cc389678008ea84ba23ed5a54e9b07827000000000000000000000000000000001476dab5bd29af19c4e8f947b4255e4b86625fd4451b902fd10180e9ce7ed639c6e65683fabf0824a2a00185e82c3df5', + Expected: '0000000000000000000000000000000000000000000000000000000000000001', + Name: 'matter_pairing_95', + Gas: 409000, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-PAIRING', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12PAIRING = getActivePrecompiles(common).get( + '0000000000000000000000000000000000000011' + )! + + for (const testVector of testdata) { + const result = await BLS12PAIRING({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(500000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + result.returnValue, + hexToBytes('0x' + testVector.Expected), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/12-bls12-g1map.spec.ts b/packages/evm/test/precompiles/12-bls12-g1map.spec.ts new file mode 100644 index 000000000..79947eb7d --- /dev/null +++ b/packages/evm/test/precompiles/12-bls12-g1map.spec.ts @@ -0,0 +1,81 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/map_fp_to_G1_bls.json +const testData = [ + { + Input: + '00000000000000000000000000000000156c8a6a2c184569d69a76be144b5cdc5141d2d2ca4fe341f011e25e3969c55ad9e9b9ce2eb833c81a908e5fa4ac5f03', + Name: 'bls_g1map_', + Expected: + '00000000000000000000000000000000184bb665c37ff561a89ec2122dd343f20e0f4cbcaec84e3c3052ea81d1834e192c426074b02ed3dca4e7676ce4ce48ba0000000000000000000000000000000004407b8d35af4dacc809927071fc0405218f1401a6d15af775810e4e460064bcc9468beeba82fdc751be70476c888bf3', + Gas: 5500, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000147e1ed29f06e4c5079b9d14fc89d2820d32419b990c1c7bb7dbea2a36a045124b31ffbde7c99329c05c559af1c6cc82', + Name: 'bls_g1map_616263', + Expected: + '00000000000000000000000000000000009769f3ab59bfd551d53a5f846b9984c59b97d6842b20a2c565baa167945e3d026a3755b6345df8ec7e6acb6868ae6d000000000000000000000000000000001532c00cf61aa3d0ce3e5aa20c3b531a2abd2c770a790a2613818303c6b830ffc0ecf6c357af3317b9575c567f11cd2c', + Gas: 5500, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000004090815ad598a06897dd89bcda860f25837d54e897298ce31e6947378134d3761dc59a572154963e8c954919ecfa82d', + Name: 'bls_g1map_6162636465663031', + Expected: + '000000000000000000000000000000001974dbb8e6b5d20b84df7e625e2fbfecb2cdb5f77d5eae5fb2955e5ce7313cae8364bc2fff520a6c25619739c6bdcb6a0000000000000000000000000000000015f9897e11c6441eaa676de141c8d83c37aab8667173cbe1dfd6de74d11861b961dccebcd9d289ac633455dfcc7013a3', + Gas: 5500, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000008dccd088ca55b8bfbc96fb50bb25c592faa867a8bb78d4e94a8cc2c92306190244532e91feba2b7fed977e3c3bb5a1f', + Name: 'bls_g1map_713132385f717171', + Expected: + '000000000000000000000000000000000a7a047c4a8397b3446450642c2ac64d7239b61872c9ae7a59707a8f4f950f101e766afe58223b3bff3a19a7f754027c000000000000000000000000000000001383aebba1e4327ccff7cf9912bda0dbc77de048b71ef8c8a81111d71dc33c5e3aa6edee9cf6f5fe525d50cc50b77cc9', + Gas: 5500, + NoBenchmark: false, + }, + { + Input: + '000000000000000000000000000000000dd824886d2123a96447f6c56e3a3fa992fbfefdba17b6673f9f630ff19e4d326529db37e1c1be43f905bf9202e0278d', + Name: 'bls_g1map_613531325f616161', + Expected: + '000000000000000000000000000000000e7a16a975904f131682edbb03d9560d3e48214c9986bd50417a77108d13dc957500edf96462a3d01e62dc6cd468ef11000000000000000000000000000000000ae89e677711d05c30a48d6d75e76ca9fb70fe06c6dd6ff988683d89ccde29ac7d46c53bb97a59b1901abf1db66052db', + Gas: 5500, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-FP-TO-G1', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12FPTOG1 = getActivePrecompiles(common).get( + '0000000000000000000000000000000000000012' + )! + + for (const testVector of testData) { + const result = await BLS12FPTOG1({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/13-bls12-g2map.spec.ts b/packages/evm/test/precompiles/13-bls12-g2map.spec.ts new file mode 100644 index 000000000..703f538c6 --- /dev/null +++ b/packages/evm/test/precompiles/13-bls12-g2map.spec.ts @@ -0,0 +1,81 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM, getActivePrecompiles } from '../../src/index.js' + +// Taken from https://github.com/ethereum/EIPs/blob/master/assets/eip-2537/map_fp2_to_G2_bls.json +const testData = [ + { + Input: + '0000000000000000000000000000000007355d25caf6e7f2f0cb2812ca0e513bd026ed09dda65b177500fa31714e09ea0ded3a078b526bed3307f804d4b93b040000000000000000000000000000000002829ce3c021339ccb5caf3e187f6370e1e2a311dec9b75363117063ab2015603ff52c3d3b98f19c2f65575e99e8b78c', + Name: 'bls_g2map_', + Expected: + '0000000000000000000000000000000000e7f4568a82b4b7dc1f14c6aaa055edf51502319c723c4dc2688c7fe5944c213f510328082396515734b6612c4e7bb700000000000000000000000000000000126b855e9e69b1f691f816e48ac6977664d24d99f8724868a184186469ddfd4617367e94527d4b74fc86413483afb35b000000000000000000000000000000000caead0fd7b6176c01436833c79d305c78be307da5f6af6c133c47311def6ff1e0babf57a0fb5539fce7ee12407b0a42000000000000000000000000000000001498aadcf7ae2b345243e281ae076df6de84455d766ab6fcdaad71fab60abb2e8b980a440043cd305db09d283c895e3d', + Gas: 110000, + NoBenchmark: false, + }, + { + Input: + '00000000000000000000000000000000138879a9559e24cecee8697b8b4ad32cced053138ab913b99872772dc753a2967ed50aabc907937aefb2439ba06cc50c000000000000000000000000000000000a1ae7999ea9bab1dcc9ef8887a6cb6e8f1e22566015428d220b7eec90ffa70ad1f624018a9ad11e78d588bd3617f9f2', + Name: 'bls_g2map_616263', + Expected: + '00000000000000000000000000000000108ed59fd9fae381abfd1d6bce2fd2fa220990f0f837fa30e0f27914ed6e1454db0d1ee957b219f61da6ff8be0d6441f000000000000000000000000000000000296238ea82c6d4adb3c838ee3cb2346049c90b96d602d7bb1b469b905c9228be25c627bffee872def773d5b2a2eb57d00000000000000000000000000000000033f90f6057aadacae7963b0a0b379dd46750c1c94a6357c99b65f63b79e321ff50fe3053330911c56b6ceea08fee65600000000000000000000000000000000153606c417e59fb331b7ae6bce4fbf7c5190c33ce9402b5ebe2b70e44fca614f3f1382a3625ed5493843d0b0a652fc3f', + Gas: 110000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000018c16fe362b7dbdfa102e42bdfd3e2f4e6191d479437a59db4eb716986bf08ee1f42634db66bde97d6c16bbfd342b3b8000000000000000000000000000000000e37812ce1b146d998d5f92bdd5ada2a31bfd63dfe18311aa91637b5f279dd045763166aa1615e46a50d8d8f475f184e', + Name: 'bls_g2map_6162636465663031', + Expected: + '00000000000000000000000000000000038af300ef34c7759a6caaa4e69363cafeed218a1f207e93b2c70d91a1263d375d6730bd6b6509dcac3ba5b567e85bf3000000000000000000000000000000000da75be60fb6aa0e9e3143e40c42796edf15685cafe0279afd2a67c3dff1c82341f17effd402e4f1af240ea90f4b659b0000000000000000000000000000000019b148cbdf163cf0894f29660d2e7bfb2b68e37d54cc83fd4e6e62c020eaa48709302ef8e746736c0e19342cc1ce3df4000000000000000000000000000000000492f4fed741b073e5a82580f7c663f9b79e036b70ab3e51162359cec4e77c78086fe879b65ca7a47d34374c8315ac5e', + Gas: 110000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000008d4a0997b9d52fecf99427abb721f0fa779479963315fe21c6445250de7183e3f63bfdf86570da8929489e421d4ee950000000000000000000000000000000016cb4ccad91ec95aab070f22043916cd6a59c4ca94097f7f510043d48515526dc8eaaea27e586f09151ae613688d5a89', + Name: 'bls_g2map_713132385f717171', + Expected: + '000000000000000000000000000000000c5ae723be00e6c3f0efe184fdc0702b64588fe77dda152ab13099a3bacd3876767fa7bbad6d6fd90b3642e902b208f90000000000000000000000000000000012c8c05c1d5fc7bfa847f4d7d81e294e66b9a78bc9953990c358945e1f042eedafce608b67fdd3ab0cb2e6e263b9b1ad0000000000000000000000000000000004e77ddb3ede41b5ec4396b7421dd916efc68a358a0d7425bddd253547f2fb4830522358491827265dfc5bcc1928a5690000000000000000000000000000000011c624c56dbe154d759d021eec60fab3d8b852395a89de497e48504366feedd4662d023af447d66926a28076813dd646', + Gas: 110000, + NoBenchmark: false, + }, + { + Input: + '0000000000000000000000000000000003f80ce4ff0ca2f576d797a3660e3f65b274285c054feccc3215c879e2c0589d376e83ede13f93c32f05da0f68fd6a1000000000000000000000000000000000006488a837c5413746d868d1efb7232724da10eca410b07d8b505b9363bdccf0a1fc0029bad07d65b15ccfe6dd25e20d', + Name: 'bls_g2map_613531325f616161', + Expected: + '000000000000000000000000000000000ea4e7c33d43e17cc516a72f76437c4bf81d8f4eac69ac355d3bf9b71b8138d55dc10fd458be115afa798b55dac34be1000000000000000000000000000000001565c2f625032d232f13121d3cfb476f45275c303a037faa255f9da62000c2c864ea881e2bcddd111edc4a3c0da3e88d00000000000000000000000000000000043b6f5fe4e52c839148dc66f2b3751e69a0f6ebb3d056d6465d50d4108543ecd956e10fa1640dfd9bc0030cc2558d28000000000000000000000000000000000f8991d2a1ad662e7b6f58ab787947f1fa607fce12dde171bc17903b012091b657e15333e11701edcf5b63ba2a561247', + Gas: 110000, + NoBenchmark: false, + }, +] +describe('Precompiles: BLS12-FP2-TO-G2', () => { + it('should produce expected output', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12FP2TOG2 = getActivePrecompiles(common).get( + '0000000000000000000000000000000000000013' + )! + + for (const testVector of testData) { + const result = await BLS12FP2TOG2({ + data: hexToBytes('0x' + testVector.Input), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + '0x' + testVector.Expected, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + assert.equal(result.executionGasUsed, BigInt(testVector.Gas)) + } + }) +}) diff --git a/packages/evm/test/precompiles/eip-2537-BLS.spec.ts b/packages/evm/test/precompiles/eip-2537-BLS.spec.ts new file mode 100644 index 000000000..010d70909 --- /dev/null +++ b/packages/evm/test/precompiles/eip-2537-BLS.spec.ts @@ -0,0 +1,112 @@ +import { Chain, Common, Hardfork } from '@ethereumjs/common' +import { Address, bytesToHex, hexToBytes } from '@ethereumjs/util' +import { assert, describe, it } from 'vitest' + +import { EVM } from '../../src/evm.js' +import { getActivePrecompiles } from '../../src/index.js' + +const precompileAddressStart = 0x0b +const precompileAddressEnd = 0x13 + +const precompiles: string[] = [] + +for (let address = precompileAddressStart; address <= precompileAddressEnd; address++) { + precompiles.push('0x' + address.toString(16).padStart(40, '0')) +} + +describe('EIP-2537 BLS tests', () => { + it('BLS precompiles should not be available if EIP not activated', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.MuirGlacier }) + const evm = await EVM.create({ + common, + }) + + for (const address of precompiles) { + const to = new Address(hexToBytes(address)) + const result = await evm.runCall({ + caller: Address.zero(), + gasLimit: BigInt(0xffffffffff), + to, + value: BigInt(0), + data: new Uint8Array(0), + }) + + if (result.execResult.executionGasUsed !== BigInt(0)) { + assert.fail('BLS precompiles should not use any gas if EIP not activated') + } + + if (result.execResult.exceptionError) { + assert.fail('BLS precompiles should not throw if EIP not activated') + } + } + + assert.ok(true, 'BLS precompiles unreachable if EIP not activated') + }) + + it('BLS precompiles should throw on empty inputs', async () => { + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Berlin, + eips: [2537], + }) + const evm = await EVM.create({ + common, + }) + + for (const address of precompiles) { + const to = new Address(hexToBytes(address)) + const result = await evm.runCall({ + caller: Address.zero(), + gasLimit: BigInt(0xffffffffff), + to, + value: BigInt(0), + data: new Uint8Array(0), + }) + + if (result.execResult.executionGasUsed !== BigInt(0xffffffffff)) { + assert.fail('BLS precompiles should use all gas on empty inputs') + } + + if (!result.execResult.exceptionError) { + assert.fail('BLS precompiles should throw on empty inputs') + } + } + + assert.ok(true, 'BLS precompiles throw correctly on empty inputs') + }) + + /* + The following tests validate that the various precompiles associated with EIP2537 produce expected results against test vectors + pulled from this collection of test data provided by Matter Labs here - + https://github.com/matter-labs/eip1962/tree/master/src/test/test_vectors/eip2537 + + In each test, the precompile should take the testVector and produce the testVectorResult + */ + it('BLS12-G2MultiExp', async () => { + const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin, eips: [2537] }) + const evm = await EVM.create({ + common, + }) + const BLS12G2MultiExp = getActivePrecompiles(common).get( + '0000000000000000000000000000000000000010' + )! + + const testVector = + '0x00000000000000000000000000000000039b10ccd664da6f273ea134bb55ee48f09ba585a7e2bb95b5aec610631ac49810d5d616f67ba0147e6d1be476ea220e0000000000000000000000000000000000fbcdff4e48e07d1f73ec42fe7eb026f5c30407cfd2f22bbbfe5b2a09e8a7bb4884178cb6afd1c95f80e646929d30040000000000000000000000000000000001ed3b0e71acb0adbf44643374edbf4405af87cfc0507db7e8978889c6c3afbe9754d1182e98ac3060d64994d31ef576000000000000000000000000000000001681a2bf65b83be5a2ca50430949b6e2a099977482e9405b593f34d2ed877a3f0d1bddc37d0cec4d59d7df74b2b8f2dfb3c940fe79b6966489b527955de7599194a9ac69a6ff58b8d99e7b1084f0464e0000000000000000000000000000000018c0ada6351b70661f053365deae56910798bd2ace6e2bf6ba4192d1a229967f6af6ca1c9a8a11ebc0a232344ee0f6d6000000000000000000000000000000000cc70a587f4652039d8117b6103858adcd9728f6aebe230578389a62da0042b7623b1c0436734f463cfdd187d20903240000000000000000000000000000000009f50bd7beedb23328818f9ffdafdb6da6a4dd80c5a9048ab8b154df3cad938ccede829f1156f769d9e149791e8e0cd900000000000000000000000000000000079ba50d2511631b20b6d6f3841e616e9d11b68ec3368cd60129d9d4787ab56c4e9145a38927e51c9cd6271d493d93884d0e25bf3f6fc9f4da25d21fdc71773f1947b7a8a775b8177f7eca990b05b71d0000000000000000000000000000000003632695b09dbf86163909d2bb25995b36ad1d137cf252860fd4bb6c95749e19eb0c1383e9d2f93f2791cb0cf6c8ed9d000000000000000000000000000000001688a855609b0bbff4452d146396558ff18777f329fd4f76a96859dabfc6a6f6977c2496280dbe3b1f8923990c1d6407000000000000000000000000000000000c8567fee05d05af279adc67179468a29d7520b067dbb348ee315a99504f70a206538b81a457cce855f4851ad48b7e80000000000000000000000000000000001238dcdfa80ea46e1500026ea5feadb421de4409f4992ffbf5ae59fa67fd82f38452642a50261b849e74b4a33eed70cc973f40c12c92b703d7b7848ef8b4466d40823aad3943a312b57432b91ff68be1000000000000000000000000000000000149704960cccf9d5ea414c73871e896b1d4cf0a946b0db72f5f2c5df98d2ec4f3adbbc14c78047961bc9620cb6cfb5900000000000000000000000000000000140c5d25e534fb1bfdc19ba4cecaabe619f6e0cd3d60b0f17dafd7bcd27b286d4f4477d00c5e1af22ee1a0c67fbf177c00000000000000000000000000000000029a1727041590b8459890de736df15c00d80ab007c3aee692ddcdf75790c9806d198e9f4502bec2f0a623491c3f877d0000000000000000000000000000000008a94c98baa9409151030d4fae2bd4a64c6f11ea3c99b9661fdaed226b9a7c2a7d609be34afda5d18b8911b6e015bf494c51f97bcdda93904ae26991b471e9ea942e2b5b8ed26055da11c58bc7b5002a000000000000000000000000000000001156d478661337478ab0cbc877a99d9e4d9824a2b3f605d41404d6b557b3ffabbf42635b0bbcb854cf9ed8b8637561a8000000000000000000000000000000001147ed317d5642e699787a7b47e6795c9a8943a34a694007e44f8654ba96390cf19f010dcf695e22c21874022c6ce291000000000000000000000000000000000c6dccdf920fd5e7fae284115511952633744c6ad94120d9cae6acda8a7c23c48bd912cba6c38de5159587e1e6cad519000000000000000000000000000000001944227d462bc2e5dcc6f6db0f83dad411ba8895262836f975b2b91e06fd0e2138862162acc04e9e65050b34ccbd1a4e8964d5867927bc3e35a0b4c457482373969bff5edff8a781d65573e07fd87b890000000000000000000000000000000019c31e3ab8cc9c920aa8f56371f133b6cb8d7b0b74b23c0c7201aca79e5ae69dc01f1f74d2492dcb081895b17d106b4e000000000000000000000000000000001789b0d371bd63077ccde3dbbebf3531368feb775bced187fb31cc6821481664600978e323ff21085b8c08e0f21daf72000000000000000000000000000000000009eacfe8f4a2a9bae6573424d07f42bd6af8a9d55f71476a7e3c7a4b2b898550c1e72ec13afd4eff22421a03af1d31000000000000000000000000000000000410bd4ea74dcfa33f2976aa1b571c67cbb596ab10f76a8aaf4548f1097e55b3373bff02683f806cb84e1e0e877819e2787c38b944eadbd03fd3187f450571740f6cd00e5b2e560165846eb800e5c94400000000000000000000000000000000147f09986691f2e57073378e8bfd58804241eed7934f6adfe6d0a6bac4da0b738495778a303e52113e1c80e698476d50000000000000000000000000000000000762348b84c92a8ca6de319cf1f8f11db296a71b90fe13e1e4bcd25903829c00a5d2ad4b1c8d98c37eaad7e042ab023d0000000000000000000000000000000011d1d94530d4a2daf0e902a5c3382cd135938557f94b04bccea5e16ea089c5e020e13524c854a316662bd68784fe31f300000000000000000000000000000000070828522bec75b6a492fd9bca7b54dac6fbbf4f0bc3179d312bb65c647439e3868e4d5b21af5a64c93aeee8a9b7e46eaaee7ae2a237e8e53560c79e7baa9adf9c00a0ea4d6f514e7a6832eb15cef1e1000000000000000000000000000000000690a0869204c8dced5ba0ce13554b2703a3f18afb8fa8fa1c457d79c58fdc25471ae85bafad52e506fc1917fc3becff0000000000000000000000000000000010f7dbb16f8571ede1cec79e3f9ea03ae6468d7285984713f19607f5cab902b9a6b7cbcfd900be5c2e407cc093ea0e6700000000000000000000000000000000151caf87968433cb1f85fc1854c57049be22c26497a86bfbd66a2b3af121d894dba8004a17c6ff96a5843c2719fa32d10000000000000000000000000000000011f0270f2b039409f70392879bcc2c67c836c100cf9883d3dc48d7adbcd52037d270539e863a951acd47ecaa1ca4db12dac6ed3ef45c1d7d3028f0f89e5458797996d3294b95bebe049b76c7d0db317c0000000000000000000000000000000017fae043c8fd4c520a90d4a6bd95f5b0484acc279b899e7b1d8f7f7831cc6ba37cd5965c4dc674768f5805842d433af30000000000000000000000000000000008ddd7b41b8fa4d29fb931830f29b46f4015ec202d51cb969d7c832aafc0995c875cd45eff4a083e2d5ecb5ad185b64f0000000000000000000000000000000015d384ab7e52420b83a69827257cb52b00f0199ed2240a142812b46cf67e92b99942ac59fb9f9efd7dd822f5a36c799f00000000000000000000000000000000074b3a16a9cc4be9da0ac8e2e7003d9c1ec89244d2c33441b31af76716cce439f805843a9a44701203231efdca551d5bbb30985756c3ca075114c92f231575d6befafe4084517f1166a47376867bd108000000000000000000000000000000000e25365988664e8b6ade2e5a40da49c11ff1e084cc0f8dca51f0d0578555d39e3617c8cadb2abc2633b28c5895ab0a9e00000000000000000000000000000000169f5fd768152169c403475dee475576fd2cc3788179453b0039ff3cb1b7a5a0fff8f82d03f56e65cad579218486c3b600000000000000000000000000000000087ccd7f92032febc1f75c7115111ede4acbb2e429cbccf3959524d0b79c449d431ff65485e1aecb442b53fec80ecb4000000000000000000000000000000000135d63f264360003b2eb28f126c6621a40088c6eb15acc4aea89d6068e9d5a47f842aa4b4300f5cda5cc5831edb81596fb730105809f64ea522983d6bbb62f7e2e8cbf702685e9be10e2ef71f818767200000000000000000000000000000000159da74f15e4c614b418997f81a1b8a3d9eb8dd80d94b5bad664bff271bb0f2d8f3c4ceb947dc6300d5003a2f7d7a829000000000000000000000000000000000cdd4d1d4666f385dd54052cf5c1966328403251bebb29f0d553a9a96b5ade350c8493270e9b5282d8a06f9fa8d7b1d900000000000000000000000000000000189f8d3c94fdaa72cc67a7f93d35f91e22206ff9e97eed9601196c28d45b69c802ae92bcbf582754717b0355e08d37c000000000000000000000000000000000054b0a282610f108fc7f6736b8c22c8778d082bf4b0d0abca5a228198eba6a868910dd5c5c440036968e977955054196b6a9408625b0ca8fcbfb21d34eec2d8e24e9a30d2d3b32d7a37d110b13afbfea000000000000000000000000000000000f29b0d2b6e3466668e1328048e8dbc782c1111ab8cbe718c85d58ded992d97ca8ba20b9d048feb6ed0aa1b4139d02d3000000000000000000000000000000000d1f0dae940b99fbfc6e4a58480cac8c4e6b2fe33ce6f39c7ac1671046ce94d9e16cba2bb62c6749ef73d45bea21501a000000000000000000000000000000001902ccece1c0c763fd06934a76d1f2f056563ae6d8592bafd589cfebd6f057726fd908614ccd6518a21c66ecc2f78b660000000000000000000000000000000017f6b113f8872c3187d20b0c765d73b850b54244a719cf461fb318796c0b8f310b5490959f9d9187f99c8ed3e25e42a93b77283d0a7bb9e17a27e66851792fdd605cc0a339028b8985390fd024374c76000000000000000000000000000000000576b8cf1e69efdc277465c344cadf7f8cceffacbeca83821f3ff81717308b97f4ac046f1926e7c2eb42677d7afc257c000000000000000000000000000000000cc1524531e96f3c00e4250dd351aedb5a4c3184aff52ec8c13d470068f5967f3674fe173ee239933e67501a9decc6680000000000000000000000000000000001610cfcaea414c241b44cf6f3cc319dcb51d6b8de29c8a6869ff7c1ebb7b747d881e922b42e8fab96bde7cf23e8e4cd0000000000000000000000000000000017d4444dc8b6893b681cf10dac8169054f9d2f61d3dd5fd785ae7afa49d18ebbde9ce8dde5641adc6b38173173459836dd994eae929aee7428fdda2e44f8cb12b10b91c83b22abc8bbb561310b62257c000000000000000000000000000000000ca8f961f86ee6c46fc88fbbf721ba760186f13cd4cce743f19dc60a89fd985cb3feee34dcc4656735a326f515a729e400000000000000000000000000000000174baf466b809b1155d524050f7ee58c7c5cf728c674e0ce549f5551047a4479ca15bdf69b403b03fa74eb1b26bbff6c0000000000000000000000000000000000e8c8b587c171b1b292779abfef57202ed29e7fe94ade9634ec5a2b3b4692a4f3c15468e3f6418b144674be70780d5b000000000000000000000000000000001865e99cf97d88bdf56dae32314eb32295c39a1e755cd7d1478bea8520b9ff21c39b683b92ae15568420c390c42b123b7010b134989c8368c7f831f9dd9f9a890e2c1435681107414f2e8637153bbf6a0000000000000000000000000000000017eccd446f10018219a1bd111b8786cf9febd49f9e7e754e82dd155ead59b819f0f20e42f4635d5044ec5d550d847623000000000000000000000000000000000403969d2b8f914ff2ea3bf902782642e2c6157bd2a343acf60ff9125b48b558d990a74c6d4d6398e7a3cc2a16037346000000000000000000000000000000000bd45f61f142bd78619fb520715320eb5e6ebafa8b078ce796ba62fe1a549d5fb9df57e92d8d2795988eb6ae18cf9d9300000000000000000000000000000000097db1314e064b8e670ec286958f17065bce644cf240ab1b1b220504560d36a0b43fc18453ff3a2bb315e219965f5bd394c68bc8d91ac8c489ee87dbfc4b94c93c8bbd5fc04c27db8b02303f3a65905400000000000000000000000000000000018244ab39a716e252cbfb986c7958b371e29ea9190010d1f5e1cfdb6ce4822d4055c37cd411fc9a0c46d728f2c13ecf0000000000000000000000000000000001985d3c667c8d68c9adb92bdc7a8af959c17146544997d97116120a0f55366bd7ad7ffa28d93ee51222ff9222779675000000000000000000000000000000000c70fd4e3c8f2a451f83fb6c046431b38251b7bae44cf8d36df69a03e2d3ce6137498523fcf0bcf29b5d69e8f265e24d00000000000000000000000000000000047b9163a218f7654a72e0d7c651a2cf7fd95e9784a59e0bf119d081de6c0465d374a55fbc1eff9828c9fd29abf4c4bdb3682accc3939283b870357cf83683350baf73aa0d3d68bda82a0f6ae7e51746' + const testVectorResult = + '0x00000000000000000000000000000000083ad744b34f6393bc983222b004657494232c5d9fbc978d76e2377a28a34c4528da5d91cbc0977dc953397a6d21eca20000000000000000000000000000000015aec6526e151cf5b8403353517dfb9a162087a698b71f32b266d3c5c936a83975d5567c25b3a5994042ec1379c8e526000000000000000000000000000000000e3647185d1a20efad19f975729908840dc33909a583600f7915025f906aef9c022fd34e618170b11178aaa824ae36b300000000000000000000000000000000159576d1d53f6cd12c39d651697e11798321f17cd287118d7ebeabf68281bc03109ee103ee8ef2ef93c71dd1dcbaf1e0' + + const result = await BLS12G2MultiExp({ + data: hexToBytes(testVector), + gasLimit: BigInt(5000000), + common, + _EVM: evm, + }) + + assert.deepEqual( + testVectorResult, + bytesToHex(result.returnValue), + 'return value should match testVectorResult' + ) + }) +}) diff --git a/packages/evm/test/runCode.spec.ts b/packages/evm/test/runCode.spec.ts index de0f795fb..fdc0f2c79 100644 --- a/packages/evm/test/runCode.spec.ts +++ b/packages/evm/test/runCode.spec.ts @@ -21,7 +21,7 @@ const testCases = [ describe('VM.runCode: initial program counter', () => { it('should work', async () => { - const evm = await EVM.create({}) + const evm = await EVM.create() for (const [i, testData] of testCases.entries()) { const runCodeArgs = { @@ -57,7 +57,7 @@ describe('VM.runCode: initial program counter', () => { describe('VM.runCode: interpreter', () => { it('should return a EvmError as an exceptionError on the result', async () => { - const evm = await EVM.create({}) + const evm = await EVM.create() const INVALID_opcode = 'fe' const runCodeArgs = { @@ -76,7 +76,7 @@ describe('VM.runCode: interpreter', () => { }) it('should throw on non-EvmError', async () => { - const evm = await EVM.create({}) + const evm = await EVM.create() // NOTE: due to now throwing on `getContractStorage` if account does not exist // this now means that if `runCode` is called and the address it runs on (default: zero address) // does not exist, then if SSTORE/SLOAD is used, the runCode will immediately fail because StateManager now throws @@ -105,7 +105,7 @@ describe('VM.runCode: interpreter', () => { describe('VM.runCode: RunCodeOptions', () => { it('should throw on negative value args', async () => { - const evm = await EVM.create({}) + const evm = await EVM.create() const runCodeArgs = { value: BigInt(-10), diff --git a/packages/evm/test/stack.spec.ts b/packages/evm/test/stack.spec.ts index 496b6bc41..1d6b79523 100644 --- a/packages/evm/test/stack.spec.ts +++ b/packages/evm/test/stack.spec.ts @@ -99,7 +99,7 @@ describe('Stack', () => { it('stack items should not change if they are DUPed', async () => { const caller = new Address(hexToBytes('0x00000000000000000000000000000000000000ee')) const addr = new Address(hexToBytes('0x00000000000000000000000000000000000000ff')) - const evm = await EVM.create({}) + const evm = await EVM.create() const account = createAccount(BigInt(0), BigInt(0)) const code = '0x60008080808060013382F15060005260206000F3' const expectedReturnValue = setLengthLeft(bigIntToBytes(BigInt(0)), 32) diff --git a/packages/genesis/CHANGELOG.md b/packages/genesis/CHANGELOG.md index 146135926..cdd07f8f6 100644 --- a/packages/genesis/CHANGELOG.md +++ b/packages/genesis/CHANGELOG.md @@ -6,7 +6,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -### 0.2.1 - 2024-02-08 +## 0.2.2 - 2024-03-05 + +Maintenance release with downstream dependency updates, see PR [#3297](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3297) + +## 0.2.1 - 2024-02-08 Maintenance release with dependency updates, see PR [#3261](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3261) diff --git a/packages/genesis/docs/README.md b/packages/genesis/docs/README.md new file mode 100644 index 000000000..87f7d2e13 --- /dev/null +++ b/packages/genesis/docs/README.md @@ -0,0 +1,34 @@ +@ethereumjs/genesis + +# @ethereumjs/genesis + +## Table of contents + +### Functions + +- [getGenesis](README.md#getgenesis) + +## Functions + +### getGenesis + +▸ **getGenesis**(`chainId`): `GenesisState` \| `undefined` + +Utility to get the genesisState of a well known network +@param: chainId of the network + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `chainId` | `number` | + +#### Returns + +`GenesisState` \| `undefined` + +genesisState of the chain + +#### Defined in + +[index.ts:15](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/genesis/src/index.ts#L15) diff --git a/packages/genesis/package.json b/packages/genesis/package.json index c3ab4113c..ddebf9724 100644 --- a/packages/genesis/package.json +++ b/packages/genesis/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/genesis", - "version": "0.2.1", + "version": "0.2.2", "description": "A module to provide genesis states of well known networks", "keywords": [ "ethereum", @@ -53,18 +53,18 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node", - "test:browser": "vitest run test/* --browser.name=chrome --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "vitest run test/*", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/common": "^4.2.0", - "@ethereumjs/util": "^9.0.2" + "@ethereumjs/common": "^4.3.0", + "@ethereumjs/util": "^9.0.3" }, "engines": { "node": ">=18" }, "devDependencies": { - "@ethereumjs/trie": "^6.1.1" + "@ethereumjs/trie": "^6.2.0" } } diff --git a/packages/genesis/test/index.spec.ts b/packages/genesis/test/index.spec.ts index fcd24fd66..d3eb6023b 100644 --- a/packages/genesis/test/index.spec.ts +++ b/packages/genesis/test/index.spec.ts @@ -10,7 +10,7 @@ describe('genesis test', () => { const chainIds = Object.keys(ChainGenesis) for (const chainId of chainIds) { // Kaustinen can have an empty genesis state since verkle blocks contain their pre-state - if (Number(chainId) === Chain.Kaustinen) continue + if (Number(chainId) === Chain.Kaustinen6) continue const { name, stateRoot: expectedRoot } = ChainGenesis[chainId as unknown as Chain] diff --git a/packages/rlp/package.json b/packages/rlp/package.json index 3f62cbf16..28cb44254 100644 --- a/packages/rlp/package.json +++ b/packages/rlp/package.json @@ -54,7 +54,7 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --browser.name=chrome --browser.headless -c=vitest.config.browser.ts", + "test:browser": "npx vitest run --config=./vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, diff --git a/packages/rlp/test/integration.spec.ts b/packages/rlp/test/integration.spec.ts index c4ee15904..107c0dcd4 100644 --- a/packages/rlp/test/integration.spec.ts +++ b/packages/rlp/test/integration.spec.ts @@ -1,7 +1,4 @@ -import { exec } from 'child_process' -import { promisify } from 'util' -import { assert, describe, it } from 'vitest' -import * as vm from 'vm' +import { assert, beforeAll, describe, it } from 'vitest' import { RLP } from '../src/index.js' @@ -18,12 +15,15 @@ describe('Distribution', () => { }) }) -const execAsync = promisify(exec) - describe.skipIf(isBrowser)('CLI command', () => { + let exec: any + beforeAll(async () => { + const child_process = await import('child_process') + exec = child_process.exec + }) it('should be able to run CLI command', async () => { - const result = await execAsync('./bin/rlp encode "[ 5 ]"') - const resultFormatted = result.stdout.trim() + const result = exec('./bin/rlp encode "[ 5 ]"') + const resultFormatted = result.stdout!.read().trim() assert.deepEqual(resultFormatted, '0xc105') }) @@ -39,8 +39,8 @@ describe.skipIf(isBrowser)('CLI command', () => { } const json = JSON.stringify(incoming) - const encodeResult = await execAsync(`./bin/rlp encode '${json}'`) - const encodeResultTrimmed = encodeResult.stdout.trim() + const encodeResult = exec(`./bin/rlp encode '${json}'`) + const encodeResultTrimmed = encodeResult.stdout!.read().trim() assert.deepEqual(encodeResultTrimmed, out.toLowerCase(), `should pass encoding ${testName}`) } }, @@ -48,8 +48,9 @@ describe.skipIf(isBrowser)('CLI command', () => { ) }) -describe('Cross-frame', () => { - it('should be able to encode Arrays across stack frames', () => { +describe.skipIf(isBrowser)('Cross-frame', () => { + it('should be able to encode Arrays across stack frames', async () => { + const vm = await import('vm') assert.deepEqual( vm.runInNewContext( "Array.from(RLP.encode(['dog', 'god', 'cat'])).map(n => n.toString(16).padStart(2, '0')).join('')", diff --git a/packages/rlp/vitest.browser.config.mts b/packages/rlp/vitest.browser.config.mts new file mode 100644 index 000000000..8429f23f3 --- /dev/null +++ b/packages/rlp/vitest.browser.config.mts @@ -0,0 +1,12 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import baseConfig from '../../config/vitest.browser.config.mjs' +export default mergeConfig( + baseConfig, + defineConfig({ + test: { + silent: true, + exclude: ['test/cli.spec.ts'], + testTimeout: 180000, + }, + }) +) \ No newline at end of file diff --git a/packages/statemanager/CHANGELOG.md b/packages/statemanager/CHANGELOG.md index 4ae535dcf..9d0c5069c 100644 --- a/packages/statemanager/CHANGELOG.md +++ b/packages/statemanager/CHANGELOG.md @@ -6,6 +6,50 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 2.3.0 - 2024-03-05 + +### Full 4844 Browser Readiness + +#### WASM KZG + +Shortly following the "Dencun Hardfork Support" release round from last month, this is now the first round of releases where the EthereumJS libraries are now fully browser compatible regarding the new 4844 functionality, see PRs [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) and [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296)! 🎉 + +Our WASM wizard @acolytec3 has spent the last two weeks and created a WASM build of the [c-kzg](https://github.com/benjaminion/c-kzg) library which we have released under the `kzg-wasm` name on npm (and you can also use independently for other projects). See the newly created [GitHub repository](https://github.com/ethereumjs/kzg-wasm) for some library-specific documentation. + +This WASM KZG library can now be used for KZG initialization (replacing the old recommended `c-kzg` initialization), see the respective [README section](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/README.md#kzg-initialization) from the tx library for usage instructions (which is also accurate for the other using upstream libraries like block or EVM). + +Note that `kzg-wasm` needs to be added manually to your own dependencies and the KZG initialization code needs to be adopted like the following (which you will likely want to do in most cases, so if you deal with post Dencun EVM bytecode and/or 4844 blob txs in any way): + +```typescript +import { loadKZG } from 'kzg-wasm' +import { Chain, Common, Hardfork } from '@ethereumjs/common' + +const kzg = await loadKZG() + +// Instantiate `common` +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, +}) +``` + +Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. + +Note that passing in the KZG setup file is not necessary anymore, since this is now defaulting to the setup file from the official [KZG ceremony](https://ceremony.ethereum.org/) (which is now bundled with the KZG library). + +#### Trie Node.js Import Bug + +Since this fits well also to be placed here relatively prominently for awareness: we had a relatively nasty bug in the `@ethereumjs/trie` library with a `Node.js` web stream import also affecting browser compatibility, see PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). This bug has been fixed along with these releases and this library now references the updated trie library version. + +### Other Changes + +- Properly apply statemanager `opts` in `fromProof()`, PR [#3276](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3276) +- New optional `getAppliedKey()` method for the interface (see interface definition in `@ethereumjs/common`), PR [#3143](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3143) +- Fix inconsistency between the normal and the RPC statemanager regarding empty account return values, PR [#3323](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3323) +- Fix a type error related to the `lru-cache` dependency, PR [#3285](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3285) +- Add tests for verkle statemanager, PR [#3257](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3257) + ## 2.2.2 - 2024-02-08 - Hotfix release moving the `@ethereumjs/verkle` dependency from a peer dependency to the main dependencis (note that this decision might be temporary) diff --git a/packages/statemanager/docs/classes/AccessWitness.md b/packages/statemanager/docs/classes/AccessWitness.md index d5a4bd0bc..39163b5e1 100644 --- a/packages/statemanager/docs/classes/AccessWitness.md +++ b/packages/statemanager/docs/classes/AccessWitness.md @@ -30,7 +30,7 @@ - [touchAndChargeValueTransfer](AccessWitness.md#touchandchargevaluetransfer) - [touchCodeChunksRangeOnReadAndChargeGas](AccessWitness.md#touchcodechunksrangeonreadandchargegas) - [touchCodeChunksRangeOnWriteAndChargeGas](AccessWitness.md#touchcodechunksrangeonwriteandchargegas) -- [touchTxExistingAndComputeGas](AccessWitness.md#touchtxexistingandcomputegas) +- [touchTxTargetAndComputeGas](AccessWitness.md#touchtxtargetandcomputegas) - [touchTxOriginAndComputeGas](AccessWitness.md#touchtxoriginandcomputegas) ## Constructors @@ -376,9 +376,9 @@ ___ ___ -### touchTxExistingAndComputeGas +### touchTxTargetAndComputeGas -▸ **touchTxExistingAndComputeGas**(`target`, `__namedParameters?`): `bigint` +▸ **touchTxTargetAndComputeGas**(`target`, `__namedParameters?`): `bigint` #### Parameters diff --git a/packages/statemanager/docs/classes/DefaultStateManager.md b/packages/statemanager/docs/classes/DefaultStateManager.md index 6688570ee..b83a7834e 100644 --- a/packages/statemanager/docs/classes/DefaultStateManager.md +++ b/packages/statemanager/docs/classes/DefaultStateManager.md @@ -39,6 +39,7 @@ The default state manager implementation uses a - [flush](DefaultStateManager.md#flush) - [generateCanonicalGenesis](DefaultStateManager.md#generatecanonicalgenesis) - [getAccount](DefaultStateManager.md#getaccount) +- [getAppliedKey](DefaultStateManager.md#getappliedkey) - [getContractCode](DefaultStateManager.md#getcontractcode) - [getContractStorage](DefaultStateManager.md#getcontractstorage) - [getProof](DefaultStateManager.md#getproof) @@ -70,7 +71,7 @@ Instantiate the StateManager interface. #### Defined in -[stateManager.ts:194](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L194) +[stateManager.ts:192](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L192) ## Properties @@ -117,7 +118,7 @@ Add proof(s) into an already existing trie #### Defined in -[stateManager.ts:824](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L824) +[stateManager.ts:819](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L819) ___ @@ -139,7 +140,7 @@ EVMStateManagerInterface.checkpoint #### Defined in -[stateManager.ts:597](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L597) +[stateManager.ts:593](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L593) ___ @@ -155,7 +156,7 @@ Clears all underlying caches #### Defined in -[stateManager.ts:1133](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1133) +[stateManager.ts:1148](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1148) ___ @@ -181,7 +182,7 @@ EVMStateManagerInterface.clearContractStorage #### Defined in -[stateManager.ts:580](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L580) +[stateManager.ts:576](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L576) ___ @@ -202,7 +203,7 @@ EVMStateManagerInterface.commit #### Defined in -[stateManager.ts:609](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L609) +[stateManager.ts:605](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L605) ___ @@ -228,7 +229,7 @@ EVMStateManagerInterface.deleteAccount #### Defined in -[stateManager.ts:337](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L337) +[stateManager.ts:333](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L333) ___ @@ -258,7 +259,7 @@ EVMStateManagerInterface.dumpStorage #### Defined in -[stateManager.ts:963](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L963) +[stateManager.ts:962](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L962) ___ @@ -290,7 +291,7 @@ EVMStateManagerInterface.dumpStorageRange #### Defined in -[stateManager.ts:989](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L989) +[stateManager.ts:995](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L995) ___ @@ -306,7 +307,7 @@ Writes all cache items to the trie #### Defined in -[stateManager.ts:651](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L651) +[stateManager.ts:647](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L647) ___ @@ -333,7 +334,7 @@ EVMStateManagerInterface.generateCanonicalGenesis #### Defined in -[stateManager.ts:1036](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1036) +[stateManager.ts:1051](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1051) ___ @@ -359,7 +360,36 @@ EVMStateManagerInterface.getAccount #### Defined in -[stateManager.ts:264](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L264) +[stateManager.ts:260](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L260) + +___ + +### getAppliedKey + +▸ **getAppliedKey**(`address`): `Uint8Array` + +Returns the applied key for a given address +Used for saving preimages + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `address` | `Uint8Array` | The address to return the applied key | + +#### Returns + +`Uint8Array` + +- The applied key (e.g. hashed address) + +#### Implementation of + +EVMStateManagerInterface.getAppliedKey + +#### Defined in + +[stateManager.ts:1160](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1160) ___ @@ -388,7 +418,7 @@ EVMStateManagerInterface.getContractCode #### Defined in -[stateManager.ts:383](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L383) +[stateManager.ts:379](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L379) ___ @@ -420,7 +450,7 @@ EVMStateManagerInterface.getContractStorage #### Defined in -[stateManager.ts:466](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L466) +[stateManager.ts:462](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L462) ___ @@ -447,7 +477,7 @@ EVMStateManagerInterface.getProof #### Defined in -[stateManager.ts:711](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L711) +[stateManager.ts:707](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L707) ___ @@ -471,7 +501,7 @@ EVMStateManagerInterface.getStateRoot #### Defined in -[stateManager.ts:921](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L921) +[stateManager.ts:920](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L920) ___ @@ -497,7 +527,7 @@ EVMStateManagerInterface.hasStateRoot #### Defined in -[stateManager.ts:1072](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1072) +[stateManager.ts:1087](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1087) ___ @@ -526,7 +556,7 @@ EVMStateManagerInterface.modifyAccountFields #### Defined in -[stateManager.ts:321](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L321) +[stateManager.ts:317](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L317) ___ @@ -553,7 +583,7 @@ EVMStateManagerInterface.putAccount #### Defined in -[stateManager.ts:288](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L288) +[stateManager.ts:284](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L284) ___ @@ -581,7 +611,7 @@ EVMStateManagerInterface.putContractCode #### Defined in -[stateManager.ts:360](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L360) +[stateManager.ts:356](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L356) ___ @@ -610,7 +640,7 @@ EVMStateManagerInterface.putContractStorage #### Defined in -[stateManager.ts:553](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L553) +[stateManager.ts:549](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L549) ___ @@ -631,7 +661,7 @@ EVMStateManagerInterface.revert #### Defined in -[stateManager.ts:631](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L631) +[stateManager.ts:627](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L627) ___ @@ -661,7 +691,7 @@ EVMStateManagerInterface.setStateRoot #### Defined in -[stateManager.ts:933](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L933) +[stateManager.ts:932](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L932) ___ @@ -706,7 +736,7 @@ EVMStateManagerInterface.shallowCopy #### Defined in -[stateManager.ts:1098](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1098) +[stateManager.ts:1113](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L1113) ___ @@ -728,7 +758,7 @@ Verify an EIP-1186 proof. Throws if proof is invalid, otherwise returns true. #### Defined in -[stateManager.ts:847](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L847) +[stateManager.ts:842](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L842) ___ @@ -744,8 +774,8 @@ This generates a (partial) StateManager where one can retrieve all items from th | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | | `proof` | [`Proof`](../README.md#proof) \| [`Proof`](../README.md#proof)[] | `undefined` | Either a proof retrieved from `getProof`, or an array of those proofs | -| `safe` | `boolean` | `false` | Wether or not to verify that the roots of the proof items match the reported roots | -| `opts` | [`DefaultStateManagerOpts`](../interfaces/DefaultStateManagerOpts.md) | `{}` | - | +| `safe` | `boolean` | `false` | Whether or not to verify that the roots of the proof items match the reported roots | +| `opts` | [`DefaultStateManagerOpts`](../interfaces/DefaultStateManagerOpts.md) | `{}` | a dictionary of StateManager opts | #### Returns @@ -755,4 +785,4 @@ A new DefaultStateManager with elements from the given proof included in its bac #### Defined in -[stateManager.ts:765](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L765) +[stateManager.ts:760](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/stateManager.ts#L760) diff --git a/packages/statemanager/docs/classes/RPCBlockChain.md b/packages/statemanager/docs/classes/RPCBlockChain.md index e780218fb..7d85a86c5 100644 --- a/packages/statemanager/docs/classes/RPCBlockChain.md +++ b/packages/statemanager/docs/classes/RPCBlockChain.md @@ -31,7 +31,7 @@ #### Defined in -[rpcStateManager.ts:435](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L435) +[rpcStateManager.ts:445](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L445) ## Properties @@ -41,7 +41,7 @@ #### Defined in -[rpcStateManager.ts:434](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L434) +[rpcStateManager.ts:444](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L444) ## Methods @@ -61,7 +61,7 @@ #### Defined in -[rpcStateManager.ts:439](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L439) +[rpcStateManager.ts:449](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L449) ___ @@ -75,4 +75,4 @@ ___ #### Defined in -[rpcStateManager.ts:449](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L449) +[rpcStateManager.ts:459](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L459) diff --git a/packages/statemanager/docs/classes/RPCStateManager.md b/packages/statemanager/docs/classes/RPCStateManager.md index 32b837fbc..4ccdbf9ff 100644 --- a/packages/statemanager/docs/classes/RPCStateManager.md +++ b/packages/statemanager/docs/classes/RPCStateManager.md @@ -30,6 +30,7 @@ - [flush](RPCStateManager.md#flush) - [generateCanonicalGenesis](RPCStateManager.md#generatecanonicalgenesis) - [getAccount](RPCStateManager.md#getaccount) +- [getAppliedKey](RPCStateManager.md#getappliedkey) - [getContractCode](RPCStateManager.md#getcontractcode) - [getContractStorage](RPCStateManager.md#getcontractstorage) - [getProof](RPCStateManager.md#getproof) @@ -128,7 +129,7 @@ EVMStateManagerInterface.checkpoint #### Defined in -[rpcStateManager.ts:377](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L377) +[rpcStateManager.ts:387](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L387) ___ @@ -194,7 +195,7 @@ EVMStateManagerInterface.commit #### Defined in -[rpcStateManager.ts:388](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L388) +[rpcStateManager.ts:398](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L398) ___ @@ -290,7 +291,7 @@ ___ #### Defined in -[rpcStateManager.ts:405](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L405) +[rpcStateManager.ts:415](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L415) ___ @@ -314,7 +315,7 @@ EVMStateManagerInterface.generateCanonicalGenesis #### Defined in -[rpcStateManager.ts:428](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L428) +[rpcStateManager.ts:438](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L438) ___ @@ -347,6 +348,35 @@ EVMStateManagerInterface.getAccount ___ +### getAppliedKey + +▸ **getAppliedKey**(`address`): `Uint8Array` + +Returns the applied key for a given address +Used for saving preimages + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `address` | `Uint8Array` | The address to return the applied key | + +#### Returns + +`Uint8Array` + +- The applied key (e.g. hashed address) + +#### Implementation of + +EVMStateManagerInterface.getAppliedKey + +#### Defined in + +[rpcStateManager.ts:376](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L376) + +___ + ### getContractCode ▸ **getContractCode**(`address`): `Promise`<`Uint8Array`\> @@ -455,7 +485,7 @@ EVMStateManagerInterface.getStateRoot #### Defined in -[rpcStateManager.ts:412](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L412) +[rpcStateManager.ts:422](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L422) ___ @@ -477,7 +507,7 @@ EVMStateManagerInterface.hasStateRoot #### Defined in -[rpcStateManager.ts:424](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L424) +[rpcStateManager.ts:434](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L434) ___ @@ -613,7 +643,7 @@ EVMStateManagerInterface.revert #### Defined in -[rpcStateManager.ts:399](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L399) +[rpcStateManager.ts:409](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L409) ___ @@ -664,7 +694,7 @@ EVMStateManagerInterface.setStateRoot #### Defined in -[rpcStateManager.ts:419](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L419) +[rpcStateManager.ts:429](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/rpcStateManager.ts#L429) ___ diff --git a/packages/statemanager/docs/classes/StatelessVerkleStateManager.md b/packages/statemanager/docs/classes/StatelessVerkleStateManager.md index b3a0253c9..24bb3f863 100644 --- a/packages/statemanager/docs/classes/StatelessVerkleStateManager.md +++ b/packages/statemanager/docs/classes/StatelessVerkleStateManager.md @@ -43,6 +43,7 @@ to fetch data requested by the the VM. - [flush](StatelessVerkleStateManager.md#flush) - [generateCanonicalGenesis](StatelessVerkleStateManager.md#generatecanonicalgenesis) - [getAccount](StatelessVerkleStateManager.md#getaccount) +- [getAppliedKey](StatelessVerkleStateManager.md#getappliedkey) - [getComputedValue](StatelessVerkleStateManager.md#getcomputedvalue) - [getContractCode](StatelessVerkleStateManager.md#getcontractcode) - [getContractStorage](StatelessVerkleStateManager.md#getcontractstorage) @@ -414,6 +415,30 @@ EVMStateManagerInterface.getAccount ___ +### getAppliedKey + +▸ **getAppliedKey**(`_`): `Uint8Array` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `_` | `Uint8Array` | + +#### Returns + +`Uint8Array` + +#### Implementation of + +EVMStateManagerInterface.getAppliedKey + +#### Defined in + +[statelessVerkleStateManager.ts:891](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/statemanager/src/statelessVerkleStateManager.ts#L891) + +___ + ### getComputedValue ▸ **getComputedValue**(`accessedState`): ``null`` \| `string` diff --git a/packages/statemanager/package.json b/packages/statemanager/package.json index 3f473c199..f794eb2e6 100644 --- a/packages/statemanager/package.json +++ b/packages/statemanager/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/statemanager", - "version": "2.2.2", + "version": "2.3.0", "description": "An Ethereum statemanager implementation", "keywords": [ "ethereum", @@ -44,24 +44,25 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh && npm run test:node", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --config=vitest.config.browser.ts --browser.name=webkit --browser.provider=playwright --browser.headless", + "test:browser": "npx vitest run --config=./vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/common": "^4.2.0", + "@ethereumjs/common": "^4.3.0", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/trie": "^6.1.1", - "@ethereumjs/util": "^9.0.2", - "@ethereumjs/verkle": "^0.0.1", + "@ethereumjs/trie": "^6.2.0", + "@ethereumjs/util": "^9.0.3", + "@ethereumjs/verkle": "^0.0.2", "debug": "^4.3.3", "ethereum-cryptography": "^2.1.3", "js-sdsl": "^4.1.4", - "lru-cache": "10.1.0" + "lru-cache": "10.1.0", + "verkle-cryptography-wasm": "^0.4.0" }, "devDependencies": { - "@ethereumjs/block": "^5.1.1", - "@ethereumjs/genesis": "^0.2.1", + "@ethereumjs/block": "^5.2.0", + "@ethereumjs/genesis": "^0.2.2", "@types/debug": "^4.1.9", "rustbn-wasm": "^0.4.0" } diff --git a/packages/statemanager/src/accessWitness.ts b/packages/statemanager/src/accessWitness.ts index 20de5d9a7..cdbbbae52 100644 --- a/packages/statemanager/src/accessWitness.ts +++ b/packages/statemanager/src/accessWitness.ts @@ -3,6 +3,7 @@ import { getKey, getStem } from '@ethereumjs/verkle' import debugDefault from 'debug' import type { Address, PrefixedHexString } from '@ethereumjs/util' +import type { VerkleCrypto } from '@ethereumjs/verkle' const { debug: createDebugLogger } = debugDefault const debug = createDebugLogger('statemanager:verkle:aw') @@ -19,9 +20,7 @@ export const CODE_SIZE_LEAF_KEY = toBytes(4) export const HEADER_STORAGE_OFFSET = 64 export const CODE_OFFSET = 128 export const VERKLE_NODE_WIDTH = 256 -// export const MAIN_STORAGE_OFFSET = BigInt(256) ** BigInt(31) -// incorrect value to match with kaustinen2 offset -export const MAIN_STORAGE_OFFSET = BigInt(256) * BigInt(2) ** BigInt(31) +export const MAIN_STORAGE_OFFSET = BigInt(256) ** BigInt(31) const WitnessBranchReadCost = BigInt(1900) const WitnessChunkReadCost = BigInt(200) @@ -31,7 +30,7 @@ const WitnessChunkFillCost = BigInt(6200) // read is a default access event if stem or chunk is present type StemAccessEvent = { write?: boolean } -// chunk fill access event is not being charged right now in kaustinen2 but will be rectified +// chunk fill access event is not being charged right now in kaustinen but will be rectified // in upcoming iterations type ChunkAccessEvent = StemAccessEvent & { fill?: boolean } @@ -74,13 +73,18 @@ export type AccessedStateWithAddress = AccessedState & { export class AccessWitness { stems: Map chunks: Map - + verkleCrypto: VerkleCrypto constructor( opts: { + verkleCrypto?: VerkleCrypto stems?: Map chunks?: Map } = {} ) { + if (opts.verkleCrypto === undefined) { + throw new Error('verkle crypto required') + } + this.verkleCrypto = opts.verkleCrypto this.stems = opts.stems ?? new Map() this.chunks = opts.chunks ?? new Map() } @@ -115,18 +119,11 @@ export class AccessWitness { return gas } - touchAndChargeContractCreateInit( - address: Address, - { sendsValue }: { sendsValue?: boolean } = {} - ): bigint { + touchAndChargeContractCreateInit(address: Address): bigint { let gas = BIGINT_0 gas += this.touchAddressOnWriteAndComputeGas(address, 0, VERSION_LEAF_KEY) gas += this.touchAddressOnWriteAndComputeGas(address, 0, NONCE_LEAF_KEY) - gas += this.touchAddressOnWriteAndComputeGas(address, 0, CODE_KECCAK_LEAF_KEY) - if (sendsValue === true) { - gas += this.touchAddressOnWriteAndComputeGas(address, 0, BALANCE_LEAF_KEY) - } return gas } @@ -156,7 +153,7 @@ export class AccessWitness { return gas } - touchTxExistingAndComputeGas(target: Address, { sendsValue }: { sendsValue?: boolean } = {}) { + touchTxTargetAndComputeGas(target: Address, { sendsValue }: { sendsValue?: boolean } = {}) { let gas = BIGINT_0 gas += this.touchAddressOnReadAndComputeGas(target, 0, VERSION_LEAF_KEY) @@ -173,7 +170,7 @@ export class AccessWitness { return gas } - touchCodeChunksRangeOnReadAndChargeGas(contact: Address, startPc: number, endPc: number) { + touchCodeChunksRangeOnReadAndChargeGas(contact: Address, startPc: number, endPc: number): bigint { let gas = BIGINT_0 for (let chunkNum = Math.floor(startPc / 31); chunkNum <= Math.floor(endPc / 31); chunkNum++) { const { treeIndex, subIndex } = getTreeIndicesForCodeChunk(chunkNum) @@ -182,7 +179,11 @@ export class AccessWitness { return gas } - touchCodeChunksRangeOnWriteAndChargeGas(contact: Address, startPc: number, endPc: number) { + touchCodeChunksRangeOnWriteAndChargeGas( + contact: Address, + startPc: number, + endPc: number + ): bigint { let gas = BIGINT_0 for (let chunkNum = Math.floor(startPc / 31); chunkNum <= Math.floor(endPc / 31); chunkNum++) { const { treeIndex, subIndex } = getTreeIndicesForCodeChunk(chunkNum) @@ -260,7 +261,7 @@ export class AccessWitness { // i.e. no fill cost is charged right now const chunkFill = false - const accessedStemKey = getStem(address, treeIndex) + const accessedStemKey = getStem(this.verkleCrypto, address, treeIndex) const accessedStemHex = bytesToHex(accessedStemKey) let accessedStem = this.stems.get(accessedStemHex) if (accessedStem === undefined) { @@ -300,12 +301,12 @@ export class AccessWitness { /**Create a shallow copy, could clone some caches in future for optimizations */ shallowCopy(): AccessWitness { - return new AccessWitness() + return new AccessWitness({ verkleCrypto: this.verkleCrypto }) } merge(accessWitness: AccessWitness): void { for (const [chunkKey, chunkValue] of accessWitness.chunks.entries()) { - const stemKey = chunkKey.slice(0, chunkKey.length - 2) + const stemKey = chunkKey.slice(0, chunkKey.length - 2) as PrefixedHexString const stem = accessWitness.stems.get(stemKey) if (stem === undefined) { throw Error(`Internal error: missing stem for the chunkKey=${chunkKey}`) @@ -331,7 +332,7 @@ export class AccessWitness { *rawAccesses(): Generator { for (const chunkKey of this.chunks.keys()) { // drop the last byte - const stemKey = chunkKey.slice(0, chunkKey.length - 2) + const stemKey = chunkKey.slice(0, chunkKey.length - 2) as PrefixedHexString const stem = this.stems.get(stemKey) if (stem === undefined) { throw Error(`Internal error: missing stem for the chunkKey=${chunkKey}`) diff --git a/packages/statemanager/src/cache/account.ts b/packages/statemanager/src/cache/account.ts index 4424c49e0..0619ee12f 100644 --- a/packages/statemanager/src/cache/account.ts +++ b/packages/statemanager/src/cache/account.ts @@ -66,11 +66,20 @@ export class AccountCache extends Cache { * @param address - Address of account * @param account - Account or undefined if account doesn't exist in the trie */ - put(address: Address, account: Account | undefined): void { + put( + address: Address, + account: Account | undefined, + couldBeParitalAccount: boolean = false + ): void { const addressHex = bytesToUnprefixedHex(address.bytes) this._saveCachePreState(addressHex) const elem = { - accountRLP: account !== undefined ? account.serialize() : undefined, + accountRLP: + account !== undefined + ? couldBeParitalAccount + ? account.serializeWithPartialInfo() + : account.serialize() + : undefined, } if (this.DEBUG) { diff --git a/packages/statemanager/src/rpcStateManager.ts b/packages/statemanager/src/rpcStateManager.ts index 676e545da..500b92a47 100644 --- a/packages/statemanager/src/rpcStateManager.ts +++ b/packages/statemanager/src/rpcStateManager.ts @@ -1,9 +1,11 @@ import { Chain, Common } from '@ethereumjs/common' +import { RLP } from '@ethereumjs/rlp' import { Trie } from '@ethereumjs/trie' import { Account, bigIntToHex, bytesToHex, + equalsBytes, fetchFromProvider, hexToBytes, intToHex, @@ -21,7 +23,7 @@ import type { StorageDump, StorageRange, } from '@ethereumjs/common' -import type { Address } from '@ethereumjs/util' +import type { Address, PrefixedHexString } from '@ethereumjs/util' import type { Debugger } from 'debug' const { debug: createDebugLogger } = debugDefault @@ -35,6 +37,8 @@ export interface RPCStateManagerOpts { common?: Common } +const KECCAK256_RLP_EMPTY_ACCOUNT = RLP.encode(new Account().serialize()).slice(2) + export class RPCStateManager implements EVMStateManagerInterface { protected _provider: string protected _contractCache: Map @@ -132,6 +136,11 @@ export class RPCStateManager implements EVMStateManagerInterface { return codeBytes } + async getContractCodeSize(address: Address): Promise { + const contractCode = await this.getContractCode(address) + return contractCode.length + } + /** * Adds `value` to the state trie as code, and sets `codeHash` on the account * corresponding to `address` to reference this. @@ -233,7 +242,7 @@ export class RPCStateManager implements EVMStateManagerInterface { params: [address.toString(), [] as any, this._blockTag], }) - const proofBuf = proof.accountProof.map((proofNode: string) => toBytes(proofNode)) + const proofBuf = proof.accountProof.map((proofNode: PrefixedHexString) => toBytes(proofNode)) const verified = await Trie.verifyProof(address.bytes, proofBuf, { useKeyHashing: true, @@ -243,10 +252,8 @@ export class RPCStateManager implements EVMStateManagerInterface { } /** - * Gets the code corresponding to the provided `address`. - * @param address - Address to get the `account` for - * @returns {Promise} - Resolves with the code corresponding to the provided address. - * Returns an empty `Uint8Array` if the account has no associated code. + * Gets the account associated with `address` or `undefined` if account does not exist + * @param address - Address of the `account` to get */ async getAccount(address: Address): Promise { const elem = this._accountCache?.get(address) @@ -256,9 +263,15 @@ export class RPCStateManager implements EVMStateManagerInterface { : undefined } - const rlp = (await this.getAccountFromProvider(address)).serialize() - const account = rlp !== null ? Account.fromRlpSerializedAccount(rlp) : undefined + const accountFromProvider = await this.getAccountFromProvider(address) + const account = + equalsBytes(accountFromProvider.codeHash, new Uint8Array(32).fill(0)) || + equalsBytes(accountFromProvider.serialize(), KECCAK256_RLP_EMPTY_ACCOUNT) + ? undefined + : Account.fromRlpSerializedAccount(accountFromProvider.serialize()) + this._accountCache?.put(address, account) + return account } diff --git a/packages/statemanager/src/stateManager.ts b/packages/statemanager/src/stateManager.ts index 647e8cf3c..931b08d3d 100644 --- a/packages/statemanager/src/stateManager.ts +++ b/packages/statemanager/src/stateManager.ts @@ -401,6 +401,10 @@ export class DefaultStateManager implements EVMStateManagerInterface { return code } + async getContractCodeSize(address: Address): Promise { + const contractCode = await this.getContractCode(address) + return contractCode.length + } /** * Gets the storage trie for an account from the storage * cache or does a lookup. diff --git a/packages/statemanager/src/statelessVerkleStateManager.ts b/packages/statemanager/src/statelessVerkleStateManager.ts index 20d73fc5b..62cdfdd72 100644 --- a/packages/statemanager/src/statelessVerkleStateManager.ts +++ b/packages/statemanager/src/statelessVerkleStateManager.ts @@ -1,4 +1,3 @@ -import { RLP } from '@ethereumjs/rlp' import { Account, KECCAK256_NULL, @@ -9,14 +8,15 @@ import { bytesToInt32, hexToBytes, padToEven, + setLengthLeft, setLengthRight, short, toBytes, } from '@ethereumjs/util' -import { getKey, getStem, verifyUpdate } from '@ethereumjs/verkle' +import { getKey, getStem } from '@ethereumjs/verkle' import debugDefault from 'debug' import { keccak256 } from 'ethereum-cryptography/keccak.js' -import { equalsBytes } from 'ethereum-cryptography/utils' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' import { AccessWitness, @@ -45,6 +45,7 @@ import type { StorageRange, } from '@ethereumjs/common' import type { Address, PrefixedHexString } from '@ethereumjs/util' +import type { VerkleCrypto } from '@ethereumjs/verkle' const { debug: createDebugLogger } = debugDefault @@ -113,6 +114,7 @@ export interface StatelessVerkleStateManagerOpts { storageCacheOpts?: CacheOptions codeCacheOpts?: CacheOptions accesses?: AccessWitness + verkleCrypto?: VerkleCrypto } const PUSH_OFFSET = 95 @@ -141,6 +143,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { originalStorageCache: OriginalStorageCache + verkleCrypto: VerkleCrypto protected readonly _accountCacheSettings: CacheSettings protected readonly _storageCacheSettings: CacheSettings protected readonly _codeCacheSettings: CacheSettings @@ -155,6 +158,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { */ protected readonly DEBUG: boolean = false + private _blockNum = BigInt(0) private _executionWitness?: VerkleExecutionWitness private _proof: Uint8Array | undefined @@ -165,6 +169,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { // Post-state provided from the executionWitness. // Should not update. Used for comparing our computed post-state with the canonical one. private _postState: VerkleState = {} + private _preState: VerkleState = {} // Checkpointing private _checkpoints: VerkleState[] = [] @@ -172,6 +177,17 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { private keccakFunction: Function + /** + * Async static constructor for StatelessVerkleStateManager + * @param opts `StatelessVerkleStateManagerOpts` + * @returns a StatelessVerkleStateManager with initialized Verkle Crypto + */ + static create = async (opts: StatelessVerkleStateManagerOpts = {}) => { + if (opts.verkleCrypto === undefined) { + opts.verkleCrypto = await loadVerkleCrypto() + } + return new StatelessVerkleStateManager(opts) + } /** * Instantiate the StateManager interface. */ @@ -220,23 +236,15 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { this.keccakFunction = opts.common?.customCrypto.keccak256 ?? keccak256 + if (opts.verkleCrypto === undefined) { + throw new Error('verkle crypto required') + } + this.verkleCrypto = opts.verkleCrypto + // Skip DEBUG calls unless 'ethjs' included in environmental DEBUG variables // Additional window check is to prevent vite browser bundling (and potentially other) to break this.DEBUG = typeof window === 'undefined' ? process?.env?.DEBUG?.includes('ethjs') ?? false : false - - /* - * For a custom StateManager implementation adopt these - * callbacks passed to the `Cache` instantiated to perform - * the `get`, `put` and `delete` operations with the - * desired backend. - */ - // const getCb: get = async (address) => { - // return undefined - // } - // const putCb: put = async (keyBuf, accountRlp) => {} - // const deleteCb = async (keyBuf: Uint8Array) => {} - // this._cache = new Cache({ get, putCb, deleteCb }) } async getTransitionStateRoot(_: DefaultStateManager, __: Uint8Array): Promise { @@ -244,15 +252,19 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { } public initVerkleExecutionWitness( + blockNum: bigint, executionWitness?: VerkleExecutionWitness | null, accessWitness?: AccessWitness ) { + this._blockNum = blockNum if (executionWitness === null || executionWitness === undefined) { - throw Error(`Invalid executionWitness=${executionWitness} for initVerkleExecutionWitness`) + const errorMsg = `Invalid executionWitness=${executionWitness} for initVerkleExecutionWitness` + debug(errorMsg) + throw Error(errorMsg) } this._executionWitness = executionWitness - this.accessWitness = accessWitness ?? new AccessWitness() + this.accessWitness = accessWitness ?? new AccessWitness({ verkleCrypto: this.verkleCrypto }) this._proof = executionWitness.verkleProof as unknown as Uint8Array @@ -275,9 +287,15 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { this._state = preState + // also maintain a separate preState unaffected by any changes in _state + this._preState = preStateRaw.reduce((prevValue, currentValue) => { + const acc = { ...prevValue, ...currentValue } + return acc + }, {}) + const postStateRaw = executionWitness.stateDiff.flatMap(({ stem, suffixDiffs }) => { const suffixDiffPairs = suffixDiffs.map(({ newValue, suffix }) => { - const key = `${stem}${padToEven(Number(suffix).toString(16))}` + const key = `${stem}${padToEven(Number(suffix).toString(16))}` as PrefixedHexString // A postState value of null means there was no change from the preState. // In this implementation, we therefore replace null with the preState. const value = newValue ?? this._state[key] @@ -320,9 +338,9 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { return getKey(stem, CODE_SIZE_LEAF_KEY) } - getTreeKeyForCodeChunk(address: Address, chunkId: number) { + async getTreeKeyForCodeChunk(address: Address, chunkId: number) { const { treeIndex, subIndex } = getTreeIndicesForCodeChunk(chunkId) - return getKey(getStem(address, treeIndex), toBytes(subIndex)) + return getKey(getStem(this.verkleCrypto, address, treeIndex), toBytes(subIndex)) } chunkifyCode(code: Uint8Array) { @@ -335,15 +353,15 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { throw new Error('Not implemented') } - getTreeKeyForStorageSlot(address: Address, storageKey: bigint) { + async getTreeKeyForStorageSlot(address: Address, storageKey: bigint) { const { treeIndex, subIndex } = getTreeIndexesForStorageSlot(storageKey) - return getKey(getStem(address, treeIndex), toBytes(subIndex)) + return getKey(getStem(this.verkleCrypto, address, treeIndex), toBytes(subIndex)) } - checkChunkWitnessPresent(address: Address, codeOffset: number) { + async checkChunkWitnessPresent(address: Address, codeOffset: number) { const chunkId = codeOffset / 31 - const chunkKey = bytesToHex(this.getTreeKeyForCodeChunk(address, chunkId)) + const chunkKey = bytesToHex(await this.getTreeKeyForCodeChunk(address, chunkId)) return this._state[chunkKey] !== undefined } @@ -353,8 +371,8 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { * checkpoints were reverted. */ shallowCopy(): EVMStateManagerInterface { - const stateManager = new StatelessVerkleStateManager() - stateManager.initVerkleExecutionWitness(this._executionWitness!) + const stateManager = new StatelessVerkleStateManager({ verkleCrypto: this.verkleCrypto }) + stateManager.initVerkleExecutionWitness(this._blockNum, this._executionWitness!) return stateManager } @@ -408,22 +426,19 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { return new Uint8Array(0) } - // Get the contract code size - const codeSizeKey = this.getTreeKeyForCodeSize(getStem(address, 0)) - const codeSizeLE = hexToBytes(this._state[bytesToHex(codeSizeKey)] ?? '0x') - const codeSize = bytesToInt32(codeSizeLE, true) // allocate the code and copy onto it from the available witness chunks - const accessedCode = new Uint8Array(codeSize) + const codeSize = account.codeSize + // allocate enough to fit the last chunk + const accessedCode = new Uint8Array(codeSize + 31) - const chunks = Math.floor(bytesToInt32(codeSizeLE, true) / 31) - for (let chunkId = 0; chunkId <= chunks; chunkId++) { - const chunkKey = bytesToHex(this.getTreeKeyForCodeChunk(address, chunkId)) + const chunks = Math.floor(codeSize / 31) + 1 + for (let chunkId = 0; chunkId < chunks; chunkId++) { + const chunkKey = bytesToHex(await this.getTreeKeyForCodeChunk(address, chunkId)) const codeChunk = this._state[chunkKey] - if (codeChunk === undefined) { - throw Error(`Invalid access to a missing code chunk with chunkKey=${chunkKey}`) - } if (codeChunk === null) { - throw Error(`Invalid access to a non existent code chunk with chunkKey=${chunkKey}`) + const errorMsg = `Invalid access to a non existent code chunk with chunkKey=${chunkKey}` + debug(errorMsg) + throw Error(errorMsg) } const codeOffset = chunkId * 31 @@ -440,7 +455,37 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { } // Return accessedCode where only accessed code has been copied - return accessedCode + const contactCode = accessedCode.slice(0, codeSize) + if (!this._codeCacheSettings.deactivate) { + this._codeCache?.put(address, contactCode) + } + + return contactCode + } + + async getContractCodeSize(address: Address): Promise { + if (!this._accountCacheSettings.deactivate) { + const elem = this._accountCache!.get(address) + if (elem !== undefined) { + const account = + elem.accountRLP !== undefined + ? Account.fromRlpSerializedPartialAccount(elem.accountRLP) + : undefined + if (account === undefined) { + const errorMsg = `account=${account} in cache` + debug(errorMsg) + throw Error(errorMsg) + } + return account.codeSize + } + } + + // load the account basic fields and codeSize should be in it + const account = await this.getAccount(address) + if (account === undefined) { + return 0 + } + return account.codeSize } /** @@ -460,7 +505,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { } } - const storageKey = this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) + const storageKey = await this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) const storageValue = toBytes(this._state[bytesToHex(storageKey)]) if (!this._storageCacheSettings.deactivate) { @@ -479,11 +524,10 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { */ async putContractStorage(address: Address, key: Uint8Array, value: Uint8Array): Promise { if (!this._storageCacheSettings.deactivate) { - const encodedValue = RLP.encode(value) - this._storageCache!.put(address, key, encodedValue) + this._storageCache!.put(address, key, value) } else { // TODO: Consider refactoring this in a writeContractStorage function? Like in stateManager.ts - const storageKey = this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) + const storageKey = await this.getTreeKeyForStorageSlot(address, BigInt(bytesToHex(key))) this._state[bytesToHex(storageKey)] = bytesToHex(setLengthRight(value, 32)) } } @@ -493,7 +537,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { * @param address - Address to clear the storage of */ async clearContractStorage(address: Address): Promise { - const stem = getStem(address, 0) + const stem = getStem(this.verkleCrypto, address, 0) const codeHashKey = this.getTreeKeyForCodeHash(stem) this._storageCache?.clearContractStorage(address) // Update codeHash to `c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470` @@ -507,52 +551,87 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { const elem = this._accountCache!.get(address) if (elem !== undefined) { return elem.accountRLP !== undefined - ? Account.fromRlpSerializedAccount(elem.accountRLP) + ? Account.fromRlpSerializedPartialAccount(elem.accountRLP) : undefined } } - const stem = getStem(address, 0) + const stem = getStem(this.verkleCrypto, address, 0) const versionKey = this.getTreeKeyForVersion(stem) - const versionChunk = this._state[bytesToHex(versionKey)] - if (versionChunk === undefined) { - throw Error( - `Missing execution witness for address=${address} versionKey=${bytesToHex(versionKey)}` - ) - } - - // if the versionChunk is null it means the account doesn't exist in pre state - if (versionChunk === null) { - return undefined - } - const balanceKey = this.getTreeKeyForBalance(stem) const nonceKey = this.getTreeKeyForNonce(stem) const codeHashKey = this.getTreeKeyForCodeHash(stem) + const codeSizeKey = this.getTreeKeyForCodeSize(stem) + const versionRaw = this._state[bytesToHex(versionKey)] const balanceRaw = this._state[bytesToHex(balanceKey)] const nonceRaw = this._state[bytesToHex(nonceKey)] const codeHashRaw = this._state[bytesToHex(codeHashKey)] + const codeSizeRaw = this._state[bytesToHex(codeSizeKey)] + + // check if the account didn't exist if any of the basic keys have null + if (versionRaw === null || balanceRaw === null || nonceRaw === null || codeHashRaw === null) { + // check any of the other key shouldn't have string input available as this account didn't exist + if ( + typeof versionRaw === `string` || + typeof balanceRaw === 'string' || + typeof nonceRaw === 'string' || + typeof codeHashRaw === 'string' + ) { + const errorMsg = `Invalid witness for a non existing address=${address} stem=${bytesToHex( + stem + )}` + debug(errorMsg) + throw Error(errorMsg) + } else { + return undefined + } + } - const account = Account.fromAccountData({ - balance: - typeof balanceRaw === 'string' ? bytesToBigInt(hexToBytes(balanceRaw), true) : undefined, - nonce: typeof nonceRaw === 'string' ? bytesToBigInt(hexToBytes(nonceRaw), true) : undefined, - codeHash: codeHashRaw?.length === 32 ? codeHashRaw : KECCAK256_NULL_S, + // check if codehash is correct 32 bytes prefixed hex string + if (codeHashRaw !== undefined && codeHashRaw !== null && codeHashRaw.length !== 66) { + const errorMsg = `Invalid codeHashRaw=${codeHashRaw} for address=${address} chunkKey=${bytesToHex( + codeHashKey + )}` + debug(errorMsg) + throw Error(errorMsg) + } + + if ( + versionRaw === undefined && + balanceRaw === undefined && + nonceRaw === undefined && + codeHashRaw === undefined && + codeSizeRaw === undefined + ) { + const errorMsg = `No witness bundled for address=${address} stem=${bytesToHex(stem)}` + debug(errorMsg) + throw Error(errorMsg) + } + + const account = Account.fromPartialAccountData({ + version: typeof versionRaw === 'string' ? bytesToInt32(hexToBytes(versionRaw), true) : null, + balance: typeof balanceRaw === 'string' ? bytesToBigInt(hexToBytes(balanceRaw), true) : null, + nonce: typeof nonceRaw === 'string' ? bytesToBigInt(hexToBytes(nonceRaw), true) : null, + codeHash: typeof codeHashRaw === 'string' ? hexToBytes(codeHashRaw) : null, + // if codeSizeRaw is null, it means account didnt exist or it was EOA either way codeSize is 0 + // if codeSizeRaw is undefined, then we pass in null which in our context of partial account means + // not specified + codeSize: + typeof codeSizeRaw === 'string' + ? bytesToInt32(hexToBytes(codeSizeRaw), true) + : codeSizeRaw === null + ? 0 + : null, + storageRoot: null, }) if (this.DEBUG) { - debug( - `getAccount address=${address.toString()} stem=${short(stem)} balance=${ - account.balance - } nonce=${account.nonce} codeHash=${short(account.codeHash)} storageHash=${short( - account.storageRoot - )}` - ) + debug(`getAccount address=${address.toString()} stem=${short(stem)}`) } if (!this._accountCacheSettings.deactivate) { - this._accountCache?.put(address, account) + this._accountCache?.put(address, account, true) } return account @@ -560,15 +639,11 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { async putAccount(address: Address, account: Account): Promise { if (this.DEBUG) { - debug( - `putAccount address=${address.toString()} balance=${account.balance} nonce=${ - account.nonce - } codeHash=${short(account.codeHash)} storageHash=${short(account.storageRoot)}` - ) + debug(`putAccount address=${address.toString()}`) } if (this._accountCacheSettings.deactivate) { - const stem = getStem(address, 0) + const stem = getStem(this.verkleCrypto, address, 0) const balanceKey = this.getTreeKeyForBalance(stem) const nonceKey = this.getTreeKeyForNonce(stem) const codeHashKey = this.getTreeKeyForCodeHash(stem) @@ -581,7 +656,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { this._state[bytesToHex(codeHashKey)] = bytesToHex(account.codeHash) } else { if (account !== undefined) { - this._accountCache!.put(address, account) + this._accountCache!.put(address, account, true) } else { this._accountCache!.del(address) } @@ -611,10 +686,10 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { account = new Account() } - account.nonce = accountFields.nonce ?? account.nonce - account.balance = accountFields.balance ?? account.balance - account.storageRoot = accountFields.storageRoot ?? account.storageRoot - account.codeHash = accountFields.codeHash ?? account.codeHash + account._nonce = accountFields.nonce ?? account._nonce + account._balance = accountFields.balance ?? account._balance + account._storageRoot = accountFields.storageRoot ?? account._storageRoot + account._codeHash = accountFields.codeHash ?? account._codeHash await this.putAccount(address, account) } @@ -622,7 +697,8 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { throw new Error('Not implemented yet') } - async verifyProof(parentVerkleRoot: Uint8Array): Promise { + // TODO: Re-implement this method once we have working verifyUpdate and the testnets have been updated to provide ingestible data + async verifyProof(_: Uint8Array): Promise { // Implementation: https://github.com/crate-crypto/rust-verkle-wasm/blob/master/src/lib.rs#L45 // The root is the root of the current (un-updated) trie // The proof is proof of membership of all of the accessed values @@ -631,17 +707,19 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { // // This function returns the new root when all of the updated values are applied - const updatedStateRoot: Uint8Array = verifyUpdate( - parentVerkleRoot, - this._proof!, // TODO: Convert this into a Uint8Array ingestible by the method - new Map() // TODO: Generate the keys_values map from the old to the updated value - ) + // const updatedStateRoot: Uint8Array = verifyUpdate( + // parentVerkleRoot, + // this._proof!, // TODO: Convert this into a Uint8Array ingestible by the method + // new Map() // TODO: Generate the keys_values map from the old to the updated value + // ) // TODO: Not sure if this should return the updated state Root (current block) or the un-updated one (parent block) - const verkleRoot = await this.getStateRoot() + // const verkleRoot = await this.getStateRoot() // Verify that updatedStateRoot matches the state root of the block - return equalsBytes(updatedStateRoot, verkleRoot) + // return equalsBytes(updatedStateRoot, verkleRoot) + + return true } // Verifies that the witness post-state matches the computed post-state @@ -650,7 +728,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { // in access while comparising against the provided poststate in the execution witness const accessedChunks = new Map() // switch to false if postVerify fails - let postVerified = true + let postFailures = 0 for (const accessedState of this.accessWitness!.accesses()) { const { address, type } = accessedState @@ -663,22 +741,36 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { const { chunkKey } = accessedState accessedChunks.set(chunkKey, true) - let computedValue = this.getComputedValue(accessedState) + const computedValue = this.getComputedValue(accessedState) ?? this._preState[chunkKey] + if (computedValue === undefined) { + debug( + `Block accesses missing in canonical address=${address} type=${type} ${extraMeta} chunkKey=${chunkKey}` + ) + postFailures++ + continue + } + let canonicalValue: string | null | undefined = this._postState[chunkKey] if (canonicalValue === undefined) { debug( `Block accesses missing in canonical address=${address} type=${type} ${extraMeta} chunkKey=${chunkKey}` ) - postVerified = false + postFailures++ continue } // if the access type is code, then we can't match the first byte because since the computed value // doesn't has the first byte for push data since previous chunk code itself might not be available if (accessedState.type === AccessedStateType.Code) { - computedValue = computedValue !== null ? `0x${computedValue.slice(4)}` : null + // computedValue = computedValue !== null ? `0x${computedValue.slice(4)}` : null canonicalValue = canonicalValue !== null ? `0x${canonicalValue.slice(4)}` : null + } else if ( + accessedState.type === AccessedStateType.Storage && + canonicalValue === null && + computedValue === ZEROVALUE + ) { + canonicalValue = ZEROVALUE } if (computedValue !== canonicalValue) { @@ -699,19 +791,21 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { ) debug(`expected=${displayCanonicalValue}`) debug(`computed=${displayComputedValue}`) - postVerified = false + postFailures++ } } for (const canChunkKey of Object.keys(this._postState)) { if (accessedChunks.get(canChunkKey) === undefined) { debug(`Missing chunk access for canChunkKey=${canChunkKey}`) - postVerified = false + postFailures++ } } - debug(`verifyPostState=${postVerified}`) - return postVerified + const verifyPassed = postFailures === 0 + debug(`verifyPostState verifyPassed=${verifyPassed} postFailures=${postFailures}`) + + return verifyPassed } getComputedValue(accessedState: AccessedStateWithAddress): PrefixedHexString | null { @@ -732,7 +826,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { return null } - const balanceBigint = Account.fromRlpSerializedAccount(encodedAccount).balance + const balanceBigint = Account.fromRlpSerializedPartialAccount(encodedAccount).balance return bytesToHex(setLengthRight(bigIntToBytes(balanceBigint, true), 32)) } @@ -741,7 +835,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { if (encodedAccount === undefined) { return null } - const nonceBigint = Account.fromRlpSerializedAccount(encodedAccount).nonce + const nonceBigint = Account.fromRlpSerializedPartialAccount(encodedAccount).nonce return bytesToHex(setLengthRight(bigIntToBytes(nonceBigint, true), 32)) } @@ -750,7 +844,7 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { if (encodedAccount === undefined) { return null } - return bytesToHex(Account.fromRlpSerializedAccount(encodedAccount).codeHash) + return bytesToHex(Account.fromRlpSerializedPartialAccount(encodedAccount).codeHash) } case AccessedStateType.CodeSize: { @@ -762,9 +856,11 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { return null } - const account = Account.fromRlpSerializedAccount(encodedAccount) + const account = Account.fromRlpSerializedPartialAccount(encodedAccount) if (account.isContract()) { - throw Error(`Code cache not found for address=${address.toString()}`) + const errorMsg = `Code cache not found for address=${address.toString()}` + debug(errorMsg) + throw Error(errorMsg) } else { return null } @@ -784,16 +880,18 @@ export class StatelessVerkleStateManager implements EVMStateManagerInterface { // be very tricky and impossible in certain scenarios like when the previous code chunk // was not accessed and hence not even provided in the witness const chunkSize = 31 - return bytesToHex(code.slice(codeOffset, codeOffset + chunkSize)) + return bytesToHex(setLengthRight(code.slice(codeOffset, codeOffset + chunkSize), chunkSize)) } case AccessedStateType.Storage: { const { slot } = accessedState - const storage = this._storageCache?.get(address, bigIntToBytes(slot)) + const key = setLengthLeft(bigIntToBytes(slot), 32) + + const storage = this._storageCache?.get(address, key) if (storage === undefined) { return null } - return bytesToHex(storage) + return bytesToHex(setLengthLeft(storage, 32)) } } } diff --git a/packages/statemanager/test/proofStateManager.spec.ts b/packages/statemanager/test/proofStateManager.spec.ts index c64bca76d..6fbe27bc2 100644 --- a/packages/statemanager/test/proofStateManager.spec.ts +++ b/packages/statemanager/test/proofStateManager.spec.ts @@ -118,8 +118,7 @@ describe('ProofStateManager', () => { if (stateRoot === undefined) { stateRoot = key } - // @ts-expect-error - await trie._db.put(key, bufferData) + await trie['_db'].put(key, bufferData) } trie.root(stateRoot!) const proof = await stateManager.getProof(address) @@ -143,8 +142,7 @@ describe('ProofStateManager', () => { if (stateRoot === undefined) { stateRoot = key } - // @ts-expect-error - await trie._db.put(key, bufferData) + await trie['_db'].put(key, bufferData) } trie.root(stateRoot!) const proof = await stateManager.getProof(address) @@ -168,8 +166,7 @@ describe('ProofStateManager', () => { if (stateRoot === undefined) { stateRoot = key } - // @ts-expect-error - await trie._db.put(key, bufferData) + await trie['_db'].put(key, bufferData) } const storageRoot = ropsten_contractWithStorage.storageHash const storageTrie = new Trie({ useKeyHashing: true }) @@ -178,8 +175,7 @@ describe('ProofStateManager', () => { storageKeys.push(hexToBytes(storageProofsData.key)) for (const storageProofData of storageProofsData.proof) { const key = keccak256(hexToBytes(storageProofData)) - // @ts-expect-error - await storageTrie._db.put(key, hexToBytes(storageProofData)) + await storageTrie['_db'].put(key, hexToBytes(storageProofData)) } } storageTrie.root(hexToBytes(storageRoot)) @@ -208,8 +204,7 @@ describe('ProofStateManager', () => { if (stateRoot === undefined) { stateRoot = key } - // @ts-expect-error - await trie._db.put(key, bufferData) + await trie['_db'].put(key, bufferData) } const storageRoot = ropsten_contractWithStorage.storageHash const storageTrie = new Trie({ useKeyHashing: true }) @@ -218,8 +213,7 @@ describe('ProofStateManager', () => { storageKeys.push(hexToBytes(storageProofsData.key)) for (const storageProofData of storageProofsData.proof) { const key = keccak256(hexToBytes(storageProofData)) - // @ts-expect-error - await storageTrie._db.put(key, hexToBytes(storageProofData)) + await storageTrie['_db'].put(key, hexToBytes(storageProofData)) } } storageTrie.root(hexToBytes(storageRoot)) @@ -276,8 +270,7 @@ describe('ProofStateManager', () => { if (stateRoot === undefined) { stateRoot = key } - // @ts-expect-error - await trie._db.put(key, bufferData) + await trie['_db'].put(key, bufferData) } const storageRoot = ropsten_nonexistentAccount.storageHash const storageTrie = new Trie({ useKeyHashing: true }) diff --git a/packages/statemanager/test/rpcStateManager.spec.ts b/packages/statemanager/test/rpcStateManager.spec.ts index 69a8bb7c0..1565d9947 100644 --- a/packages/statemanager/test/rpcStateManager.spec.ts +++ b/packages/statemanager/test/rpcStateManager.spec.ts @@ -17,6 +17,7 @@ import { VM } from '@ethereumjs/vm' import { assert, describe, expect, it, vi } from 'vitest' import { RPCBlockChain, RPCStateManager } from '../src/rpcStateManager.js' +import { DefaultStateManager } from '../src/stateManager.js' import * as blockData from './testdata/providerData/blocks/block0x7a120.json' import { getValues } from './testdata/providerData/mockProvider.js' @@ -338,3 +339,18 @@ describe('blockchain', () => '0xd5ba853bc7151fc044b9d273a57e3f9ed35e66e0248ab4a571445650cc4fcaa6' ) })) + +describe('Should return same value as DefaultStateManager when account does not exist', () => { + it('should work', async () => { + const rpcState = new RPCStateManager({ provider, blockTag: 1n }) + const defaultState = new DefaultStateManager() + + const account0 = await rpcState.getAccount(new Address(hexToBytes('0x' + '01'.repeat(20)))) + const account1 = await defaultState.getAccount(new Address(hexToBytes('0x' + '01'.repeat(20)))) + assert.equal( + account0, + account1, + 'Should return same value as DefaultStateManager when account does not exist' + ) + }) +}) diff --git a/packages/statemanager/test/stateManager.code.spec.ts b/packages/statemanager/test/stateManager.code.spec.ts index 3ee027013..ba9daedf2 100644 --- a/packages/statemanager/test/stateManager.code.spec.ts +++ b/packages/statemanager/test/stateManager.code.spec.ts @@ -16,7 +16,6 @@ describe('StateManager -> Code', () => { This test is mostly an example of why a code prefix is necessary I an address, we put two storage values. The preimage of the (storage trie) root hash is known This preimage is used as codeHash - NOTE: Currently, the only problem which this code prefix fixes, is putting 0x80 as contract code -> This hashes to the empty trie node hash (0x80 = RLP([])), so keccak256(0x80) = empty trie node hash -> Therefore, each empty state trie now points to 0x80, which is not a valid trie node, which crashes @ethereumjs/trie @@ -34,8 +33,7 @@ describe('StateManager -> Code', () => { await stateManager.putContractStorage(address1, key1, key2) await stateManager.putContractStorage(address1, key2, key2) const root = await stateManager.getStateRoot() - // @ts-expect-error - const rawNode = await stateManager._trie._db.get(root) + const rawNode = await stateManager['_trie']['_db'].get(root) await codeStateManager.putContractCode(address1, rawNode!) diff --git a/packages/statemanager/test/statelessVerkleStateManager.spec.ts b/packages/statemanager/test/statelessVerkleStateManager.spec.ts index 65384d8e1..5a1dd3d64 100644 --- a/packages/statemanager/test/statelessVerkleStateManager.spec.ts +++ b/packages/statemanager/test/statelessVerkleStateManager.spec.ts @@ -1,5 +1,6 @@ import { Block } from '@ethereumjs/block' import { Common } from '@ethereumjs/common' +import { TransactionFactory } from '@ethereumjs/tx' import { Account, Address, @@ -9,42 +10,48 @@ import { randomBytes, } from '@ethereumjs/util' import { getStem } from '@ethereumjs/verkle' -import { assert, describe, it, test } from 'vitest' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' +import { assert, beforeAll, describe, it, test } from 'vitest' import { CacheType, StatelessVerkleStateManager } from '../src/index.js' import * as testnetVerkleKaustinen from './testdata/testnetVerkleKaustinen.json' import * as verkleBlockJSON from './testdata/verkleKaustinenBlock.json' +import type { VerkleCrypto } from '@ethereumjs/verkle' + describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { + let verkleCrypto: VerkleCrypto + beforeAll(async () => { + verkleCrypto = await loadVerkleCrypto() + }) const common = Common.fromGethGenesis(testnetVerkleKaustinen, { chain: 'customChain', - eips: [6800], + eips: [4895, 6800], }) - const block = Block.fromBlockData(verkleBlockJSON, { common }) + const decodedTxs = verkleBlockJSON.transactions.map((tx) => + TransactionFactory.fromSerializedData(hexToBytes(tx)) + ) + const block = Block.fromBlockData({ ...verkleBlockJSON, transactions: decodedTxs }, { common }) it('initPreState()', async () => { - const stateManager = new StatelessVerkleStateManager() - stateManager.initVerkleExecutionWitness(block.executionWitness) + const stateManager = await StatelessVerkleStateManager.create({ verkleCrypto }) + stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) assert.ok(Object.keys(stateManager['_state']).length !== 0, 'should initialize with state') }) it('getAccount()', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) - stateManager.initVerkleExecutionWitness(block.executionWitness) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) + stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) const account = await stateManager.getAccount( - Address.fromString('0x9791ded6e5d3d5dafca71bb7bb2a14187d17e32e') + Address.fromString('0x6177843db3138ae69679a54b95cf345ed759450d') ) - assert.equal(account!.balance, 99765345920194942688594n, 'should have correct balance') - assert.equal(account!.nonce, 3963257n, 'should have correct nonce') - assert.equal( - bytesToHex(account!.storageRoot), - '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', - 'should have correct storageRoot' - ) + assert.equal(account!.balance, 724462229558283876n, 'should have correct balance') + assert.equal(account!.nonce, 700n, 'should have correct nonce') + assert.equal(account!._storageRoot, null, 'stateroot should have not been set') assert.equal( bytesToHex(account!.codeHash), '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', @@ -53,18 +60,18 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { }) it('put/delete/modify account', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) - stateManager.initVerkleExecutionWitness(block.executionWitness) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) + stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) const address = new Address(randomBytes(20)) try { await stateManager.getAccount(address) assert.fail('should throw on getting account that is not found in witness') - } catch (e) { + } catch (e: any) { assert.equal( e.message.slice(0, 25), - 'Missing execution witness', + 'No witness bundled for ad', 'should throw on getting account that does not exist in cache and witness' ) } @@ -99,11 +106,11 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { }) it('getTreeKeyFor* functions', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) - stateManager.initVerkleExecutionWitness(block.executionWitness) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) + stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) - const address = Address.fromString('0x9791ded6e5d3d5dafca71bb7bb2a14187d17e32e') - const stem = getStem(address, 0) + const address = Address.fromString('0x6177843db3138ae69679a54b95cf345ed759450d') + const stem = getStem(stateManager.verkleCrypto, address, 0n) const balanceKey = stateManager.getTreeKeyForBalance(stem) const nonceKey = stateManager.getTreeKeyForNonce(stem) @@ -116,16 +123,16 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { const account = await stateManager.getAccount(address) assert.equal( - account.balance, - bytesToBigInt(hexToBytes(balanceRaw), true), + account!.balance, + bytesToBigInt(hexToBytes(balanceRaw!), true), 'should have correct balance' ) assert.equal( - account.nonce, - bytesToBigInt(hexToBytes(nonceRaw), true), + account!.nonce, + bytesToBigInt(hexToBytes(nonceRaw!), true), 'should have correct nonce' ) - assert.equal(bytesToHex(account.codeHash), codeHash, 'should have correct codeHash') + assert.equal(bytesToHex(account!.codeHash), codeHash, 'should have correct codeHash') }) it(`copy()`, async () => { @@ -137,18 +144,19 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { type: CacheType.ORDERED_MAP, }, common, + verkleCrypto, }) - stateManager.initVerkleExecutionWitness(block.executionWitness) + stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) - const stateManagerCopy = stateManager.shallowCopy() + const stateManagerCopy = stateManager.shallowCopy() as StatelessVerkleStateManager assert.equal( - stateManagerCopy['_accountCacheSettings'].type, + (stateManagerCopy as any)['_accountCacheSettings'].type, CacheType.ORDERED_MAP, 'should switch to ORDERED_MAP account cache on copy()' ) assert.equal( - stateManagerCopy['_storageCacheSettings'].type, + (stateManagerCopy as any)['_storageCacheSettings'].type, CacheType.ORDERED_MAP, 'should switch to ORDERED_MAP storage cache on copy()' ) @@ -156,8 +164,8 @@ describe('StatelessVerkleStateManager: Kaustinen Verkle Block', () => { // TODO contract storage functions not yet completely implemented test.skip('get/put/clear contract storage', async () => { - const stateManager = new StatelessVerkleStateManager({ common }) - stateManager.initVerkleExecutionWitness(block.executionWitness) + const stateManager = await StatelessVerkleStateManager.create({ common, verkleCrypto }) + stateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) const contractAddress = Address.fromString('0x4242424242424242424242424242424242424242') const storageKey = '0x0000000000000000000000000000000000000000000000000000000000000022' diff --git a/packages/statemanager/test/testdata/providerData/mockProvider.ts b/packages/statemanager/test/testdata/providerData/mockProvider.ts index 7683c9a6b..4e56e4d12 100644 --- a/packages/statemanager/test/testdata/providerData/mockProvider.ts +++ b/packages/statemanager/test/testdata/providerData/mockProvider.ts @@ -68,9 +68,9 @@ const getProofValues = async (params: [address: string, _: [], blockTag: bigint return { address, balance: '0x0', - codeHash: '0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + codeHash: '0x0000000000000000000000000000000000000000000000000000000000000000', nonce: '0x0', - storageHash: '0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421', + storageHash: '0x0000000000000000000000000000000000000000000000000000000000000000', storageProof: [], } } diff --git a/packages/statemanager/test/testdata/verkleKaustinenBlock.json b/packages/statemanager/test/testdata/verkleKaustinenBlock.json index e68d5d584..e6072507c 100644 --- a/packages/statemanager/test/testdata/verkleKaustinenBlock.json +++ b/packages/statemanager/test/testdata/verkleKaustinenBlock.json @@ -1,677 +1,2626 @@ { "header": { - "baseFeePerGas": "0x8", - "blockHash": "0xb528b8feb9f7c45dc76b1dab179567f3fcbba43069c0835e20e2080b9e1bf47d", - "blockNumber": "0x680c5", - "extraData": "0x", - "coinbase": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", - "gasLimit": "0x1c9c380", - "gasUsed": "0x9f08f", + "blockNumber": "0x61", + "parentHash": "0xf3a540f1041fc87838706d6bd000d6dd8ba2193601578b89c86587921e76c00d", + "feeRecipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "stateRoot": "0x2cf2ab8fed2dcfe2fa77da044ab16393dbdabbc65deea5fdf272107a039f2c60", + "receiptsRoot": "0x012e5d46c71887b3c2cc72adea31450afd9ab07e572bf2746f2c024b0d937e7a", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "parentHash": "0x87c1abaf5d93799d62a37db5506cbc09551bc53433796ca7906b1de6c683b305", - "prevRandao": "0xde46f41bf314eee291472323c0ca8f2739ad687c5b29ef9ee496cf98add9e7bb", - "receiptsRoot": "0x4bdd2c518110f2142b6368dde87fe25609646f6c589397cf759baf3c7344ab9b", - "stateRoot": "0x43a3e98ba6fb6b303692b5279c7eeb8a191aa7cbff0ffd425368eb34a470268b", - "timestamp": "0x646f4448", - "transactionsTrie": "0x6158b8a8726077d42aac4433db063c79f8413054842d21cae7345941b86e9f35" + "gasLimit": "0x1a359a6", + "gasUsed": "0x56082f", + "timestamp": "0x66191448", + "extraData": "0xd983010c01846765746889676f312e32302e3134856c696e7578", + "baseFeePerGas": "0x152f", + "blockHash": "0x2f08a1461ab75873a0f2d23170f46d3be2ade2a7f4ebf607fc53fb361cf85865", + "prevRandao": "0xd27140a1c45ec8f8cb212da5c86ac7b0ac4209a2d3b9fd0d7a1541c98c70de86" }, "transactions": [ - { - "type": "0x2", - "nonce": "0x3", - "gasLimit": "0x23011", - "to": "0x", - "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100a1565b60405180910390f35b610073600480360381019061006e91906100ed565b61007e565b005b60008054905090565b8060008190555050565b6000819050919050565b61009b81610088565b82525050565b60006020820190506100b66000830184610092565b92915050565b600080fd5b6100ca81610088565b81146100d557600080fd5b50565b6000813590506100e7816100c1565b92915050565b600060208284031215610103576101026100bc565b5b6000610111848285016100d8565b9150509291505056fea26469706673582212208f6a6e5a1a593ae1ba29bd21e9d6e9092ae1df1986f8e8de139149a0e99dce1564736f6c63430008120033", - "v": "0x1", - "r": "0x272074bd1345fad76ab5e5a41b575890ebbb83747eb407e58caf61cbc503d357", - "s": "0x33d7a5ef1209b877e6cfb5aeab25e120e5a0d1acfc628ff04b85d7f0df4b3ddf", - "chainId": "0x10f2c", - "maxPriorityFeePerGas": "0x9502f900", - "maxFeePerGas": "0x9502f910", - "accessList": [] - }, - { - "type": "0x2", - "nonce": "0x4", - "gasLimit": "0x23011", - "to": "0x", - "value": "0x0", - "data": "0x608060405234801561001057600080fd5b50610150806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80632e64cec11461003b5780636057361d14610059575b600080fd5b610043610075565b60405161005091906100a1565b60405180910390f35b610073600480360381019061006e91906100ed565b61007e565b005b60008054905090565b8060008190555050565b6000819050919050565b61009b81610088565b82525050565b60006020820190506100b66000830184610092565b92915050565b600080fd5b6100ca81610088565b81146100d557600080fd5b50565b6000813590506100e7816100c1565b92915050565b600060208284031215610103576101026100bc565b5b6000610111848285016100d8565b9150509291505056fea26469706673582212208f6a6e5a1a593ae1ba29bd21e9d6e9092ae1df1986f8e8de139149a0e99dce1564736f6c63430008120033", - "v": "0x0", - "r": "0xedf90bc7c4803cd34a1db633a06ba65d2aa15fbcacd24840a7787892efe0f05f", - "s": "0x5729091ec8aee9f2cada76ee82a6d67c575dcd9a138c9c99d92740ba2aff4ace", - "chainId": "0x10f2c", - "maxPriorityFeePerGas": "0x9502f900", - "maxFeePerGas": "0x9502f910", - "accessList": [] - }, - { - "type": "0x0", - "nonce": "0x3c7979", - "gasLimit": "0x186a0", - "to": "0xfc32a5c92c78e00b753283f45fd00c684ecff693", - "value": "0x0", - "data": "0x7f2d01a9842cdc19531652a41333db96f8f11f504385613a98b2e1394c095dc2bd60f9527f61d73699c64e21e12f8fe4a2ee7011812c49407abd0af9b8a5a7d66d507dadba610119527f44b98490e04b17a045b4e61761d325c37f808a7e5943e0373a559fb6598d5427610139527f8978a03e359c3e219cf3111998317cc24c", - "v": "0x21e7c", - "r": "0x7623d524742ccbc3059ea95d603b3fac066daf4300bd6d58f1378cb742c004fc", - "s": "0x1a057f8ccc7b60bb53683b72f9fe8c050ba7e96f4a5c77a1f96f922e4020f219", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x0", - "nonce": "0x3c797a", - "gasLimit": "0x186a0", - "to": "0x66a68bc25814f4d763327f7b9774463af847806d", - "value": "0x0", - "data": "0x60a7606b5360a3606c53609a606d536021606e5360e1606f5379600060ac5560006003556000606755", - "v": "0x21e7c", - "r": "0xcc2dd5879ca718288f279c1e0e9f521bf17cf19a6bee3522fe8fa019c169e485", - "s": "0x548cbe026fad70112faea072a1dc36a797e0bc0f97b1a82ddbe3568d15feece4", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x1", - "nonce": "0x3c797b", - "gasLimit": "0x186a0", - "to": "0x", - "value": "0x0", - "data": "0x7e7f7654ea857876c2f81f3e9ac805692ec2a16d2262c71961753ad1d251d71c2f386024527f9183f5f9fdffbfb870a8d8c150597eb13f88c691d53a9fdd5fb80287dc96699b6031527fbf80293e0df727acdb32469584afd3c7eeb61bdda84f2dacd0b37a44aa6204126051527fa9d47cae3479a9e05fad17765c563caf9e43", - "v": "0x0", - "r": "0xc74589e3654e1065977e507d0785ab4b22fbb0f0c05791ce6b2ceb53b86fc70c", - "s": "0x76eba80a9488ef2073a0a7c8fd914ece9c33e915e59884737ad45b78349ebd73", - "chainId": "0x10f2c", - "gasPrice": "0x3b9b1368", - "accessList": [] - }, - { - "type": "0x0", - "nonce": "0x3c797c", - "gasLimit": "0x186a0", - "to": "0x", - "value": "0x0", - "data": "0x78600060b1556091604e53605b604f5360ca605053606460515360eb60525360c360535360d760545360736055536082605653600b605753604b6058536054605953603c605a5360c2605b536073605c53600b605d5360ff605e537f5b823f64815224d1718fdfd1f205b06828542ca9426a5a88be06cfbe3d37001e60bd5260", - "v": "0x21e7b", - "r": "0xa1f2db6e99a5bc25f992a224c89cd9e158544ee16292e5fe00ddc3b22462cbd9", - "s": "0x73ecebc3c5772309cbabb11ab1b4c284e0cd625177202d7e052946e13ec99319", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x0", - "nonce": "0x3c797d", - "gasLimit": "0x186a0", - "to": "0xb02a2eda1b317fbd16760128836b0ac59b560e9d", - "value": "0x0", - "data": "0x7f53a1da3bbb96dc7f50d0b6f982567bc224e05c981d0a626f516323930b1d5e95602852604660485360b7604953cf6000609c55604a60245360ad602553607c602653607e60275360ae602853602b6029536003602a5360ee602b5360a5602c5360d5602d5360a7602e5360cf602f5360ba603053601c603153608260325360", - "v": "0x21e7c", - "r": "0x519314cb62a34f2578f94c084e8ff4cd7a8148270edcef572c2cde24f38960bc", - "s": "0x67cfbd75c6c556cd3b4c0e34fc098a3fce8c8fae4230106e9340c858c12a0323", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x0", - "nonce": "0x3c797e", - "gasLimit": "0x186a0", - "to": "0xae7d74fe5748f2675946c7542f4a3c729037b417", - "value": "0x0", - "data": "0x", - "v": "0x21e7c", - "r": "0xc6b4d19380f4e1527dddb9e82021cba2ce483d144e2360c3e31f8bbd5950d96b", - "s": "0x5f503fd55dcb51605d870a9833a8e8b4e8d352efd4798be70ae273185a3194f8", - "gasPrice": "0x3b9b1368" - }, - { - "type": "0x2", - "nonce": "0x3c797f", - "gasLimit": "0x186a0", - "to": "0xb02a2eda1b317fbd16760128836b0ac59b560e9d", - "value": "0x0", - "data": "0x9b948702eeb75ba77ffa681fb04ba4b3ff1fd0cd9b4c773796f008e230da7ef9f9ffd7ec04212d29d4604e527f76b3bf72263ccb7bc2a5a1c7d4529fd2e617ead0c0a8bc22b48bd887770897d9606e527fa241ae8d0974af7c4329355d6ba6b82741e0b2f3fa12755c1b4373c174b58f34608e527fb8e59608c4d61527cb6af4", - "v": "0x0", - "r": "0xaec3bb3876aa6301f1a4f03a3ec65cad1de1b12323fd1cfea76dad95740a83b0", - "s": "0x421a2088a5b1d14aa357ac368bb4f7a0052bfcc79693fb531e3aeb44e5937b0c", - "chainId": "0x10f2c", - "maxPriorityFeePerGas": "0x3b9b1360", - "maxFeePerGas": "0x3b9b1368", - "accessList": [] - }, - { - "type": "0x1", - "nonce": "0x3c7980", - "gasLimit": "0x186a0", - "to": "0xb02a2eda1b317fbd16760128836b0ac59b560e9d", - "value": "0x0", - "data": "0x600060565560006041557fdaf76cfabc5c32c462d3caf74accf78f4941c9bc501b9064aa1a52cfc0d1b1cd6013527f0b03c5292bd0ab5eace6a0a857290695e471f4893253a163f8ec6149e0e1d1dd6033527fc866d02fc029f173ae232870cb8ea7fc272bd888c47c1460685bce303e1c939b6053527f82e4fbc264bea50b0e", - "v": "0x1", - "r": "0xbb14b1bf1dc47e99ba5176f0051f87a5af3ad4596bdbc982767704aae6329a4d", - "s": "0x6790cd2ad26afb01edbe78279975f60a465afc88899f258e89d9352f00a4afb", - "chainId": "0x10f2c", - "gasPrice": "0x3b9b1368", - "accessList": [] - } + "0xf8ea8202bc843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b88060006093556000601555f06000600c55600060d4557f62d246280a89c93e2e733a707fe8bfb147b1d0eb41f4f22b5e79e5db83df065160c8527f267503c6e445d97a2e130084bc0ee7f50b762404959c90aa29fa6a186317448a60e8527f605b386742211b44aeb98e9d1a15714ccd7fb5ccb8935014d2551127c149bf88610183021e7ca0f4f0abf4288da6b8e93b284da3c71664bb334a739aef3cd327f38494010e4f16a037801159a1007ef996df618b59c7303d490d209f0e65bcfbd510df6224c8e3fa", + "0x01f8ec83010f2c8202bd843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8807f871613375053597dd947f76f4b59f193ed196d0a383db4f2c010538dc2d15d256006527fb9e5ac58f4696ea9fa97a8e72a506746d0329eb058430a6bdebedfaddca6361b60265260e46046536043604753609960485360456049536039604a5360c2604b5360ba604c536086604d536006604e536077604f53601660505360c080a02c88bd966264bb90cc7f8f38e404d4c1276c0d632f9af6969cf17808b272a76ba025eb38477c1acbf1d704fa4781b3d06d67fef69dc1897b8f5cf6986d671b4471", + "0x01f8ec83010f2c8202be843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8806000606b557f74e04d75d11784e3b01e0e4f9a60a43d78bcd32ed0666c174967d83f68ee200d60fb52605361011b5360a861011c5360dc61011d53608361011e53604861011f537eb63b7b4ba4cd1bd1994e0ac6eaccc0b69552b865e8796b5d92933417635a55601b527f835ef0fdbfe12ec4e04a55376e7959737676de295bc080a0a403e43f4e8eec2de13e2a5f2672e8d3ec769adff1a54cfebb01a591f720d69ea04d015cbad681bb3f98f629f1b785c34f0c8eb0295afdd4452bcb40181fa4d7ff", + "0x02f8f183010f2c8202bc843b9aca00843b9ae233830186a094230f71cb4e7df4bd2533281ca0af045c7265e2ca80b8806000606b557fc0ee05d8d433057c94f4b522ee190f37520763403561740a4a45276cfffc62f560575260406077536064607853608060795360a3607a536052607b536028607c53603d607d53601c607e536026607f5360be60805360e16081536025608253606360835360906084536001608553605760865360a36087536052c001a00f1ab5643ae1996e8c5ba9c9a74ed091c38c09a3f6061bfd567831e8c6046870a00e2268f2c00df0e0e546a09743c19303e98bc3d9b492c8e6446f0008212698d9", + "0x02f8f183010f2c8202bf843b9aca00843b9ae233830186a094a8c5863cffdf51206d6e5169ff52b8412df6989380b8807f252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c697a611ddbe7916038527f5daa14e1e219a7f8e5971d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642746058527f1fba8cd991afe01c60d1af8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec6078527f87bd75d3fbffc9915aff0cf2776ee367cd83bbc001a0cce9670b6fef7306b4183cdbbbf61d58649d13032c9623633e337164be115260a07029c2aae90010a8cf51a7927d0e2a34454004457b985a9bdf46b276006c6b0a", + "0x01f8ec83010f2c8202c0843b9ae233830186a094000000000000000000000000000000000000000080b8806000603c557fab253ed30195e7a8d206681e8fdeae8ceef0810d7bd9d222e996ff53e66dbaff608f5260c060af53600d60b053609460b153607860b253602960b35360a260b453607c60b55360006043556000604355600060b05597c61c7fa72659d4ab40a1576491227496d007e871853d67b0b454d931b373303cb6991360c080a082341e9c8943366896e911fae2df1b99ff59c5af45aeadf0d361c7a4b9974f69a05c188d12a29d122d90429448d7999260ff319973d50780350e2e845b400ba194", + "0x02f8f183010f2c8202c1843b9aca00843b9ae233830186a0943ef849aa4aafac0612334791b201ff8cd80cd5b180b8807ff16cd0e7f35957becf2a658baf68226eaf4ce04c6a4a1c59e202c198e85f286860a3527fd83e6d6279d2f7477af9376136c3197442b808817d9b4ab5809c62799457708f60c3527fc1c5a1882dcc0a0c5f935d5e63eb5af01a2ba1df46e9efa4668e7b3ebf48032460e3527f7a324fb31e93190c4cf9957762ca8c3583f27fc080a0deda834531e8e8a7416d48c7aab1798a9029635e75e8db95001f3cb390b79ae1a00aae8d1fe19673f632900b298252c76a88e432a071bad8e5f953a665b7582fec", + "0x02f8dd83010f2c8202c2843b9aca00843b9ae233830186a08080b8804c7fb298fcaed32a3ed8497bcee3c06e667cde78e94be60ed8fd31a6daf8cc4472e36045527f4eeb85fc981a45dafdb56d55fda3cb099e03683ad89e3cfdad53c367327d66986065527f9d9a48991aa51cf33bad8a37442a1548ba3f4408ecc3e790edb546c42a9ec7f46085527f543772b939f002969866ee6b75def0a05ed0c001a014b0c44ef32db47fafa7d64abd32f7b72db5a45d7132ab09a4412dd6b3152f97a0789a75b0f3971604b136eb3e7fee81cb5d0b5521660ca8356531c9824b0d587b", + "0xf8d68202c3843b9ae233830186a08080b8806d57417fae6f51c8841a7bf1d04549fed399c1ffb7f09f30bc7ef270ac93dce7bd1550f06011527fc547e60cd3da33d487ec62d246280a89c93e2e733a707fe8bfb147b1d0eb41f46031527ff22b5e79e5db83df0651267503c6e445d97a2e130084bc0ee7f50b762404959c605152609060715360aa607253602960735360fa83021e7ca0a02e3dd44b2b4048cd00c0d1b42dc8307f3199804178c9add0d3a39797b7a5f2a042221e10531035fbc81ab176f643c92062688e6da5a14b528e7d1b25347d40eb", + "0x01f8d883010f2c8202c4843b9ae233830186a08080b8807f60e1c8291d8c0fc8f87f5f0e467b963be9b5cc5c74d7af548f08be13e94e0b30603252604260525360836053536026605453608e60555360c16056536032605753604d605853601760595360b8605a5360c8605b536090605c53602e605d536088605e536037605f53607b60605360c8606153605a606253603b60635360cdc080a04f23de0034f505989235e11ebb88ae86120615223465a1492ba72bbbb8d5817fa0663ab79d674b61b2d8c4c4fc39dcb48633ae415a77c4af31b974d54f90377279", + "0x02f8dd83010f2c8202c5843b9aca00843b9ae233830186a08080b8807f3020a0fab73d6ca1e4ebd45f9c70647adfd75ec59a085c45bab226211258af7f6013527ff57d2983f8ec672dda14df5dec43060f9f9d00dcd2eb712ac8d1181d36e875006033527fbe8361ab1a2f44cf855f9f98d15760b1034d0f40eeaf61e8934c447a6a909cd460535260b26073536065607453600f6075536013607653c080a0de5fea7132b1657d2a9b31ad8ce9e85d289a8a040090c173de90468fb961dfeda004a0b6f390496587c0a40876ae27033a8cee0f8e7c85e55ad5834cfe0e1c2c05", + "0xf8ea8202c6843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880600060cf55f21e430c600060b655a4fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16083021e7ca0fd76456322a025773ddfa533b0b281113b7d0b04b7d26a3a992d4b9bbc60d44da0444c914bd68fd7b38d088dd775e54f14f94c41de23599d7ea497d912a94027e8", + "0x02f8dc83010f2c8202c7843b9aca00843b9ae233830186a08080b880d39560006006551e7fae8ceef0810d7bd9d222e996ff53e66dbaffc00d947829a27c388fca0bb443fd60dc527f446f43fc530ab052974cc6301c81fda72659d4ab40a1576491227496d007e87160fc527f853d67b0b454d931b373303cb6991306fd01dedbb84f6cc66157cce374107efb61011c527f027fc57e2feeaf617ff8c080a078c791d21dd6795764990db671b041467e16be9c70308ea0d1752e7994b0de3f9fa6ac900e33e29adde30a889e92a6d7c6669e50d361310f73d61fca2a1993fa", + "0xf8d68202c8843b9ae233830186a08080b880306000602b55f17fae8ccec31f12fc2a6d539598137f71c8e9108309174945d89ebd9f39c011857e6031527ff5ed9105f0627862037a10ab3f5f5956601ce4cb8537da4ca6f0f268146bda1f60515260a560715360d0607253601e60735360e2607453600b60755360f5607653606e607753609a60785360b160795350437f7183021e7ca0ebf1a7834bad7e9469442e69c4243e4d287d4019b51452dc24817685dc0ed72fa01e0ecae8c20eb9afbe9d63ad4ac4dd4fcef224a9b4c88a41f2aad54cac317520", + "0x02f8f183010f2c8202bd843b9aca00843b9ae233830186a0949f61fb36afa423dfbc7a70ec858dc2f6741feb8280b880a27f6ea322da76d421e23e7a6259ddfe3915701b89a43005d43533a46606afea3a6a6068527f90969935a6302161a02183b1c6bac3e61167232e702c95b3941d8c2fd03054c86088527f68279f6a4e18226336db340b9c935ffba4ddcc4efb76fc5dfdc68d7fcc18e5c360a8527f7aeb5048bccb7678d45a346b0cbbc6121e41c001a0e6c302483b9ad2868f645f703cf9d4768b61ec6b0d31b271730ba78382cc1bc7a034244ab41085b8939f366d256e77baed1f0edb33e3b6233c7d49f468e65c859a", + "0x01f8d883010f2c8202be843b9ae233830186a08080b8807f88b3914b0df2d82aa05eb1a90226a540e9ed0be3945f7668bba1ed5cbf99e6c5630f56dd02527fda06b50617d2eefd3a112a78d09cbdb9434794879defd2fada71e024797842b2630f56dd22526049630f56dd42536051630f56dd435360a1630f56dd44536041630f56dd4553605c630f56dd46536019630f56dd4753c360c080a049e2240e04e42a65f1166cffaefe5a1d226709644bb0e0553eae0756b631e834a00ce12dfa4016d26723305008fef9dcaf6b35bf53004d70b69dc9df2d8010d409", + "0xf8ea8202bf843b9ae233830186a094a7b2dd8168965e02018a5e269f6dc64476f6028d80b880600060f555600060f4557f0254b3c0290c3af91fffd4a2fcb109c5fa891f3b04df60d9aef1e7c5bcb4a6f860d752601160f753787fadbcfcf4e8ec6967d10b31c13a2a93b9365df11f0b0086c68dfc525559376060601e527f70b72c3df84dd6727e80468da13b9e2c5820c34152ba108f27ffaa4bb5101f0b603e527f5a260883021e7ba0f99936c9c37e02e9d69528ef42d795c31b54c79ab4a521d113c40b671f64017ba0061506f1dde5068bbd9103563b1d91aacbebf166191e9b897070e8e4aaf1316c", + "0x01f8ec83010f2c8202c0843b9ae233830186a0942b5badf338b63dc4746f02b0ed18b868d4e2c47380b8807fdcee0352ac50d362700bb82f6b9da311563632f362654bd133a98a177c0ed6ca607d527f0ee4978cc41a1cb903d930d44dc31148106d7ccc71375fb34fd6b99f9ee57c69609d527fbe6fdf4f53171602207d4dc59de41eed7a3a519e048d646fb5a5b4ac5fddf67d60bd52601360dd5332bc6000606055566000607a553d60c080a0c441220d1f95fb7027ae4e5d39908fc3fcfb76fc8052ede511da557ed2f242e1a033595ea375420044f422992fcb0f06c28614aed1819392ba14e1e41d1093997c", + "0xf8d68202c1843b9ae233830186a08080b880600060ec5563bef2600060c2556000600955d3600060fe5545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1779ff26054527f4d8fc780ba3d2929977dd99f10e983021e7ca01dfcad24f36eedb590d3bfd14a61a568ee18559c722c3ca2472d8930b6eb06c5a0661038c9557aacafb42f969a42969f27cdcda59759df61e761fa08fafda5a6b5", + "0x02f8dd83010f2c8202c2843b9aca00843b9ae233830186a08080b8803a60006013556000606b55609b63c74aa89b5360cb63c74aa89c53600a63c74aa89d53604f63c74aa89e53608063c74aa89f5360c163c74aa8a053601b63c74aa8a153603d63c74aa8a253608863c74aa8a35360af63c74aa8a453602663c74aa8a55360bf63c74aa8a65360a563c74aa8a753605b63c74aa8a853607963c74ac080a0e401019fa5ce61367d5f84e06bade78495b25b67270f2eabe96e5fda7cb5b0fba06f1c0622a319f81788e089f8e89b4b70e40cf8481b3917bf9b3381dba887f63f", + "0x02f8dd83010f2c8202c3843b9aca00843b9ae233830186a08080b880600060ad557f5d3d579b7df08f18b6bc83efe04baaa3b308d3fbeaad603beaf58ca4cc4b46d3601b527fafa7c69b91e79ee998acf456f36fe3f7501b26bf24c68b33ace0df15ab2b8dbd603b527f1781f623424f10716ca349816b5f8738b089c94ead98914170943e4090c02d09605b527f5d136e503e5b8dbfdbf74313d141c080a0f9566e31812be3dddb1d4a8207b648bc9d80c99456139fb7761716761f92e136a03897fd4823048778aca54af8e94002b620a12b716b2a19dfb6761a4bcd7e2b1f", + "0x02f8f183010f2c8202c4843b9aca00843b9ae233830186a094ee7a7e3df6c8dd748b41761aebe0c5e56899e7f780b8806000608b557ffe6d8507ea68c6e0364d3037568d78b3af31d37ce8db07aced9e901cfdf70e3a6087527f4f253b69d9861d7f2eaeee429eef0269dceccb8fe0e49cbb1993fb0fc9dee9e460a7527fa9c15c8ea5fd540bb27e18533a2ca316fb144f0b3d5997a5ecc1faf1ae23439560c752606060e75360aa60e85360de60e953c080a08f6612c9fa35309c5387ea613bb8d714cba774ff1b069dc33b0caaf9a40f9221a005402d3d501983142f3a0d6f6790041756a952f40a90f03eb61f7e411b221bb8", + "0x02f8f183010f2c8202c5843b9aca00843b9ae233830186a094bad71177f0c7582f045c24be52dba88687244ff380b88060006099555f94a3600060e555496000603c55600060e3557f5cd0f31097e0acd8c311e9f757be3fcf06c51812820b53d8442ffb01871f5b866041527f8418002f1568a364760df95a1296065426c3fd34851200cc292509c524af88ed6061526051608153601b60825360cc608353602960845360d260855360ea60865360c8c001a0dc01b85089eecf737706adb8b03da0902beb524d96cda17d2f39c297404a021da04baa30ec335b878d902cb727b14316f6d19a998909236348bdf913f9246efa46", + "0x02f8dd83010f2c8202c6843b9aca00843b9ae233830186a08080b880600060bc55600060c255f6600060115557600060cc5555600060b6553e60006063553d6000593e59600020805545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1c001a018959fc9696c31d825fac26b96aa8e6ab05ac114335a710bb6ffb0c5f0da401fa01b40f214be2c16cd334b9ccdda37b60a4daeb8ead1f0ca9be0f2a6690c7c13b0", + "0x02f8dd83010f2c8202c9843b9aca00843b9ae233830186a08080b88063600860a253601d60a353608e60a453600660a553606260a65360c460a75360d960a853602d60a95360d860aa53601660ab53602460ac5360f060ad53607a60ae53606d60af53dcf57f4357be6c859a5f72416cea364ccbfba229af622827f8ac2ce408016b1940dff8606f527f3f7ba712319b74765dcd0d47d500e086cc87c080a09e9b7e9edd0b89a6914861cba8e87df5edb9e61e299276eeed9061d5b2edd64fa06892922658a72dc5a693dd7e81b50c094e24bf2b1261fcfc954bf4e8f7f5cc12", + "0x02f8dd83010f2c8202ca843b9aca00843b9ae233830186a08080b88060006049556000606a557e9192665d260b11bb2d01a756f18c004506d453f16e498293d37052bde4b6ae6036527f61d68fd124023ca8c21eb41a0fd83417c5add3a5934a0575bf39efa27b418aac6056527ff3d826a2ed36b2e76833e992ed2356a20da06d9a261ffe9994148a628c79212a6076527f7a62efa309050525e74cc001a0f8db4c68c660d127e947cf5956ba96865961c945f80eb961e6e7857442a36b35a029660f219eadbdaaeeeefb8530d140f216da954920a7353b2534bdcfc4c1a720", + "0xf8ea8202cb843b9ae233830186a094000000000000000000000000000000000000000080b88039227f4ff1dcf605f1eb50218a7b0881be9a723020a0fab73d6ca1e4ebd45f9c70647a605f527fdfd75ec59a085c45bab226211258af7ff57d2983f8ec672dda14df5dec43060f607f52609f609f53609d60a053600060a15360dc60a25360d260a35360eb60a453607160a553602a60a65360c860a75360d160a853601860a983021e7ba0776c3bdde8cc5923ca1835cfcdead36fe8b37138b20a070d08de908915969a3ca012ed89e50754404f128c35fcea2055c43e4710e19296da567cdc548578ecc1ec", + "0xf8d68202cc843b9ae233830186a08080b8808c600060dc552b367ff60da39f46d6253d7eef2e8cb0388c7791b7df5cf7d69ae55e64f8ab90d691ef608d527f70816bf4dca23660e1c8291d8c0fc8f87f5f0e467b963be9b5cc5c74d7af548f60ad527f08be13e94e0b304283268ec1324d17b8c8902e88377bc85a3bcdccc5302e327c60cd52608760ed5360a960ee5360c983021e7ba06c7c1877f1e17f73ed2a66fa41fbac9a99df28930978395eff30514c6b6a11c2a021f288b5e20a2efea62a051d7ae8cc84104b5b8155bb6c89219b7928ca6aa2ab", + "0xf8ea8202cd843b9ae233830186a094000000000000000000000000000000000000000080b8807f553221e369e554d9f8d468b6685fc094b548e10a6e085452b0def6e04bcebca16099527f16658ea8100c1b1aad3eff8bc7ebe248525351b398fb35a9fd38d1093eb979a160b9527fbaa35c547598a957d4be53da888e0917c6a9acf42a788c70f3ff6430de29998f60d9527f023d8b0778d2f8ff319ac3207ceef82b4200e383021e7ca0ed1c9ed5dbd9be6aea098f942612b41d2834f3a36afad608544b320be0585a36a0499b99e37a9c8b968c25a463be9020a22ea64015cc28300b35522aa643ba2109", + "0x02f8f183010f2c8202c7843b9aca00843b9ae233830186a094fbdaaaeef288930fb9851c6e451acac2bae49d5180b880600060f25589f43d6000593e596000208055587f1c7fc0d0f6e35c5fa9afe37280c410dcaee0a0aa42c848d391d8827630f56c6a60d5527f51c53091156c29c3f96078e956dfbc3e77e69d1ae75fd4e6ccc03fd4d5fbd2b860f5527f1c27775a4b6eb8b491f552dfc4481e3a6c6c7b11e4982568b0a06c4d315605a561011552c080a0b98271711327197c04597a01090d2069c8584cf9c0f9d18767b6b59b48bab9d3a03151e55d741c2d0007b7d3e9bc28d8b954197fb5317325fcf938961df6e4f7d8", + "0xf8d68202c8843b9ae233830186a08080b8806000607c553111727f3bd834742c0ee6e7c85569874fe0e468a340b6b6268eb290ef6e8237ce7bf1f9600c527fbfb043aecf9a7d4e4f04877640064f1d5562cccee004fe0237192d55c06dee63602c527f32297cefa26777f0db4ed47c4e288af8157312e0d342ca0a902d3ec0c505fbab604c52608b606c5360a9606d53601383021e7ba05ac8301bba89defa7f64c2613a68f8bc8484720ec429520b3b537f516f61e7caa075ae5cebf673c03a6ab77bb7a690930962b3e0beb76614097802deb01c645690", + "0x01f8d883010f2c8202c9843b9ae233830186a08080b8806000603c55600060bd556000607355d9600060495547602f6000605a5568600060435529787fe09372d951ba061451cb57c643ed9b05448146952fbb04fe189666323625e784600b526032602b536019602c5360a3602d5360ce602e53603f602f536087603053604960315360f560325360b8603353606f6034536026603553c001a0d44e7134c95c63db7577aa63f3b900f034c558c3d24545476f464544a0943f9ea060bad54d2bff3c5943ffda059d0efb8adc1d652883fc0579cf220a04480649df", + "0x01f8ec83010f2c8202ca843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880836000602a5598485a7f27198ddfaee167a4ad61dcee0352ac50d362700bb82f6b9da311563632f362656033527f4bd133a98a177c0ed6ca0ee4978cc41a1cb903d930d44dc31148106d7ccc71376053527f5fb34fd6b99f9ee57c69be6fdf4f53171602207d4dc59de41eed7a3a519e048d6073527f646fb5a5b4ac5fddf67dc080a083aef536658a4afa2076b92257e4cd54535d0919754cabec7cbf8105c4daa815a0285c4bc945c66d6d50ad3bba5ed167511c6bb87ba42827b3f2f6bc3e6d2cdcfd", + "0x02f8f183010f2c8202cb843b9aca00843b9ae233830186a0941593ccc8ae41a5c2b556a41acbac1fdf30a6e13980b8806000609555b2600060c455eb603e60ee5360c260ef5360df60f053604660f153601460f253605360f353606460f453609360f55360b160f653606260f753604560f85360ad60f953609a60fa5360db60fb53609360fc53603a60fd5360e360fe53607960ff5360876101005360a76101015360ce6101025360c561010353603bc080a0f6ae939e1fcdadfc997d09e0714d53e031a4e98a0cd3dce03487ff7708adfda6a04a4be9015e882f8920367c38a8c7b7e33fd82ac65994b3b8910308b8f54f7901", + "0xf8ea8202cc843b9ae233830186a094000000000000000000000000000000000000000080b8808bee25600060e8556a60006008556000609355600060cb55601660d353608860d453607260d553608760d65360c060d753b060006058557f35cf25b6891820aecb6f5d3e39f97f477164b2a9704a96e2bd9346105d7cdc426081527f6ecd742eb55bb02cf674815e3f0d02d3385387db5d7611b251c73b412f95fdff60a1527f83021e7ba070e3038648767a3da2dcbc185dd30a607a3640e7eda3727badbb6938ce58b3c1a038cb8fc48a2e0397647ad0989c20d62c6d47a4dd23da8613c5888a130245c76c", + "0x01f8ec83010f2c8202cd843b9ae233830186a094000000000000000000000000000000000000000080b880e06000600d55cd3d6000593e5960002080557f630bf50570bfeef9f7ffc3c0f73b23876bc2cbe9ee8cc4327762e03f3a42403f60dc527f4eea252d6620135523d78020c65db930cb847608dbb1012a5f530820cd4a8d8d60fc527f3aad354e3fd807310043a47c6ec84bd096ffd8b13b8c3dddbc4784990131ce2761011c527fc080a00cff75184eeafa5c0a5cfe9902273332b043b52765b217b7fc8a03e7f2fcb890a02cd979888b27e4828ed66a63ab638091029e74aa37ed9b56c2871f5ef2a66c3e", + "0x01f8d883010f2c8202ce843b9ae233830186a08080b880c27e600060a555600060bc557ffc76ab830019a52d03c3d5babd6cc8b15fd8782c1548b192bf665f77d297157460ad527f0948fb9f3690f93e232e3cbc8d16adb9912892be43cd80091234531a1c66415660cd5260ff60ed5360c060ee53603560ef53605a60f05360a360f15360ff60f25360e060f353609060f453609360f5c080a092c9b11c1d27055109829e0f1eddafbcc66cb23c73685100215bc92c8f55e5bfa0359e2826460c464ca27fcc83e14ff388c6a5fb6e85bebb6ff31f2c294bfb9ba4", + "0x02f8dd83010f2c8202ce843b9aca00843b9ae233830186a08080b8809d8b7fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ecc080a0fc586d852071c9be12f5b238b6dce7ddf344e4a6f17ea56bade819442c3c2595a00c2a0c866e9ee6a08fa84c44f9ef63c2f06f864ca5899597c9d3186c533ed818", + "0x01f8ec83010f2c8202cf843b9ae233830186a094ade60a104f4068a7619e5268ffc4ead964c235aa80b880add27243600060385587397f06079ebde583e2a07038939368d7a98e3cd62f78ab560a32843e15f76af2af3e60ea527fe1fedb9e8b005bcce7968c9c9d5ccdeef1f729f737f775a978a53e9122be4a9c61010a527fbbf87d3aac2c309b967eadb90a044cb1ad3516629b5edaa5b67d83d070189e2b61012a527faf82b4065c8cc001a0ed01b46ca67b802b7116dd9864f5fe8d44b0b1246906f9a8afce681bf6dd6ba9a013374bd1a394f307eb8cb7da62ba89f5593267b15202c3667b1b62d99d5dfa8f", + "0x01f8d883010f2c8202d0843b9ae233830186a08080b8807fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ec5360c001a041df05ccb431263af776bc5482f84a3bd3a32bccd2e012ac61187b24f2c85faba05abbdb8f3f87af18a2aaa6b59be0c6038046cae606fe8f6cad8c9e4d20b32852", + "0x02f8dd83010f2c8202d1843b9aca00843b9ae233830186a08080b880fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16086527f1ec9313fb523398fe719fa4dc001a0e32e64fbd79e2dde56d01ad8d8676bdca32a11aa2a0142be0bec2c07adb37d7ba0330ecb44548556151c7c24c811c489d647d066e1199173a84bfb694db62cf218", + "0xf8ea8202d2843b9ae233830186a094000000000000000000000000000000000000000080b8807f134b0ed844476eb6e323346a83374c697a611ddbe7915daa14e1e219a7f8e5976066527f1d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642741fba8cd991afe01c60d16086527faf8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec87bd75d3fbffc9915aff60a6527f0cf2776ee367cd83bb280c217b29d90b448b5283021e7ba0fbb741a0db5ffe550cb6614c64032c79914d44d9ab71f1581219e2b78a62beaaa035dfd16e5106c1b2af8f0909cecdb43943dc8dea91be7af6ea53635e5d0a5a43", + "0x02f8f183010f2c8202cf843b9aca00843b9ae233830186a094a3608ae1bed27f19c0d005ac5609d4978da6756080b8804f3d977fc1faf1ae23439560aade62812de4f587e75c0f2e51b39ff70ee136834ee8015b60b7527ff0050b6cb68f84e855e5448e4af349acdd6ff10c133b3d4f118b8d86a4a7459a60d7527f47a894ba78c7c16fbbc7bb63a4e6e450500c9e8f6bb4d4bfd876c046a7c396a360f7527fb6c8800e3e71fa4f7cf3c546ba3af180c080a01124b6bb7bb6f413fb3eebdae1890635c20ead0a085166dc3a0bfd2d3e8fa75aa064e2960a5a3e518043af5cec8148757979a177a12676492a7f7008a349b99a36", + "0x02f8dd83010f2c8202d0843b9aca00843b9ae233830186a08080b880c36000606c55600060d8552c483d6000593e5960002080557f665f77d29715740948fb9f3690f93e232e3cbc8d16adb9912892be43cd80091260c6527f34531a1c664156ffc0355aa3ffe09093b07b8a7cdc0bd9cdffb48e82ad69742460e6527f9050706ab2bf4f042fe064e517f920d133c1d25e62f4e7d573ed8c1bbbc4e8c001a03cde552e24dae6908a5f683a02a30a56e2f716c28af787cb169f6decbe4dd76ea05e1ed1fdbeb338e95affa923c2fcce6186a404ccdbb1012d677b0c0123d6e9da", + "0xf8d68202d1843b9ae233830186a08080b8807ffe6d8507ea68c6e0364d3037568d78b3af31d37ce8db07aced9e901cfdf70e3a6087527f4f253b69d9861d7f2eaeee429eef0269dceccb8fe0e49cbb1993fb0fc9dee9e460a7527fa9c15c8ea5fd540bb27e18533a2ca316fb144f0b3d5997a5ecc1faf1ae23439560c752606060e75360aa60e85360de60e953606260ea5383021e7ba0937ee8b035e0145e0d61b17bb0596409377ba33eb50a69c36d0ccf462d0b7d99a060dcf7fe26e337a075bc48545366f6e33e680b4dac242b3c28a08287fb75d67d", + "0xf8ea8202d2843b9ae233830186a094c277b081e9cf30d631b90db4eb38a9629639f01780b880d6d3568d7f800a5d9f0360ef81b25ca1e2e086545937d178f18906311fabc02ffe84a8bb806052527ffa5aac32e55a0fb508de67a5e6b5d89dfa08026db6a78f9f9452f55e1d83a66c6072527f873fc57211aa56b08af0d65ee29fcfff7e896201834e7a8fd5920e4fa39c6bae6092527f7e4206a204b115d4dc50e0e57e0ba983021e7ba0faa84228b6e09352e14bdde1889b0031f2735bb09d44abde736ed0ca9baf3c46a058e2f8559c2c78511f36a564ee8432bc315130c9e17a61f9b9dfda26d9590726", + "0x02f8f183010f2c8202d3843b9aca00843b9ae233830186a094e030d841f8cbb3db0928049cb342609a8760d8ba80b8806000608255a17f5f587e6be73f8e59b509956eb2156b233a4733e6f397df2e4f4b5a2027e3b9c96099527eb4840a383e5135002a63dce725c5c9e40ef7eac246d44603a757ec1db5217460b9527f9dc95e36109d60d38e28a5a19011e264853d3487a50d272540f41a63671c9ce260d9527f45275e0a3575b08354fd641f1602c080a0e3a29c37d25fc25108cc683d426ea78c73e55dfad6a0edd423a3b7c9acaf24eea05a7d2d290957ac7e17ad0981e56f6798584709b8612e35c229d10eb3d8a98ae0", + "0x01f8ec83010f2c8202d4843b9ae233830186a094000000000000000000000000000000000000000080b880ae600060fd557f22d0e5875851f68a57d1614fdb3dafc4c1c9c7994e8fcfeab74280d20c599a326015527fa6a6ebeb6c8c63a3400a54bcb19b2ee3061cc7f0614adc03015b290131f627f66035527f80dd1eddef13d6c0d5694782e8a97f909c5f3adf2f998344bb3ba1e3a906c8ab6055527fcb93273a80d618de5b5ff5f60fc080a05dc2c165818df868346f2b2e52e56e22d42ac33d5c9a36d22819a5350f74f045a05ca8c54af8d56f5da25845065dd2c60308bbae6ba60ea6bd67709c9ba63f307d", + "0xf8d68202d5843b9ae233830186a08080b88021495d603460e25360c760e353603560e453600960e553602f60e65360d160e753603160e85360d260e953607860ea5360fe60eb53606a60ec5360a360ed53600160ee53606960ef53608d60f05360dd60f153606860f253607b60f35360d860f453600960f553605560f653609860f753602060f853608b60f953609660fa5383021e7ca04f411496701ecb39ecb3676fe06934c8513809296c32088a41217976950a1bd7a06ac7ba448e6f4428d9c2883a7a3a12795cf3fcb1b09a2161db7fbb9841099e32", + "0x01f8d883010f2c8202d6843b9ae233830186a08080b8807f2e255612584176ea74af4594265daa4c75edfde9cc536a055ee4d568574bb5446025527ff87d21ff26123da6026ebb8d89c0a3e3e149d0e55d8f8781ed6e8865fdec178a6045527f31763a38acbfe89a4cfb475ca5d7b041f03a8f243c1c833219c63c1e3c395b226065527faf584ff1dcf605f1eb50218a7b0881be9a7230c001a0b55cccda1b97d69b89f0013e0c8c265cdc9abff37bf8817d303a98804e2dddc3a04992a369886b1e12946fa176c7320b791078569ed7f8c02e915368d13f446e8d", + "0xf8ea8202d7843b9ae233830186a094a05f31a218a7d43598da785f5f80697dbfcc7e2380b8807f344c0506a8d6252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c69601d52607a603d536000605d5560e160e75360e260e853601960e95360a760ea5360f860eb5360e560ec53609760ed53601d60ee53601160ef53603d60f05360cf60f153609d60f253601d60f353609960f45360f460f553604460f653607c83021e7ba051ebefd46e24ff8c05110d443118d0a4400e98872fb66d86467c9d81b777a5cfa0529d442d04289a47d5f8c07d1a07f28205f89e6ac1d4324f2c70043d5ce7bdaa", + "0x02f8dd83010f2c8202d3843b9aca00843b9ae233830186a08080b8807f1c55857739ca8a51b19e7e024f87db209b5142a161fd1af72e570ed1f870b0c5608e527fb801ace831d7ecc756f149c7349eb6428f3848e9c0b6483403194716b0caa7e060ae527fbaaa7cfdd00e84266a66a6d9df6bd57b5e1f78f727f551db0d6e35eb4319c46b60ce527f39287d81187e5644d3e865d2b15427f9734f58c001a014450b1d027fd07256a433f9dab84e7a17a678b82d8364c7ac9f91761a84ed59a0734b1f32e31b5bfcc7fe482845f3c051b22ecf0c44e026b7b95cae72326702d2", + "0x01f8ec83010f2c8202d4843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8806000600955cb967f01052b709c4533377e1b821ad4c666c76bad40248fa20517115c5f5c17db1f216000527fc92568e9be2cfe2ab4bf37285be156f33fc4e08c921c2c795079ee80ad3a8a876020526077604053604f60415360a660425360486043537f55e44c14b79b162478cad6e4a7f08bf8d3dd34af64f1dd62bf652619c001a0c596d9ac16ff9e43612a3ec48414ae930f6750b7cff6d4788590c829bf3251e2a061a4e944a80849a3c431092a0497fc92dceb3a0b4e2d8a642829c9658b796cfa", + "0xf8ea8202d5843b9ae233830186a09450ba116d8975e9c3d2fcf4caf25959f883ac4c3d80b880434460006099555f94a3600060e555496000603c55600060e3557f5cd0f31097e0acd8c311e9f757be3fcf06c51812820b53d8442ffb01871f5b866041527f8418002f1568a364760df95a1296065426c3fd34851200cc292509c524af88ed6061526051608153601b60825360cc608353602960845360d260855360ea60865383021e7ba0404b057a8a999a1acbf0ecade9ce3b0da2251355e6971c84e4863232b5001880a026aec794ed13f893e337a1cb6f1d81700b418ba5d68924663164ad4c64e65f3b", + "0x02f8dd83010f2c8202d8843b9aca00843b9ae233830186a08080b8807f553221e369e554d9f8d468b6685fc094b548e10a6e085452b0def6e04bcebca16099527f16658ea8100c1b1aad3eff8bc7ebe248525351b398fb35a9fd38d1093eb979a160b9527fbaa35c547598a957d4be53da888e0917c6a9acf42a788c70f3ff6430de29998f60d9527f023d8b0778d2f8ff319ac3207ceef82b4200e3c001a0aed4d1ce2854d18c1709e391872b868a6095d326057b70edad8cff710c1f789aa00c0cfc1ab7e48fccc8f31e7324aa84eb6bea5f9ae5a3342dc9f9878dc6397d28", + "0x01f8d883010f2c8202d9843b9ae233830186a08080b8809d8b7fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ecc001a094e44e27b33e4c706670ca6a3e563b4772ea45cbd966e5c079f1cae90b8902f8a02a811dbcfa162bd5ba5c98fc7fea62ea91b592519d56e364fdcf4438c7150f9e", + "0x02f8f183010f2c8202d6843b9aca00843b9ae233830186a0949ead0c84d14b86207e92bbc38cbf511365e35af980b88060006047551f600060f3556000603f553d6000603255717f921d958f72f97e21600f19838283dd31f8d768d063129e45a480c5cfb5217e10607d527f586f500437cc17ec1f0dcb4648a1d1bc4b730dcd6fb5c8467fd8ba776bc1a755609d527f7d10237febb5303a09824c0a0c1da013a0d566dc620172fd211a3626c05fc519c001a07d7371b3ff2f940078b8685e4cc1a4b5f1f0c03e331b351d571d5ffbcc164091a0609788444577ec07d6961d328c9f1e6f0da3687f55490631c34b4d3fc82ae74a", + "0x02f8dd83010f2c8202d7843b9aca00843b9ae233830186a08080b880fc6000604e556000600755ee7ff35558bbde1f167aa4c54c6b1ed3dda9c0a6bca110ef32009f2bb0a0ba20c4f8602d526047604d53607d604e536015604f53604b60505360fc605153603960525360a160535360ad6054532b600060ea5560006084557fa35740ac9796cde3ae33b828e38fe46704fa4e24b59fb7a8de86ff88c080a0a49ecd1a3f63b5946c2b18aa69494cc5e560ef4fe773d2efe3043fd3562d1b25a0515b46ffc769aae4de8b25aa5f6c35b769097632e97546f54e11e73a1d2e1619", + "0x02f8dd83010f2c8202d8843b9aca00843b9ae233830186a08080b880600060e8556a60006008556000609355600060cb55601660d353608860d453607260d553608760d65360c060d753b060006058557f35cf25b6891820aecb6f5d3e39f97f477164b2a9704a96e2bd9346105d7cdc426081527f6ecd742eb55bb02cf674815e3f0d02d3385387db5d7611b251c73b412f95fdff60a1527f23ecc9c001a0f0c0a5e90305780a1c4b05b7e48fef185bc91a7b50c4a81951169ec089cb290ca002e1ce6c2d48a59ed25c9a59d6500e09bd40d892187215986ad5970ed010c7ef", + "0xf8d68202d9843b9ae233830186a08080b880600060ae55437faade62812de4f587e75c0f2e51b39ff70ee136834ee8015bf0050b6cb68f84e860f3527f55e5448e4af349acdd6ff10c133b3d4f118b8d86a4a7459a47a894ba78c7c16f610113527fbbc7bb63a4e6e450500c9e8f6bb4d4bfd876c046a7c396a3b6c8800e3e71fa4f610133526000603a556000607d557f6f83021e7ca075cb5780a42a395701c91bbdd7b9e62ea8363e1a6ceed04ab7fd91d70486a17ca01762bef4077c727a4160fbe4215bbdddac53727ae733309dbe6e8be50bf46ae9", + "0x01f8d883010f2c8202da843b9ae233830186a08080b8807feeb4fffe85e8bbc80e733d3686654a194354e3f4c51dfd90593e99dfd2740a46607f527f01bd008dc6af2bce6c62bd869f3acbd5035bf716d041f3261d8672f40d30acec609f527f1c55857739ca8a51b19e7e024f87db209b5142a161fd1af72e570ed1f870b0c560bf527fb801ace831d7ecc756f149c7349eb6428f3848c001a0586dcafc3cc5694fb3aaa940d8795fe413bf502d49075af92adc5640a3540cdaa05fe228c2fbd2cc6574c6a9c9bab95e14cb0816cbdb8d78db59f7d8736c7e1b36", + "0xf8ea8202db843b9ae233830186a094000000000000000000000000000000000000000080b8807f0df2d82aa05eb1a90226a540e9ed0be3945f7668bba1ed5cbf99e6c5da06b5066013527f17d2eefd3a112a78d09cbdb9434794879defd2fada71e024797842b24951a141603352605c605353601960545360fd605553600f605653605660575360dd6058536002605953607c605a5360c3605b5360d2605c53608e605d536083021e7ba0a95f9f13ca2866a3cd6eb6ab49c740b3bbf034ff8555bc713216f673923236e4a06d79664d76901d1954d2ec75ee3d73aab0a0a7f73b094bad5e342c60022ce1f1", + "0x02f8dd83010f2c8202dc843b9aca00843b9ae233830186a08080b8806000607b551ff7f5db6eeb1960006028557f187e5644d3e865d2b15427f9734f58e1ff991e131e985b3c26930dff12f8766c6056527ff4aeb1f1e74f54ac02e056c0dc398518d02da967d89eef4d65fd3120aed1936c6076527f23325734a61149d57fc81688972053f7b60c5e283d928a47ef935e53939a74e66096527fe657c080a0e95281821f0d8d54a654593a0c0f63e11b67138f0485103a85c9e8f5710dca33a0072613d356e8b4f362317fbed84939895e599863540fb02f11d87ea6830b5946", + "0x02f8dd83010f2c8202dd843b9aca00843b9ae233830186a08080b880c0600060ab557f135f85ea726b7b879b2a4b6e54a98b0ceed699228f8c01ee75bfc058a0856b1b60a0527f49863065ec145bfc830de078640734fdfd6ea54d31358925879d4cf4e52dbe1860c0527fa22a4db814f2fe37434f642bfc207ca5946993713d3070f3d8ab2372cd03c5d260e0527ff3a0f27005547601e36dd0daaac001a080b00af6dc0e87adde109bcd7691b73d9e7a686ec978b92f217dbeb7f82e2a1ea06584788bbfb1d717c795a4695c7739d18a4d63d5a227a79e7714e999e1b1ca3e", + "0x02f8dd83010f2c8202da843b9aca00843b9ae233830186a08080b880add27243600060385587397f06079ebde583e2a07038939368d7a98e3cd62f78ab560a32843e15f76af2af3e60ea527fe1fedb9e8b005bcce7968c9c9d5ccdeef1f729f737f775a978a53e9122be4a9c61010a527fbbf87d3aac2c309b967eadb90a044cb1ad3516629b5edaa5b67d83d070189e2b61012a527faf82b4065c8cc080a0243dcd73219c8102ee6c0232d7263763f2ff00c6f765608bc631d8c027910015a0735eec5d9df062cd8860310e88f554ca6eba34b7224754cdcfcfcfc066e3dc50", + "0x01f8d883010f2c8202db843b9ae233830186a08080b8807fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ec5360c080a0b1e2b582ae32ebdd1ab9d33a9218e37c5455bac8cdbc5523f8f622cf271ec967a04e1c84cc98119b8930018400579daaf41692fa478578120cf425c4290a5d666b", + "0x02f8dd83010f2c8202dc843b9aca00843b9ae233830186a08080b880fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16086527f1ec9313fb523398fe719fa4dc001a0e63017a7289b2bd3c3accfb3923ce514b668da97727412de3204096c3256e852a05c865b3377c137b9eb6c5a181708c89f2bd22f381cf905083d9c25f8da8647d4", + "0xf8d68202dd843b9ae233830186a08080b8807f134b0ed844476eb6e323346a83374c697a611ddbe7915daa14e1e219a7f8e5976066527f1d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642741fba8cd991afe01c60d16086527faf8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec87bd75d3fbffc9915aff60a6527f0cf2776ee367cd83bb280c217b29d90b448b5283021e7ca0f06a30f19d81595fe1a7ae329d0b2a68ccc1bd144cdcf4967ce0af503b23264fa0070d31932f369f33958aa6f01e2452d80a44dcd76a00d354afe93756ec6dc379", + "0xf8ea8202de843b9ae233830186a094af426b9ebe129619d0fe19b612380127cb2c132f80b8806000608255a17f5f587e6be73f8e59b509956eb2156b233a4733e6f397df2e4f4b5a2027e3b9c96099527eb4840a383e5135002a63dce725c5c9e40ef7eac246d44603a757ec1db5217460b9527f9dc95e36109d60d38e28a5a19011e264853d3487a50d272540f41a63671c9ce260d9527f45275e0a3575b08354fd641f160283021e7ca09b43b74f4488db65d84dc8d672940921d2ad4dc744a7a0d3a9fb2d4db91e9145a05e96084d8fe3f5e47ac624805ef930fde9eb352ccfcc443dd03712309724b953", + "0x02f8dd83010f2c8202df843b9aca00843b9ae233830186a08080b880ae600060fd557f22d0e5875851f68a57d1614fdb3dafc4c1c9c7994e8fcfeab74280d20c599a326015527fa6a6ebeb6c8c63a3400a54bcb19b2ee3061cc7f0614adc03015b290131f627f66035527f80dd1eddef13d6c0d5694782e8a97f909c5f3adf2f998344bb3ba1e3a906c8ab6055527fcb93273a80d618de5b5ff5f60fc001a0341490f6ce91ae88e58ee6ff088a5bf2fc1a89cd42f7777f526628ba3032c3dfa034abb48aaf536229fdc63878ec8f1153051e461f95eb4f8b3d8ece6413204641", + "0xf8ea8202e0843b9ae233830186a09431db9affad30b83811373e27db11e8754f5be6ef80b88021495d603460e25360c760e353603560e453600960e553602f60e65360d160e753603160e85360d260e953607860ea5360fe60eb53606a60ec5360a360ed53600160ee53606960ef53608d60f05360dd60f153606860f253607b60f35360d860f453600960f553605560f653609860f753602060f853608b60f953609660fa5383021e7ca01629b86fdd828c3c0488dfe41fe11a28e1888e8868043a1b087492307a4df3b0a01ee5142cd78767c348a401c5e37085f3873c3a2f2650c004f7b280e2fae2db07", + "0x01f8d883010f2c8202e1843b9ae233830186a08080b8807f2e255612584176ea74af4594265daa4c75edfde9cc536a055ee4d568574bb5446025527ff87d21ff26123da6026ebb8d89c0a3e3e149d0e55d8f8781ed6e8865fdec178a6045527f31763a38acbfe89a4cfb475ca5d7b041f03a8f243c1c833219c63c1e3c395b226065527faf584ff1dcf605f1eb50218a7b0881be9a7230c080a0f2973939f8a2b6f94beb601fbe1944ba3bef15ae57be33ffece96844d29927e6a0435e106b009b42f4885a1acfe92ecbb596b290ddb02131db1344c1706fd6c349", + "0xf8d68202e2843b9ae233830186a08080b8807f344c0506a8d6252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c69601d52607a603d536000605d5560e160e75360e260e853601960e95360a760ea5360f860eb5360e560ec53609760ed53601d60ee53601160ef53603d60f05360cf60f153609d60f253601d60f353609960f45360f460f553604460f653607c83021e7ca0013955dbde0317950052e765affcbb7fe23bbf01f348e5c0921df48d62f606e5a053c496601c5b99c1831693a96ee162360efdbd8ee6ee7cb3dc73fbb513ab07ad", + "0x02f8f183010f2c8202de843b9aca00843b9ae233830186a094adfa1f382e116692a6b7de1a459a680ed5d19f7a80b880600060c355567f6c096723788fc96ffcd240274efc91e20775eeae28f35558bbde1f167aa4c54c6084527f6b1ed3dda9c0a6bca110ef32009f2bb0a0ba20c4f8477d154bfc39a1ad3e2d5b60a452602b60c45360b560c553604660c653607860c75360ea60c85360e060c953601060ca537fa35740ac9796cde3ae33b828e38fc001a0320039a5c56817a0b8d4dfb734594a3faed54fa33f34ac84f391f756b0824248a01ff9a7b15700ca19add179895c80037847e2dc86dde9fec54ec7903f6b2ea634", + "0xf8ea8202df843b9ae233830186a094c3c70ab28f95012f33f9898c45680b2473e7bb7580b8806000609f55600060f3552b7f124c15f8b1fc74f701b8885df0f38a5cb554db930076765b1dbacad83ab752776018527fe6a3c939a2b143aabaac607fdeed7ba02b08188e2bc1e89b4b6b4514a7f67ace6038527fd9f0ce518f357417198560a2c1f89e40ea1895963b14292adb8117bf9bd46d226058527f6ac3cb8e787e177b83021e7ba013c3e154b4b224b9200a7bfe2fa8261cb6dbad7ababd7e951c605a9802f02f89a00ac92c640c9b6258112e8b63a639e657b47c999c8f2dc04e9f105b9b6a3f9aa4", + "0x02f8dd83010f2c8202e0843b9aca00843b9ae233830186a08080b880600060c7556000603b553d6000593e59600020805545d4108e600060d455887f4abbfc3e55fa691195ac0870fb45e64922ab8dd119223fec7a3d11028c92a8946080527f4386eb9f7c383e183eb0b472695865ce973f8a229e195b1084ba260307db4c7460a0527f84977580612c1856ad6f1f31bbfbbb8c2d6d141ec17bf7adc001a0da30b658eba105ae32ce69849cae58fc8a3592556c537b6721d5244349af1604a05de585779563a66f57cf19575c2d3e5f7498018ee541ceee9aa4c28375f25c3e", + "0x02f8f183010f2c8202e1843b9aca00843b9ae233830186a094000000000000000000000000000000000000000080b88060006047557f63d5e6358aa601b44d53ee8b73ce5828d143829947935f8c129982aa98ace52f6010527f1e27f6f5c4228ccfd588006670608f114c98f6212605e048a3e98df42c449b956030527f07bfac90733d7ac47cf46a6eeda36ac22f5c6110532a570c801be64a758869226050527f9e8d67677cc5045e04f237954502c001a0d5e6e44fcebd9c21229861ad0266ba39cab728af15cb1bc316db3b4a89ece9e5a04612facaa85d7724fc2fb3932c6b9324430894c02a06872a34ecc3ab48d00f36", + "0x01f8d883010f2c8202e2843b9ae233830186a08080b8806000607a55dced600060f6557fc6c5790e478f4de8ff0c8719a73308db2da826b7830ccea4bb3bc96cbf3a5e6d6042527fab8961604907f052a37ecead216dfc527935ccf8c9622f29d7c46f2fce5bc5716062527f9a48bbcbbdd870f9824d6bf8dd465783edd0805dcd88f8de4c0214bfd763bff36082527fb104f93bf3a0f7c080a0deee139e98f2f50d48d40b0065295e507417893482ed38e80ca0f33fb76f6d2ea0668f753d1a1f8bceeabc58d8e67f511a5934fe558632dd5250eccd0279a9b26f", + "0x02f8dd83010f2c8202e3843b9aca00843b9ae233830186a08080b880a27f6ea322da76d421e23e7a6259ddfe3915701b89a43005d43533a46606afea3a6a6068527f90969935a6302161a02183b1c6bac3e61167232e702c95b3941d8c2fd03054c86088527f68279f6a4e18226336db340b9c935ffba4ddcc4efb76fc5dfdc68d7fcc18e5c360a8527f7aeb5048bccb7678d45a346b0cbbc6121e41c001a0f7281f2341e30c7c1a8327312fcde44521e0f351695c39a928d42992226b9bdaa03fe0ab785e4c465da39122a68bad9f07d5ede775bbcb3ca3503089466cd4f383", + "0xf8d68202e4843b9ae233830186a08080b8807f88b3914b0df2d82aa05eb1a90226a540e9ed0be3945f7668bba1ed5cbf99e6c5630f56dd02527fda06b50617d2eefd3a112a78d09cbdb9434794879defd2fada71e024797842b2630f56dd22526049630f56dd42536051630f56dd435360a1630f56dd44536041630f56dd4553605c630f56dd46536019630f56dd4753c36083021e7ba02af5172deb692399671c8494864d77ec6d3e349e440a05d60218173216c01197a02db36fe854bf9b2f148d2b19d3228ee21d78eb1abcc4871aa2464099855656d4", + "0xf8d68202e5843b9ae233830186a08080b880600060f555600060f4557f0254b3c0290c3af91fffd4a2fcb109c5fa891f3b04df60d9aef1e7c5bcb4a6f860d752601160f753787fadbcfcf4e8ec6967d10b31c13a2a93b9365df11f0b0086c68dfc525559376060601e527f70b72c3df84dd6727e80468da13b9e2c5820c34152ba108f27ffaa4bb5101f0b603e527f5a260883021e7ba0cc10210786a1cdd0edff715a5df7c9d4612ef3db851e70fc931da5b8d66a654aa0704871e99d215be0c44bf3acffc7ad3a7dcc33070dda545c5615621262981e86", + "0x01f8ec83010f2c8202e6843b9ae233830186a0941468c27ce0ae8e3973df417ade59353ae90a12fb80b8807fdcee0352ac50d362700bb82f6b9da311563632f362654bd133a98a177c0ed6ca607d527f0ee4978cc41a1cb903d930d44dc31148106d7ccc71375fb34fd6b99f9ee57c69609d527fbe6fdf4f53171602207d4dc59de41eed7a3a519e048d646fb5a5b4ac5fddf67d60bd52601360dd5332bc6000606055566000607a553d60c080a0cfbb1f4cc760081bda0f35627b1f3434e50c2c8cbdc446985759c97b5b258599a03bb91a51c4fdee07cac717b494087389c8ff4b86f3746a0eb40f0ca8f10299f3", + "0xf8d68202e7843b9ae233830186a08080b880600060ec5563bef2600060c2556000600955d3600060fe5545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1779ff26054527f4d8fc780ba3d2929977dd99f10e983021e7ba0abfc06f3c0902b9e99d6e307eef1efd1ef48dbc12db7947aac6292f62f66b1b3a040a0d8640292d22df4d0c516fb377352295a7f9a20f2514118f5e95cdfd7e219", + "0xf8d68202e8843b9ae233830186a08080b8803a60006013556000606b55609b63c74aa89b5360cb63c74aa89c53600a63c74aa89d53604f63c74aa89e53608063c74aa89f5360c163c74aa8a053601b63c74aa8a153603d63c74aa8a253608863c74aa8a35360af63c74aa8a453602663c74aa8a55360bf63c74aa8a65360a563c74aa8a753605b63c74aa8a853607963c74a83021e7ba04af5143d9542e40b878d98c65b7da8ca9966bc8b5ce004221a770b8f7463d662a01a7a40273ed9e1c6c0fe748d96f7c7287422343907c5959ec3d70524781a7cde", + "0x02f8f183010f2c8202e9843b9aca00843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880600060ad557f5d3d579b7df08f18b6bc83efe04baaa3b308d3fbeaad603beaf58ca4cc4b46d3601b527fafa7c69b91e79ee998acf456f36fe3f7501b26bf24c68b33ace0df15ab2b8dbd603b527f1781f623424f10716ca349816b5f8738b089c94ead98914170943e4090c02d09605b527f5d136e503e5b8dbfdbf74313d141c080a0f3c72b2a6ab8e3b0038fc6f15be2bc5453d2a2e675a28d8b19e43ffe05c3dee5a043c842fc36740ec42479c260232e33bbad094c88eab698b2f1ecf9b4fe7bf2fa", + "0xf8ea8202ea843b9ae233830186a094000000000000000000000000000000000000000080b8806000608b557ffe6d8507ea68c6e0364d3037568d78b3af31d37ce8db07aced9e901cfdf70e3a6087527f4f253b69d9861d7f2eaeee429eef0269dceccb8fe0e49cbb1993fb0fc9dee9e460a7527fa9c15c8ea5fd540bb27e18533a2ca316fb144f0b3d5997a5ecc1faf1ae23439560c752606060e75360aa60e85360de60e95383021e7ca0b3b875f420cb59a84b220ff689beb79f77117adf89a45a576c3ce34ce8bef893a03855bb2da00a7e2c12cf63a37abd30ece74e60029268805d4a54efa78aaafc9c", + "0x02f8f183010f2c8202e3843b9aca00843b9ae233830186a094000000000000000000000000000000000000000080b8807f553221e369e554d9f8d468b6685fc094b548e10a6e085452b0def6e04bcebca16099527f16658ea8100c1b1aad3eff8bc7ebe248525351b398fb35a9fd38d1093eb979a160b9527fbaa35c547598a957d4be53da888e0917c6a9acf42a788c70f3ff6430de29998f60d9527f023d8b0778d2f8ff319ac3207ceef82b4200e3c001a02a5f503ed84d9b3c49450e40562b83e734223c8933c7c21ac97cdccc7ac75ea6a0764b9b7f91f0051741004929288fbac95f33ea09c71f1e7c08f54dc8ac86d452", + "0x02f8f183010f2c8202e4843b9aca00843b9ae233830186a094d5f95cb2c2ad15c3e1ecd2affeef4b052725746c80b8809d8b7fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ecc080a0494c128a757795452f10fd901de8be4477830fc83b60830d63eeee9f99859e4aa03a58bcfb8bf9f3b6cb52f9c34c0ed5ef7876af61af0ca5cf22219d1777e2a643", + "0x02f8f183010f2c8202e5843b9aca00843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b880add27243600060385587397f06079ebde583e2a07038939368d7a98e3cd62f78ab560a32843e15f76af2af3e60ea527fe1fedb9e8b005bcce7968c9c9d5ccdeef1f729f737f775a978a53e9122be4a9c61010a527fbbf87d3aac2c309b967eadb90a044cb1ad3516629b5edaa5b67d83d070189e2b61012a527faf82b4065c8cc001a05b8d0a094a35c463647a002a425e581b5fbd2ad133b7194bdae338f8cb554a33a067a8291fbe90c7fe8dd33fbbc943e385f21851defc20e91d08fa600766d9fd01", + "0x02f8f183010f2c8202e6843b9aca00843b9ae233830186a0941092640f765d43c24169615680cddd275d23887780b8807fb48d02eadd6481efffe7f61ce3659c7d782effbb0f97fc2697bd68569d2afce960a2527f41b298e9c2d4cf64b32303a44411d6543cb0ad74f111613f3028af184ed4c9ea60c252608560e25360af60e353606a60e453605c60e55360f460e653606560e753605060e853606f60e953601260ea53604560eb53609a60ec5360c080a065ea9b878b9000f4e0137c21c399790f0226c1c29d1243bf18ab7407de5ee346a0190718eddd26fd4e345e046328d51fe908d4065a03ee049e01dea47ffc31cf22", + "0x01f8ec83010f2c8202e7843b9ae233830186a094d99e0c67584a2252c2c1a7fd9af3cb1d842a514680b880fe6000601655ee7f35ba02bf5f1d8c4ba389708faf6f45f6869bb99e7ebb6d28cd5788166d6027f86046527ff8c6a17723acb2043b8fce34b967c824def30bc6fd1f3df2099376ee0f17e58b6066527f1b451a9e70b0e345d574ab27929c03a446bd646184d3c8c7e53722702dcf2cf16086527f1ec9313fb523398fe719fa4dc080a05151549fa5907a69b6d59a8a8738905ca7e318f38ca1631a45fd3ef587c23527a03fb908bfb6354500ffa969407913297925b724c9d37f4059ece25e530b0a86e7", + "0xf8d68202e8843b9ae233830186a08080b8807f134b0ed844476eb6e323346a83374c697a611ddbe7915daa14e1e219a7f8e5976066527f1d113dcf9d1d99f4447cfa7c7f1ee76eb63df8b642741fba8cd991afe01c60d16086527faf8ae1fa47fad7e3be5a9cc3b3418564e263e55458ec87bd75d3fbffc9915aff60a6527f0cf2776ee367cd83bb280c217b29d90b448b5283021e7ca0f3fa0279032a0927edcb0e138e02b34b5d30ed4578f3889ba7d62cc70c2674eba06d3e6fb2e13b9dfa2c3bfe42e691140818b6e7f79188b478ac16eec46c64c40f", + "0x01f8ec83010f2c8202e9843b9ae233830186a094b02a2eda1b317fbd16760128836b0ac59b560e9d80b8806000608255a17f5f587e6be73f8e59b509956eb2156b233a4733e6f397df2e4f4b5a2027e3b9c96099527eb4840a383e5135002a63dce725c5c9e40ef7eac246d44603a757ec1db5217460b9527f9dc95e36109d60d38e28a5a19011e264853d3487a50d272540f41a63671c9ce260d9527f45275e0a3575b08354fd641f1602c080a088eefe1e153c0f2351437b965d157e3f27272f1b8c7aefa27a81d5ba98b540caa02f613eea0054646e69b3f15257a7abd0eb847587b8d2f504fe0e36e9253e0c45", + "0x01f8d883010f2c8202ea843b9ae233830186a08080b880ae600060fd557f22d0e5875851f68a57d1614fdb3dafc4c1c9c7994e8fcfeab74280d20c599a326015527fa6a6ebeb6c8c63a3400a54bcb19b2ee3061cc7f0614adc03015b290131f627f66035527f80dd1eddef13d6c0d5694782e8a97f909c5f3adf2f998344bb3ba1e3a906c8ab6055527fcb93273a80d618de5b5ff5f60fc080a05c3425f1fb6213b1f160602cd209c7ad843c6b8d593687ccfe5db7c5eb2fffa4a00b97a3742a89079d1213f48fb455dee5a66b5721d5ad4596629e2ec231057ac8", + "0x01f8d883010f2c8202eb843b9ae233830186a08080b88021495d603460e25360c760e353603560e453600960e553602f60e65360d160e753603160e85360d260e953607860ea5360fe60eb53606a60ec5360a360ed53600160ee53606960ef53608d60f05360dd60f153606860f253607b60f35360d860f453600960f553605560f653609860f753602060f853608b60f953609660fa53c080a03554152ba2e8c6027181897a32a393128d43075740f6c6d8f8f838fa1ef47073a0044224dde465fd6fb5f00863f7e8f91f2cf31537fb9fca817c0c637648e5a54d", + "0xf8ea8202ec843b9ae233830186a09487b172c36dd7e571b7e31da2f4b5d0a167799b8580b8807f2e255612584176ea74af4594265daa4c75edfde9cc536a055ee4d568574bb5446025527ff87d21ff26123da6026ebb8d89c0a3e3e149d0e55d8f8781ed6e8865fdec178a6045527f31763a38acbfe89a4cfb475ca5d7b041f03a8f243c1c833219c63c1e3c395b226065527faf584ff1dcf605f1eb50218a7b0881be9a723083021e7ca08e5af7831a4ee4bc130034b5055ca674813beb6693ca7694b97ae76dce03259fa04b53d3c549ee779cca275c644ce314eae404d914988b18a238d01bc41c40dd83", + "0xf8ea8202ed843b9ae233830186a09421a168349e4653a15a2a6fdff75c3af56bc35dea80b8807f344c0506a8d6252f62e4bd5d526583a3134b0ed844476eb6e323346a83374c69601d52607a603d536000605d5560e160e75360e260e853601960e95360a760ea5360f860eb5360e560ec53609760ed53601d60ee53601160ef53603d60f05360cf60f153609d60f253601d60f353609960f45360f460f553604460f653607c83021e7ca0330fbaad42e80b87dfd307b0d20861adebed5105fa3276da861aa1c90af5f515a0486cd8d24e082b8afebba6fc3e1623a662b77dcfdad567e207dc78f0e509d27e", + "0x02f8f183010f2c8202eb843b9aca00843b9ae233830186a0949c969779991bfcb19e715950acef93757e651cc380b88060006099555f94a3600060e555496000603c55600060e3557f5cd0f31097e0acd8c311e9f757be3fcf06c51812820b53d8442ffb01871f5b866041527f8418002f1568a364760df95a1296065426c3fd34851200cc292509c524af88ed6061526051608153601b60825360cc608353602960845360d260855360ea60865360c8c001a0ab6417499643d8dde0b01a7c59a1cad9d48b4a5ec61c9fca66eb18f7456684cba0325bb6b6a55f162f59d690e194fd8102a6d907c7888094ccc7349a18dacdb8a4", + "0x01f8ec83010f2c8202ec843b9ae233830186a094c82b9ff53ff1d1edcc4b84d42682160d3868d1f180b880600060bc55600060c255f6600060115557600060cc5555600060b6553e60006063553d6000593e59600020805545600060b555600060ea55600060b955a57ff0d46fcb65c2c4ddbbd3fb301b55847d41215a903160ef114e7d7e6d6a05c0336034527f7c8cb57bb678baf948aef4a3ff12bcaa81d790fd98da4988be0bd7abf1c001a0e103f7b65cad9057340a384a89864c5727473f4cc4f3db938a8261a7155c06a7a05d214dee4794bba4ac6993bab089ff3fb90b262bdeae1f0263a3a6b6f0368d52", + "0x02f8dd83010f2c8202ed843b9aca00843b9ae233830186a08080b880600060f25589f43d6000593e596000208055587f1c7fc0d0f6e35c5fa9afe37280c410dcaee0a0aa42c848d391d8827630f56c6a60d5527f51c53091156c29c3f96078e956dfbc3e77e69d1ae75fd4e6ccc03fd4d5fbd2b860f5527f1c27775a4b6eb8b491f552dfc4481e3a6c6c7b11e4982568b0a06c4d315605a561011552c080a058c6eb5acedaa98c70ba3e39d6aaa4bbb2803202cfe992c0ed1b45616b4f1074a05422d17f7ea362507a5cf717cb852ac4e3c2b2ee76e893da47b33d7abcb18e70" ], "executionWitness": { "stateDiff": [ { - "stem": "0x290378459380774194f3dd7af473757815a18a7dcb4eb6ca719dd127ccea28", + "stem": "0x0512bf2975221f014409d8cbc3dc3ec6bff277fbb7efc6c6f4d262f4ee9542", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x06b38b0366038e1584180814dc8b2408bd40591407d45a335afedb272de105", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 124, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x094ec4ec6e66fbe9552ad81cf9d8e5fd63018fb1deb3f1766fe8f2c3f8cce1", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 129 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x0a7c2785f0d523a13542f9b73a25c414af111e90a4e38540b80d6ffd77228b", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 130 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 131 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 132 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 133 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x0ad2328d12919a5e660597c334c036fbd93f854cdd54d44cbeba8f5f0e38e5", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 134 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 135 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 136 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 137 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x0caca623e7a74d430efbd4ed7cc8469e38faa3da903ee2f8ed67303038b59a", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 138 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 139 + "suffix": 73, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x3560782eb707a3a378ef492c66a4c38f1e33daaf9ec700b31f356d3e72e774", + "stem": "0x0f8fed11fae1d84d4dd496fc46d1dc2dd5fd21865bb555be3a62313fc683a1", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x4d97c3dfe169c2aab9b20fa5bbb6f6e53e4560767896523f6e5a93e09297be", + "stem": "0x1086e08bf6cd44838444244ba0090aa26ad46296b2e9696050f7aa941f33a5", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 - }, + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x175b2a970001855eb9a3615c16ecbed38668482d1682f23d378ecb66d12733", + "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 + "suffix": 194, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 129 - }, + "suffix": 236, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332", + "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 130 + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 131 + "suffix": 1, + "currentValue": "0x0100000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 132 + "suffix": 2, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 133 + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 134 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x1a9977e9cda4b1645de215801cf2513623c97fb77f51ebc13ed1117b5a8260", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 135 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 136 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 137 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 138 + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x1e1687e53e9ec0e87578bc5927bf771dfe0ee94acaeae243c4be252d242e86", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 139 + "suffix": 2, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x84c05df768c23da56ace0e5bc7988d5dd032a1e2d8ea3c7145afc81bc0fba2", + "stem": "0x1f2b7b03407084f088fe8a8c06a76eae684890cee8a59494a9b20e4d52be71", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 129 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x8b900b79d7f493c4fb3a8fba13196cc0e76478a36b8674a6dfe6ddee66a9b4", + "stem": "0x211d581f717f816a41d26bf4a612d2818b17b4328c9bd716218b31d4526885", "suffixDiffs": [ { - "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xb8ea48b767f7c48a000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x0300000000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xad6c8b059c0aa4becd95161a2f297e0074af3048e47e671544c520eb0c4ab8", + "stem": "0x242271cf1aaa13ede9bb0a1550d6f181c6135afb92be8270221f03cc8a721e", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": "0xffa35aebed3d130a000000000000000000000000000000000000000000000000", + "newValue": "0x9253ecd75e6c090a000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": "0xbc02000000000000000000000000000000000000000000000000000000000000", + "newValue": "0xee02000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xae1b106992d792cbeb5d96559894c2a8dda72c9414cfb3532325f4633047ae", + "stem": "0x245da06b377d1e36008df031087b2b3c9d5f3e82008c511c089d4ce7e32ab6", "suffixDiffs": [ { - "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x525de5f1f51e4d4a201500000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x79793c0000000000000000000000000000000000000000000000000000000000", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xd68b7458f07bf329e87b81f099f9c3855d43aeeed7748d85d222b3a8d69152", + "stem": "0x26c6979b8c598b4fe76addf0191443d41886ae04141cbfa50c03d743b3873a", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xee9707ef2846473a6fe4e10781a3b8b225ea950a7c89fb88f01c3544a41dfb", + "stem": "0x2ba17676b1eb0b0deb1f1a88c219e840db9c8dcf45fb517e7f8a89f56b6e9a", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0xf48b4a9ad9ca0b7761b6557aa59cc184a3d14dc8b6af87741fd29e19c11111", + "stem": "0x2cefed5786cba71b7d4e06c4338e153d9da91947b5e433e6601176621d3271", "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 0 + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 1 + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 2 + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 3 + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 4 + "suffix": 4, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 128 - }, + "suffix": 122, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x2f1d35788b1b3399054ae66e75013ebe9f489054566e2b7fc0a0e8a542cfde", + "suffixDiffs": [ { - "currentValue": "0x", - "newValue": "0x", - "suffix": 130 + "suffix": 0, + "currentValue": null, + "newValue": null }, { - "currentValue": "0x", - "newValue": "0x", - "suffix": 131 + "suffix": 2, + "currentValue": null, + "newValue": null } ] }, { - "stem": "0x8dc286880de0cc507d96583b7c4c2b2b25239e58f8e67509b32edb5bbf293c", + "stem": "0x3071bdd7142c286443f6d9cc5400e1241a630bf50c92a8078119fba224eb4a", "suffixDiffs": [ { - "suffix": "0", + "suffix": 0, "currentValue": null, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + "newValue": null }, { - "suffix": "1", + "suffix": 2, "currentValue": null, - "newValue": "0x008053ee7ba80a00000000000000000000000000000000000000000000000000" - }, + "newValue": null + } + ] + }, + { + "stem": "0x3092d2f26a274b4ac37c8beb7077504260c58a7acfe93bb7925047e3c4830d", + "suffixDiffs": [ { - "suffix": "2", + "suffix": 199, "currentValue": null, - "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" - }, + "newValue": null + } + ] + }, + { + "stem": "0x31129e65d47cb64c1704ecc330c8f3d68fe6fead3483524469ac05f9ddb4da", + "suffixDiffs": [ { - "suffix": "3", + "suffix": 0, "currentValue": null, - "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + "newValue": null }, { - "suffix": "4", + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x32866b4d392c8f1395bf6e34ff355a22c01cf4600110fbb8a77104bc30ad23", + "suffixDiffs": [ + { + "suffix": 112, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x3398c507f263626d75cdc742e42f2f04b4929af3248d6de504baf952ea09fa", + "suffixDiffs": [ + { + "suffix": 107, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x34cf12073e02b752eb9e13c8d18c065449acfe1fd79e37dc562bd7329afff0", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x39629e519f1070f19f0e20a6fb3529ac884fecca6f07bc2beb8c610ee4d130", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x3c5f3a5f6f361904f0ae8db6db184b6cfa22afcdd31846bf26d6b193ca2673", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x3f88e3cf10b7360ed3fedf58ab13a539b7de57edb126a47140826cd64e2c81", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x4300c80dd0f3c8818137a1985a0d75353d77cfb8fe744b3171d151869124dc", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x46ded0ee0ce535e3d12157fb01903e215dba22dfd7624469b48ca172e9aec2", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x4c6cc3daee6c53bdcac7a0a0c65f71aa29ca9f5428c0f130e0b8da18c7222f", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x4fb04986147d8a76dddadff38143c7df4183dc5a157ebbad4a30a0cbf6a848", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 83, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x56c1f462bcf4f01e86d741284d3cc84377a5c01b30fadd83d0ebdcad151371", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x58fbc2dbea6ef8a59977071dda04fc14ce0186a4d963b8d01d5668592f66ab", + "suffixDiffs": [ + { + "suffix": 242, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x594bc797c263a3e17f1fd75e48784d39220756de4b44d78445bda355e51f66", + "suffixDiffs": [ + { + "suffix": 194, + "currentValue": null, + "newValue": null + }, + { + "suffix": 236, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x59cb29b391a815af30ca671b9fca1bd9a2a69126949b1ca4bb304eea50e321", + "suffixDiffs": [ + { + "suffix": 124, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5a2df0a47f26b2d98c24ba9be9001276d39bffb597e014b2c45af5cc03c2eb", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5a3cbf8d517e33e29958a73fb23c38fd0cb6bf10dc5f3176760f271175bd0c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5a4fc2245142a8b79cd81d009b76877241f3ca227571c28a4b7f5cb4261ae7", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5c6e42f42e98a787b1d0b9b5dc7a67732990e36ae06f59e7e7aac61836d6f3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x5fd44549c225e6a6d4ff606981e95a443a7967a209086721ae987842c410bb", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x6059e84002b2e1f6fb992e6345103892dacae2ece9f2a7b215bfbbab7e8bf4", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x632e9ca86b022aae58d16840f58d8b7212d012b3b21b30b3acdcc6a4f31603", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x6624d7cba92cbee9d0089a7b549d1c4a763d4f42d98bd4de67771ff81ae335", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x66f73b96bb94c797d9bc07dfcd0d1e1125eb2e2560fa09169849403dbd5d87", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x6f646baa0e96f3539c927afb3c44521cf7db798ecea0b816038f65e0327d46", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x758dc0ea017f2a59053b0eea74059391c4305502eacf10708b475110a0399f", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x78c037906f2b68aace9d2f7d0f7353be0cc8e821e75e017aa58409f389ef4c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x790abce6ddd8c01d5560b5cce31c78dbc565d0667d517f4d7e1e196296acef", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x7a622bcccf06aaffc2dd6f4df69453b533c4d86fa18a03a5a35ba6a97756ab", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x7e749e23c2738db67c28077abeda8fe309ebecaf40adc5d9d28a783ec75f79", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x81d60a8ef88d628427be7dfafbec6ee5ca86a108af9a18be3ff18d30aed880", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x86301eea71f9e9340a15e6df9c0c499d5d9f31c5ecdfa591f77334e05fb6b0", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8871aa15f70a40e1a823afe2deb10787ee647e036b83da070108dd91b9fcab", + "suffixDiffs": [ + { + "suffix": 244, + "currentValue": null, + "newValue": null + }, + { + "suffix": 245, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8af20d9a15c195bb78e769c34d4b5c83a4b18a287b7fb942b360f11b842dd3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8c9aa66aef4c574d745b3bfcefe56937a7dea5f3e2d3699ba7074b06c2bc91", + "suffixDiffs": [ + { + "suffix": 232, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x8cd7118a3fd8da2bd7bb4eb7e75c8cd9d67ee22868e9ffa4af5cd5312b31b8", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 123, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x910fdd9d0751f5d5d12c4c255067584bfe2c89cc17e94642947111d70d1de3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9525b0e280a6fe9aac626e5acd657082d76a4596db8f0de19250dc21ac1a78", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x96ed99018bcdb2439b664559f70a95ec161cfc6ef2b8e1b42ff61733e87f8e", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 1, + "currentValue": "0xbd5433676ccc1c01000000000000000000000000000000000000000000000000", + "newValue": "0x25d2ae9954d43001000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x98f3a9c126844522572072e9cce8634970ef5eca571e872ef8164cde5edc07", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9960c722f94f42a8e634aee2a4e613cc621e32af33e98cdebe0d60a0c5515c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9a377262d31998106d72b5e6ac531f798d185770b8af05b31246b3e0723b29", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9cd15c57e67241dd173f3fdb8f049f9dc627304a77b268ca61b34a5131e33d", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9e125a9ab93304741e85ad70b17944dfd03d356db17d29a724f3916fdcb3e6", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 107, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0x9fb6b447be8b75ed8b63023678ec7cb609f2629b74309712ef4324579daca8", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa38337ef57b6044e6d0b10438c04b7533df1d9ac55176a6d0d781c5030301c", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa6d770a1cce30be217a406ad92c4ec964bf54bb7f3da810c0e212bbf419cf3", + "suffixDiffs": [ + { + "suffix": 122, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa7ee40ee3158a6c17a5f7e39cb76cbe5c938813bdb87932b9593b330884d22", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xa84aaa726b189a530eda32611eef4de5bba5dab33f108c7e9c5cc25ea34ae5", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xab8fbede899caa6a95ece66789421c7777983761db3cfb33b5e47ba10f413b", + "suffixDiffs": [ + { + "suffix": 96, + "currentValue": null, + "newValue": "0xf3a540f1041fc87838706d6bd000d6dd8ba2193601578b89c86587921e76c00d" + } + ] + }, + { + "stem": "0xac4e1877e17f9d07b8517d8b42454da96041fe3691ad2a5014845e5628f0a5", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb2f20925052d485a02dbbc368f423145757d23ff9c5a0576ec22ac0229a8fe", + "suffixDiffs": [ + { + "suffix": 115, + "currentValue": null, + "newValue": null + }, + { + "suffix": 189, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb5d048a04818c18604b0a5b6a99642c933d96004eea2016df0da9dec89a301", + "suffixDiffs": [ + { + "suffix": 73, + "currentValue": null, + "newValue": null + }, + { + "suffix": 106, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb6210bb43ad03b80ac92b6ed97fb94e94057e730379d95af7d3321b4f2b39a", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb887e578bf784daa577f287ebea0de03389ebccb25cf28812cc8fed898e04b", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xb96c6214d3246d16faa31f11f58c7ba7411c845b1c52771be1b0aea2f64484", + "suffixDiffs": [ + { + "suffix": 93, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xbcc5243b9d6b4d69a2ab5e82d922a144f26e272b729c86617d09ca0f7c629c", + "suffixDiffs": [ + { + "suffix": 188, + "currentValue": null, + "newValue": null + }, + { + "suffix": 194, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc2a7d4c9d2005e7ebcfb8eaa0f87f885e5289afd6bf70b1fd5bb909981c55d", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc2e0308487c553079600c467413d872f5337a5a07a4c2797314e73745830ad", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc4a41f5f3fad02e33729418f39022da53368c11e75c99c764e64b2e5145ff6", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc5dd900c8c26e0b3c1980ae3870f9f2127be476bd54787b4a7dfbaa4531b28", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc8aacb03515ae23d996d168ff8eba57691303c63316ff6c61f940cde7c2b3e", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xc9a39e5c7ddf2c2f9a5553a7c73bb97f899fda3137146acf9a812c84569e06", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xca3425ab202792210d9e294c434d1e34989d9c1961e0476cb7678896bbe736", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xcc257ef9bcf9400b9a16481590496f650b04bb690e9f11ae69f490c6210944", + "suffixDiffs": [ + { + "suffix": 107, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xcf5408fa602d6dbd8e2e641d14958a88836476fd0e0a32daa0de56ead34d24", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd080375a20f69585efaa6551d5729f463fae6f0068e9c76eafd1be0996574e", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd0f548ba085d0b3a26d0ae81e8244c2d73fdf3bd3009a285d3fada3b14feec", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd3987c8f556bc5c377ff52b171daa1cb83d05b4d95f2b013f5b560d1be8df7", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 83, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd424261571b4f0e6783482c59f72b1fb0ad54694d614133baad31a254d89f3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 73, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xd81866238d9af46480fc7ed037df37e5d4d82cb4f2ee8abadd9579aa756762", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xdd886b61bf975565e8cc68c02e6942900162dfbe3aad5f544eee6cf0c98339", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xdf67dea9181141d6255ac05c7ada5a590fb30a375023f16c31223f067319e3", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": "0x0000000000000000000000000000000000000000000000000000000000000000", + "newValue": null + }, + { + "suffix": 1, + "currentValue": "0x644e02368fce0d0a000000000000000000000000000000000000000000000000", + "newValue": "0xc8c57df82e98030a000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": "0xbc02000000000000000000000000000000000000000000000000000000000000", + "newValue": "0xee02000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xdf72f4afaa53b82fb0445e6261ff1d7ab5da0525649ccc7db9d5f06138f052", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xe13ec10bedcd8a59ee1ae190428ebae9d88c12061f06b8d7128e8c9a8b6961", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xe4aea3ebabf6e755469f194e73c28e04ce453e64c490f9e561a12d1ff7ea20", + "suffixDiffs": [ + { + "suffix": 123, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xecc45ade2962a8109bdd83615b81f8b06fa3895b63a91ebe98bc61da989e7f", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 1, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + }, + { + "suffix": 3, + "currentValue": null, + "newValue": null + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xf3a5f5c3cbb4e0c8437fc59c4ab4de0831b69bc7454685d27918ef454ba657", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xf9db1b27e3359ea9bf0c49ea0a607012bc4f584655d93ddec04e01d631ff5d", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": null + }, + { + "suffix": 2, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xfcb3a619d36da42369f50a9bd41371c55ab37a73dac6caa505383f4636f2b0", + "suffixDiffs": [ + { + "suffix": 0, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 1, + "currentValue": null, + "newValue": "0x0000000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 2, + "currentValue": null, + "newValue": "0x0100000000000000000000000000000000000000000000000000000000000000" + }, + { + "suffix": 3, + "currentValue": null, + "newValue": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" + }, + { + "suffix": 4, + "currentValue": null, + "newValue": null + } + ] + }, + { + "stem": "0xfea5fe01f1910c3e2923c38b7395ce356b249a9a6b973fdea7e42b47b40745", + "suffixDiffs": [ + { + "suffix": 173, "currentValue": null, "newValue": null } ] - } - ], - "verkleProof": { - "commitmentsByPath": [ - "0x18f21df848fbde27fbe0f8a231b4561ed8993588010b01b6e076cac910b87c42", - "0x0520fa7a1eaa72f303b4bd5edfdc58235942f3a48a88ceb669d24ddb85586f55", - "0x186e9dc2f984e5db103680adbfdd83c2f6df0376daae0384d6bdc63d3ee1383b", - "0x32a41cdc3f91731a5ff0239e98d63b7e63880dda4a2bce20abe615b8bdbb81ae", - "0x4b22c6bdd8233349c3966c44fe7322213431df9fc3e3cc6fce0c7d7fd0fb0c22", - "0x56653741afebf8e9ed40e310ba9868bf8736e50463ad8d0a9fd700f2a35a7570", - "0x3c0d513d31e51867367010464d08a84a85c975528f7aaf1f059c0f2d5a8b90ca", - "0x10dd60b1df160579af0d2667dcf6358e340aeef59ad6b00200f56ee8af850b39", - "0x2dcb916d0a9a01ba6254922ae3492284c46345e3e7e0fc94f4fc0978ba0e4b00", - "0x192f580695485d9fe38610a4d3d1af7ef4daaa5b5a512e6e9574191ccfd02670", - "0x08b9cb110253c94d40df41d56745b8767b1ddac66e3d378f04fed2b007f5db7b", - "0x1cfb1a085e241a26fefbcd19e5c8fa14a5abe38eff6d78a7671475e74c900ec8", - "0x63be1f65657faa7d706b908d3b3b3674f5d8d858b790480dd8a4d9c2ce9369fc", - "0x08652f5969f0d7f893dea8a247dbc70bcc10a54ad86684cd9f15288b056d5e96", - "0x2758d93b5d57c8bb8985b8245ebc4b9f8c3dd1e376119a1a99416cd16c4d459c", - "0x38af2cefe233d1f2c0a8d116fafa67725c9201d65e3a5b7b6e2c615c13a5eec7", - "0x0c3dec1d8094db18271c95c0292877dfe14076d5bd965b7da4b090f8e0c3cf26", - "0x2ab4e41a5e97902d093bd194d7e9fb15d7b6866d083cc2cde9b1e60235d3e759", - "0x1ea2625ea1d3b62c540749ebcb1daa2eefda6478d1958c067e8d65bf473a15e5", - "0x30a3c5b308656a1ff8fd9cb982cdcd7050a477459d33da41e312615af4028569", - "0x073afcac9107622d7e81726ef59c8e30f7c0228724ab6ca437d34ad7dd89169d", - "0x5ff714b854edbf2e5eb9f994ca2ca4ff30fdef76d62091c9920463487c91fe0c", - "0x4deb8879de6ddbc6c99dd321e1b26b70fbdb2fe080d8244a2b9e1ddb63ae4fcf", - "0x2644e2ebafd0c4b847fe534f833d79899e9dbaedb3e7b0715326ac3f8de5a2ef", - "0x09eb0175311484f786ba1e12f5dd80823fb9bb806de46cac8f10b72b91019b75" - ], - "d": "0x06110992b049b61a7543a1a388a08b7aa967580266b12b1880dfd8b8aa1e2aa3", - "depthExtensionPresent": "0x181818181a181a181819", - "ipaProof": { - "cl": [ - "0x7201d3474df7071d5b08628720df125d3c576b7310a99a67e57c5d364f442aed", - "0x5eb72934160412aba09e9f28d911577942c171cf0921c016eb7887aa8ae0ce05", - "0x69a486db0afb403ea7c64d00bdde39e53112a41fa48fdc1403a392f12a5dc02c", - "0x461f0f169a348da80089c2f59d99a2a372de7be4f9b80c734d87b951b51ef39c", - "0x66a53133a17a72f39492d3430fb8b476bbe3c56fbfe59c44bdfca4a9a3a5e99c", - "0x497cc3587d1994f6ae21b2e7ffd97f5505c9aaaa9c6288267dc8e1c326b8118a", - "0x1cb46f70017c2f54571b8620e237cb3b94b41e37894c29a3fcb1685ffcd56083", - "0x5a249d17a2257c122743ec27afbb7624e52819c6ef6c6d081d4c023012931381" - ], - "cr": [ - "0x1be4988b202837e86a2e3ba61ba5fc62e4bb36bebad554193df623270ef0c9fd", - "0x2120506addcff94106a227c0ba2812cbc21f7003fac2643d4ec2b1ed8a9df858", - "0x6a0a5aa53dbf13b873669715f5a8245d76dc41bfb6c9a002347ece4cc8aea838", - "0x0f2558cd2bdd186be9d721a24679f1d92c599abdf25ac4b1294df2f090be3091", - "0x0a3a12eebd6234289697b747d242fa4ea769802c5a28c739534324f070fb7102", - "0x5984c0dd556fca9e7e7335eb03670ca08787292b0eb9de624ce88f421d531f8e", - "0x47f7f6d5b603026777d3f57fa1657ba257df66adf890ea4d5da454b44816ebc7", - "0x23d9bd0146baffdef1fac45f9b573596a15f72ae0f84aa2b82689ea2a6c95f2a" - ], - "finalEvaluation": "0x0fb5674a2d8693294a5cfc0f95ae7ce5a6c4112255dc7a25afd76446863612b1" }, - "otherStems": ["0xf48b4afcf49fabd63c9ea130cd708c6f1a1c2cfd8329c9265395a00f670658"] + { + "stem": "0xfef6c89561f11284efdc38d2f8a362d63149071b1e929bef2f199ca15be4cd", + "suffixDiffs": [ + { + "suffix": 125, + "currentValue": null, + "newValue": null + }, + { + "suffix": 174, + "currentValue": null, + "newValue": null + } + ] + } + ], + "verkleProof": { + "otherStems": [ + "0x2b0666d65c693f59a7d7e5c9d366c0af0f5918531699a1b36a864575d44b44", + "0x307e2d1d6b9252fe6017a1577d27eee29a32314e68499b600bc1dec125bdf3", + "0x31c3393ffca13d19aa27b799d5bb93777f75c50c08548beca9f789e825f8d2", + "0x4cad9c2d704a188facc52755cdc62bf947db397516ddd0025541d917290828", + "0x5a3e9eed1c04e8be7598cac97578a4ac1361f7300434437c15238ec4bffdf2", + "0x75a259f01b2e7f18d0cbc1d6c891d3acdb1f1f304f25cfc7d81a67215c4a84", + "0x8687c46a9c42f9560a190088d897602af1428c9675f11c557a580ebe9d20a5", + "0x8ca368ee3a41f56d9d636c74a2bc1fb89204dc338a261f982e043bdba46e25", + "0x9868d698b6605c6a1c0ace08cd261f6c8aa6cce1ad2926efe10d21c7bae806", + "0x9956331ae1b3ab76078bb941178bf8cc25dfd2e3f83650ed7305a6fccab9de", + "0x9f1e458ed3c7afc24285cc084733dc38657c573fdee2963873100dd69313b1", + "0xa6f677f1eb3c0fb04e197c317130977a4f8d4ae24ab71ecf3623a36949cb62", + "0xa78b8d5c04be31cc92fe38110c34b21da3e4a33a3b32494e200bbab91a9ac1", + "0xb59831880bd5aeccd94621d5060eb04e301df6cfadf654946332997791b4c9", + "0xb642d1637a669976bb1a3c78b352f7e7fc506acb7286cf507d2e31a2d697be", + "0xc8d0efd70a010c68da50d7727f54b388d945214acf03d6357e65e980c5265e", + "0xc9b21ead525cbf5a94f32949b5b20216d5870e0024c8e73a6ef364e546c964", + "0xca3f471892ec310cb6d062ad97856c811d81b46bb00343d39a777dc313b5c4", + "0xd092de740adcb52108f42fc495a04faad6724d07e2c65febec47e9d765a08e", + "0xd8f02c1b8a44c5ef8735974e10bb7faef7b618554bfc8e7b5f27899a85d1f9" + ], + "depthExtensionPresent": "0x0808081010100808101210080810121010090810090909100810080810101009101008101009090908080810101010091010100810091010090910081209091010100910090908121010090910101010101010090909101009091010091012101010101010101010", + "commitmentsByPath": [ + "0x01199557646012cfa7d03df58183e2ce851f2c18e20d075cb7d8c85546e755f4", + "0x46c5faaecf65c9823b7449701968b1a7ad5d6bc04be964466aff85655f9101be", + "0x3aa4441b6c89365e21093ad98d32f286075e8ce26a907e99f1907e2c7920baff", + "0x37e9a7aec30a2f9512e1e3c4a1acd943e9d12b5d8a34e1821577a3e12402b33b", + "0x427b4a9ef0138f38eb2aa1004b32318028f41c34b3724313b73b4bbb3c7fb2a9", + "0x62dbc83963aef42b5c6696695bbbf01e92ad6d0db9e565b687bc145b463ec46c", + "0x1851f9391eca8b89a1f1fe153b3587a467abf10f9ecb2b796356b361e6605ec9", + "0x529a76c37776d20f4af070db3c191866f2f43d87c718d910dc6b5c89bc0a5459", + "0x3f16cfc6eab0330d3ae71c498bc0981c8e17d2cbef0d5a45a911b892bd45cba2", + "0x65e9f1920bb62cdb0cf51efafaa162dfa0e4153f8cc309f9aec67f1b3c2dcb7b", + "0x0cc8a0e6124391d684d7b6ec322140e59e998acab7b05bc17160cbc6ab5e4455", + "0x37cdeb1feb98a341cc1e72d89db97596a63a932607427fc128bedba5ed2c22e2", + "0x1f8018a60bf452f9925da38bdd039db5e6667a0d5f9b2328139f7d291f4aca0d", + "0x2361e30c77b5b1b5da73a446e7d6e78d67fc93e622e14aea409c34167ed34ff4", + "0x0e61ce0dc0366a7445ca583488912c5e26e21d69e768ceb2d3ff3194f166521e", + "0x32cfa7e52600376abaf1bcfaf5603c311c6c3471defe66259fccbd3bd3005afe", + "0x1c9bd61333adb8f883866d4ebd33d2ec82786e6d6861ccaf95d54c9609841c0d", + "0x4b9e6076d475be65155e3d05e34265c447f0743d46fa8a8842ce9e8d3302bf93", + "0x254f7279536e199e89484d67f772a2b410dabe11a961b88f03bb259243e3f69e", + "0x0aacf6eb2c818ddfb84d4eef00b486d945b536a316d3631f8e10b55172257945", + "0x2841830305a4b148416f4a46e23d1c3e7733a9c380922dadb5ad398df2d852a1", + "0x14929fcbcc77ff4e60c3ce8281421589e4958ed0ffcc70c6172d7b1010268c40", + "0x0d7a506c35e95ca6f482ae1b9641efb198635e219f874e43ea5f3acbaf48473c", + "0x430f5531e6770d1a78456b12bce8f4b32c42558a04a7be9ed66cda52e0775d21", + "0x1d6aba0ac51f8d7c4418baf5d908fa520bf4701c2e5b2903c344baa5105b2585", + "0x3f01e5ca24e0903981a0cbbd0067153d6c7129852477ba1f31e1c093fb9b65ad", + "0x690e98ec45cf5d9bf56df3cb85ea3975c357925d2ebee811ea2ef00322ee322f", + "0x2aa951abbb03d98ebd822c492d577e7f8617fae2f439e26ab1313e479c68824d", + "0x2c02f17363947895ce377823e07fe5d5c64b6ca0e4c51d6b6a8419fa6a708c08", + "0x5ff1c4d4883f22678fd589e34edac1c8fd6f154c6621a61fdc660989cb72f056", + "0x3aefdf17895c4d636451e49bd489fd5735701aebd3a1a9dd5a815827ef0e824e", + "0x352fef2b2a4429bda58710de7a8e3a7d605127ff9da0b001998b9eac4c084244", + "0x0c2d895c8bd298ba965414a8bdf0694980938a27aa0de8b59b81fafa60ee111c", + "0x244a95b14754daac8bb87af1e04a6344eac954de41cb429753d77a63a655530d", + "0x31d545fba02d0568b0b36225f05f7088e819238158493164bb6818a520c4b167", + "0x531736c74afa4fd3fff3bad6c5bbb95b8b68f0f7ba3c65dd689ca1f5d96f23ef", + "0x25bee57af20fc8a1e3900d515226c0d0abf48b013d660a869d7c0b74f5731e7c", + "0x23f8b7161eecbf64eb8ad567b5aaeaa4aa1144ecd50ce06821537bfd2d415619", + "0x0931f8461f83ea58b33a0d8ea0961391d7664f7c0085f4b299a944a7c8e466d1", + "0x3064e3d6b3f8e2cccba57dc010f652e8cd5ea8a6f91c50ff2a8505c9192e6fd6", + "0x3726fb35ffde02e6a36ac85bfc5910bf4affaa3a6d4d8f0e9a81a8e6737b4f8f", + "0x24602e77b76788c5c1f51942fcbf54ed3d8f3ee118a399f275dca4185bb95ad0", + "0x1abb09195dfc0a37a2abb51bc2e2b791b5ca7d9484aabf6b83eda1e97aa3db17", + "0x3e4e0080dbfec64fff7fa7b7f30a5f9867b1aa28cf79b09542ea8ecc52952375", + "0x19cbdc4a103f05b555cee260469142e8a34a5717e321ed74fa7a62e50b65c9ce", + "0x64aa4ec790c5c8a1b0945ffb88ca8b88da4fdb0297b9b65b696f3da999f28c46", + "0x6019069e6b808e2c30e3ac17fc4942a2194d3be7097a06768b03a985a369da71", + "0x474f20cb18aeb879742fbdfcc015118f5b36f93389a314040415a8b01c533c6b", + "0x2005252cc4226fa20774d566874e0398e568894934aa6452355620d03ecff29e", + "0x14229c7ac78d277f9d8565b4edd7659dff181c72e7735b1d8fc21a8b5f95d2d5", + "0x3bb63594faf0265fbae4501060c6f917eae9ade1ff3dbca860eacb8826616a28", + "0x694df494913aed82cf7a4b15b0b4f8284ed46ca963177713bc8738072c9fdafc", + "0x47baccfb1043a41567004a5aafe28e00b6902092e42af59362171a31c5b3d720", + "0x335b2d28993c36130a6cf3d14dc06015e8d3126c2a32ee85eb83098e1028f71e", + "0x5f06f874808fb17e13d839fa2069a399d9e2e5960baabeea294732e646eaceb5", + "0x39e92e43a6cf68ba5fe29ae873c83670b434ba3e7b645ca35c44f14421ee95cb", + "0x69fdfff6c225f5f0631ccca3fbcdff3574106a23310d288ddd142bd3bc23eb65", + "0x288b90416e8d13b029f5dc498c46d6966388d227e0682f9c8a150dd0b2228a67", + "0x0747e20676b865a559fb6284d4a38f5ea2e2222842186c0031c8bf9ff4cc27ca", + "0x72167fa9d85e5733eec80323e11625294ef4de12c813179dfe906ad22bb0229d", + "0x2f9ec2baf178082fa7c33a7021476642b761e03052dcc775e480939cba1237e2", + "0x73d3c2c2d54273b9cc41fcd84b8fc7579176f8244127ecdfc018b66da6122c99", + "0x59857c8fd15a33f6b94b5da737729f0d78fb2288f4ac06393cc7cf8714ca1923", + "0x35346be2c112a07ef69aa62bb02a3a2f817a32c91f4e88e3a204b9339575347d", + "0x4793b69a54c5568a699b4cf13184fc9a38992f4ae2e71e0bea63b7b790e39a91", + "0x00bac75a4a4d681858a0208707207832484f100edaa8ccee7301f48566ebf1a5", + "0x47d17a51003a73347b659182c9be702753ff285845921440a3a4b285a071022b", + "0x172e4b0ebdb0da24f90f60570a7db2fd3a47bacca549eba99a9cc1d40b26732e", + "0x58917df0d0901cf067af992294f5487e64225cb3137e85d071c4d501b2c2d888", + "0x6949014ab1ab4a6fb597650c9d606061233818c05320de08639617b421b71351", + "0x1aac937c03ceb3fd76d138e7ff323847ca7031b1148583d47a4f0c9c2768ac58", + "0x1795bbbe3c75f245a6eb020010db6f077f3f30133ea0cc263819d252b1d6d89b", + "0x5a5c5c655811a3019436f15fca4ee8638df1ead43f2d1aa8813a829398fd610f", + "0x29825f7282d2857e272790c4dff4179567ede081abc846a42723f5a88b385ee3", + "0x4bb2c2db2a43027b4fc316dd850f16d648f7d941a33ecf1f63af986e4079366f", + "0x6160d57744eb2a58458d744253d94594e91fb3fa42d6360c83208368123a1de6", + "0x6a9463d0c8a3160cb5ef0ee6d76c20b99f32ac327b5ea5dc424ae6db28b59f60", + "0x0553079e00b90ff9ad35980a42d6364cc25ce03a66f87f51447437c3010fe1cc", + "0x4115c344d113c884ecab66a2506cdaa0d721aa8e2ac29989e9f47bab0172b999", + "0x67ff748cd92ba6161c0d35698c24df64fd724e70981714173bf6d3b9ded06ab5", + "0x14cec786771992338db76d054d8e0dfe9154eff89ced6f0c5f5e4ae4ec211353", + "0x003ad8815f835e9abdbf548de77607d6f257275d8c8644bebe1b04d179960deb", + "0x648e1ce096a694eac74a5dcd17923cedf0f1e34f6355955274515797802a8381" + ], + "d": "0x354c2d2f39b0e47290b752043b724864154117120477748f012aed939da8a19a", + "ipaProof": { + "cl": [ + "0x1d241c125f6e2590909746f39cd93ed8347014a9015232de6c1e3446c094acf8", + "0x521b7520e11608865c43909b66a03378078376ce948589d83981807decfc8d22", + "0x2bbd0825725d7f411914ce99cbf9d9f7c93f35842c39443c27c9309327c7e1bc", + "0x447ba4f8d604d63308942b0a555e79e5be332544501a3c73fad9b80ce7c8ada6", + "0x69f58232134e771cdc98ef29e0e7dd803b37aad76969aa93e2667a6e04b6de17", + "0x087907e4c70dd98d72d7a9b5764781210c563fb73c1756a2b2d03c72fb0b61de", + "0x14543308ebd9f2401a63a4dfe691d558fbdbfc7066d99cb1dc8ffd4d914db998", + "0x170e27ca863cfac63545c64d3b6381672a19430d3fdcd66ad4b682b04b0656db" + ], + "cr": [ + "0x41108a82a07d24400ebdae0dfe00bb9b12d630ad079554e377b66b658b51174a", + "0x3dd720a87ec6c348ab25dc9e79e7e035597823b2f7dce96a0d0c9881dba1657e", + "0x254bf6160f481ab222999772d177541ca9938bd791671263d1fcd886ddaa3902", + "0x6dc8a24d0b06a559b1bdf160b564d3199dddbef461d91766a55555ad9735a5d6", + "0x64fab74dc9dc68d3f1789386dc5413803591aee4270829b0a7e703fbec799b7f", + "0x16c8329759af37ed8c8c0cb5201a5d9356c892ad4ffc7e9aa670c4f4f64e4594", + "0x2483b303c03c8943d6b55df7b6307e534d3d919ad545ffe7aa099ff1730e47a4", + "0x2aa0a2593c1d3d3d5d39e1d7b665feda7c92952bad7df1c8feaab9809faf5fc6" + ], + "finalEvaluation": "0x0e1e1acaa1b2e38bed96d0ff5cd2d2980faceae8cefb49f9743849ba5200ce48" + } + } + }, + "execute": { + "blockNumber": "0x62", + "parentHash": "0x2f08a1461ab75873a0f2d23170f46d3be2ade2a7f4ebf607fc53fb361cf85865", + "feeRecipient": "0xf97e180c050e5ab072211ad2c213eb5aee4df134", + "stateRoot": "0x1817126b2e3f5bb9a77835e46cb42ce46f35968d0fcf2ef2b6678c7d826e49dd", + "receiptsRoot": "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "gasLimit": "0x1a3c27b", + "gasUsed": "0x0", + "timestamp": "0x66191454", + "extraData": "0xd983010c01846765746889676f312e32302e3134856c696e7578", + "baseFeePerGas": "0x13a0", + "blockHash": "0x9e0baab3628fb096ca0d0903c40d782af008b851b9e0309b1fb861335a3f22c4", + "prevRandao": "0xede66b8478c3b7623206885a59e297cb4722fa7b67fda2cbc9be53e7690e6fc5", + "transactions": [], + "withdrawals": [], + "executionWitness": { + "stateDiff": [ + { + "stem": "0xab8fbede899caa6a95ece66789421c7777983761db3cfb33b5e47ba10f413b", + "suffixDiffs": [ + { + "suffix": 97, + "currentValue": null, + "newValue": "0x2f08a1461ab75873a0f2d23170f46d3be2ade2a7f4ebf607fc53fb361cf85865" + } + ] + } + ], + "verkleProof": { + "otherStems": [], + "depthExtensionPresent": "0x12", + "commitmentsByPath": [ + "0x4900c9eda0b8f9a4ef9a2181ced149c9431b627797ab747ee9747b229579b583", + "0x491dff71f13c89dac9aea22355478f5cfcf0af841b68e379a90aa77b8894c00e", + "0x525d67511657d9220031586db9d41663ad592bbafc89bc763273a3c2eb0b19dc" + ], + "d": "0x5c6e856174962f2786f0711288c8ddd90b0c317db7769ab3485818460421f08c", + "ipaProof": { + "cl": [ + "0x4ff3c1e2a97b6bd0861a2866acecd2fd6d2e5949196429e409bfd4851339832e", + "0x588cfd2b401c8afd04220310e10f7ccdf1144d2ef9191ee9f72d7d44ad1cf9d0", + "0x0bb16d917ecdec316d38b92558d46450b21553673f38a824037716bfee067220", + "0x2bdb51e80b9e43cc5011f4b51877f4d56232ce13035671f191bd4047baa11f3d", + "0x130f6822a47533ed201f5f15b144648a727217980ca9e86237977b7f0fe8f41e", + "0x2c4b83ccd0bb8ad8d370ab8308e11c95fb2020a6a62e71c9a1c08de2d32fc9f1", + "0x4424bec140960c09fc97ee29dad2c3ff467b7e01a19ada43979c55c697b4f583", + "0x5c8f76533d04c7b868e9d7fcaa901897c5f35b27552c3bf94f01951fae6fcd2a" + ], + "cr": [ + "0x31cb234eeff147546cabd033235c8f446812c7f44b597d9580a10bbecac9dd82", + "0x6945048c033a452d346977ab306df4df653b6e7f3e0b75a705a650427ee30e88", + "0x38ca3c4ebbee982301b6bafd55bc9e016a7c59af95e9666b56a0680ed1cd0673", + "0x16160e96b0fb20d0c9c7d9ae76ca9c74300d34e05d3688315c0062204ab0d07b", + "0x2bc96deadab15bc74546f8882d8b88c54ea0b62b04cb597bf5076fe25c53e43c", + "0x301e407f62f0d1f6bf56f2e252ca89dd9f3bf09acbb0cca9230ecda24ac783b5", + "0x3ce1800a2e3f10e641f3ef8a8aaacf6573e9e33f4cb5b429850271528ed3cd31", + "0x471b1578afbd3f2762654d04db73c6a84e9770f3d6b8a189596fbad38fffa263" + ], + "finalEvaluation": "0x07ca48ff9f0fb458967f070c18e5cdf180e93212bf3efba6378384c5703a61fe" + } + } } } } diff --git a/packages/statemanager/vitest.browser.config.mts b/packages/statemanager/vitest.browser.config.mts new file mode 100644 index 000000000..e39cfebc9 --- /dev/null +++ b/packages/statemanager/vitest.browser.config.mts @@ -0,0 +1,18 @@ + +import { configDefaults, defineConfig, mergeConfig } from 'vitest/config' +import baseConfig from '../../config/vitest.browser.config.mts' + +export default mergeConfig( + baseConfig, + defineConfig({ + test: { + exclude: [ + ...configDefaults.exclude, + // Importing pedersenHash through wasm failed. + 'test/statelessVerkleStateManager.spec.ts', + // [vitest] queueMock is not implemented in browser environment yet. + 'test/rpcStateManager.spec.ts', + ], + }, + }) +) \ No newline at end of file diff --git a/packages/trie/CHANGELOG.md b/packages/trie/CHANGELOG.md index 1a5f7d48d..f6d0ea01c 100644 --- a/packages/trie/CHANGELOG.md +++ b/packages/trie/CHANGELOG.md @@ -6,6 +6,19 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 6.2.0 - 2024-03-05 + +In the hope that you do not have yet integrated: we needed to remove the new more modern async trie iteration with web streams functionality (new `createAsyncReadStream()` method) introduced with the `v6.1.0` release - see PR [#3231](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3231) for context - since the related Node.js web streams API import caused relatively severe problems for all upstream libraries when being used in the browser. + +So functionality has been removed in PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). We hope we find a good way to re-introduce along with the next breaking release round without limiting browser functionality. + +### Other Changes + +- Add optional `partialPath` parameter to `trie.findPath()`, PR [#3305](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3305) +- Add export for `Path` interface for better TypeScript integration when using the `findPath()` method, PR [#3292](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3292) +- Improved zero-element proof behavior in `verifyProof()` method, PR [#3047](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3047) +- Fix a type error related to the `lru-cache` dependency, PR [#3285](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3285) + ## 6.1.1 - 2024-02-08 - Hotfix release adding a missing `debug` dependency, PR [#3271](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3271) diff --git a/packages/trie/docs/README.md b/packages/trie/docs/README.md index 4df5257d9..82129244d 100644 --- a/packages/trie/docs/README.md +++ b/packages/trie/docs/README.md @@ -19,6 +19,7 @@ - [CheckpointDBOpts](interfaces/CheckpointDBOpts.md) - [CommonInterface](interfaces/CommonInterface.md) +- [Path](interfaces/Path.md) - [TrieOpts](interfaces/TrieOpts.md) - [TrieShallowCopyOpts](interfaces/TrieShallowCopyOpts.md) @@ -39,7 +40,6 @@ ### Functions -- [asyncTrieReadStream](README.md#asynctriereadstream) - [byteTypeToNibbleType](README.md#bytetypetonibbletype) - [bytesToNibbles](README.md#bytestonibbles) - [compactBytesToNibbles](README.md#compactbytestonibbles) @@ -72,7 +72,7 @@ #### Defined in -[packages/trie/src/types.ts:129](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L129) +[packages/trie/src/types.ts:135](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L135) ___ @@ -109,7 +109,7 @@ ___ #### Defined in -[packages/trie/src/types.ts:23](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L23) +[packages/trie/src/types.ts:29](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L29) ___ @@ -133,7 +133,7 @@ ___ #### Defined in -[packages/trie/src/types.ts:30](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L30) +[packages/trie/src/types.ts:36](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L36) ___ @@ -173,7 +173,7 @@ ___ #### Defined in -[packages/trie/src/types.ts:99](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L99) +[packages/trie/src/types.ts:105](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L105) ## Variables @@ -183,30 +183,10 @@ ___ #### Defined in -[packages/trie/src/types.ts:136](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L136) +[packages/trie/src/types.ts:142](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L142) ## Functions -### asyncTrieReadStream - -▸ **asyncTrieReadStream**(`trie`): `ReadableStream`<`any`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `trie` | [`Trie`](classes/Trie.md) | - -#### Returns - -`ReadableStream`<`any`\> - -#### Defined in - -[packages/trie/src/util/readStream.ts:69](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/util/readStream.ts#L69) - -___ - ### byteTypeToNibbleType ▸ **byteTypeToNibbleType**(`key`): [`Nibbles`](README.md#nibbles) @@ -558,12 +538,12 @@ NOTE: Currently only supports verification when the length of firstKey and lastK | Name | Type | Description | | :------ | :------ | :------ | -| `rootHash` | `Uint8Array` | root hash. | -| `firstKey` | ``null`` \| [`Nibbles`](README.md#nibbles) | first key. | -| `lastKey` | ``null`` \| [`Nibbles`](README.md#nibbles) | last key. | -| `keys` | [`Nibbles`](README.md#nibbles)[] | key list. | -| `values` | `Uint8Array`[] | value list, one-to-one correspondence with keys. | -| `proof` | ``null`` \| `Uint8Array`[] | proof node list, if proof is null, both `firstKey` and `lastKey` must be null | +| `rootHash` | `Uint8Array` | root hash of state trie this proof is being verified against. | +| `firstKey` | ``null`` \| [`Nibbles`](README.md#nibbles) | first key of range being proven. | +| `lastKey` | ``null`` \| [`Nibbles`](README.md#nibbles) | last key of range being proven. | +| `keys` | [`Nibbles`](README.md#nibbles)[] | key list of leaf data being proven. | +| `values` | `Uint8Array`[] | value list of leaf data being proven, one-to-one correspondence with keys. | +| `proof` | ``null`` \| `Uint8Array`[] | proof node list, if all-elements-proof where no proof is needed, proof should be null, and both `firstKey` and `lastKey` must be null as well | | `useKeyHashingFunction` | [`HashKeysFunction`](README.md#hashkeysfunction) | - | #### Returns @@ -574,4 +554,4 @@ a flag to indicate whether there exists more trie node in the trie #### Defined in -[packages/trie/src/proof/range.ts:408](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/proof/range.ts#L408) +[packages/trie/src/proof/range.ts:411](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/proof/range.ts#L411) diff --git a/packages/trie/docs/classes/Trie.md b/packages/trie/docs/classes/Trie.md index 3e4acf5ac..f69e040cb 100644 --- a/packages/trie/docs/classes/Trie.md +++ b/packages/trie/docs/classes/Trie.md @@ -21,7 +21,6 @@ The basic trie interface, use with `import { Trie } from '@ethereumjs/trie'`. - [checkRoot](Trie.md#checkroot) - [checkpoint](Trie.md#checkpoint) - [commit](Trie.md#commit) -- [createAsyncReadStream](Trie.md#createasyncreadstream) - [createProof](Trie.md#createproof) - [createReadStream](Trie.md#createreadstream) - [database](Trie.md#database) @@ -67,7 +66,7 @@ Creates a new trie. #### Defined in -[packages/trie/src/trie.ts:99](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L99) +[packages/trie/src/trie.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L85) ## Properties @@ -79,7 +78,7 @@ The root for an empty trie #### Defined in -[packages/trie/src/trie.ts:80](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L80) +[packages/trie/src/trie.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L66) ___ @@ -103,7 +102,7 @@ ___ #### Defined in -[packages/trie/src/trie.ts:566](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L566) +[packages/trie/src/trie.ts:738](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L738) ## Methods @@ -140,7 +139,7 @@ await trie.batch(ops) #### Defined in -[packages/trie/src/trie.ts:967](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L967) +[packages/trie/src/trie.ts:1139](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1139) ___ @@ -162,7 +161,7 @@ Checks if a given root exists. #### Defined in -[packages/trie/src/trie.ts:305](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L305) +[packages/trie/src/trie.ts:458](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L458) ___ @@ -179,7 +178,7 @@ After this is called, all changes can be reverted until `commit` is called. #### Defined in -[packages/trie/src/trie.ts:1277](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1277) +[packages/trie/src/trie.ts:1306](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1306) ___ @@ -200,25 +199,7 @@ If not during a checkpoint phase #### Defined in -[packages/trie/src/trie.ts:1287](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1287) - -___ - -### createAsyncReadStream - -▸ **createAsyncReadStream**(): `ReadableStream`<`any`\> - -Use asynchronous iteration over the chunks in a web stream using the for await...of syntax. - -#### Returns - -`ReadableStream`<`any`\> - -Returns a [web stream](https://nodejs.org/api/webstreams.html#example-readablestream) of the contents of the `trie` - -#### Defined in - -[packages/trie/src/trie.ts:1182](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1182) +[packages/trie/src/trie.ts:1316](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1316) ___ @@ -226,13 +207,15 @@ ___ ▸ **createProof**(`key`): `Promise`<[`Proof`](../README.md#proof)\> -Creates a proof from a trie and key that can be verified using [verifyProof](Trie.md#verifyproof-1). +Creates a proof from a trie and key that can be verified using [verifyProof](Trie.md#verifyproof-1). An (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof contains +the encoded trie nodes from the root node to the leaf node storing state data. The returned proof will be in the format of an array that contains Uint8Arrays of +serialized branch, extension, and/or leaf nodes. #### Parameters -| Name | Type | -| :------ | :------ | -| `key` | `Uint8Array` | +| Name | Type | Description | +| :------ | :------ | :------ | +| `key` | `Uint8Array` | key to create a proof for | #### Returns @@ -240,7 +223,7 @@ Creates a proof from a trie and key that can be verified using [verifyProof](Tri #### Defined in -[packages/trie/src/trie.ts:1035](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1035) +[packages/trie/src/trie.ts:269](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L269) ___ @@ -250,10 +233,6 @@ ___ The `data` event is given an `Object` that has two properties; the `key` and the `value`. Both should be Uint8Arrays. -**`Deprecated`** - -Use `createAsyncReadStream` - #### Returns [`TrieReadStream`](TrieReadStream.md) @@ -262,7 +241,7 @@ Returns a [stream](https://nodejs.org/dist/latest-v12.x/docs/api/stream.html#str #### Defined in -[packages/trie/src/trie.ts:1174](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1174) +[packages/trie/src/trie.ts:1211](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1211) ___ @@ -283,7 +262,7 @@ ___ #### Defined in -[packages/trie/src/trie.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L272) +[packages/trie/src/trie.ts:423](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L423) ___ @@ -309,13 +288,13 @@ A Promise that resolves once value is deleted. #### Defined in -[packages/trie/src/trie.ts:406](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L406) +[packages/trie/src/trie.ts:559](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L559) ___ ### findPath -▸ **findPath**(`key`, `throwIfMissing?`): `Promise`<`Path`\> +▸ **findPath**(`key`, `throwIfMissing?`, `partialPath?`): `Promise`<[`Path`](../interfaces/Path.md)\> Tries to find a path to the node for the given key. It returns a `stack` of nodes to the closest node. @@ -326,14 +305,16 @@ It returns a `stack` of nodes to the closest node. | :------ | :------ | :------ | :------ | | `key` | `Uint8Array` | `undefined` | the search key | | `throwIfMissing` | `boolean` | `false` | if true, throws if any nodes are missing. Used for verifying proofs. (default: false) | +| `partialPath` | `Object` | `undefined` | - | +| `partialPath.stack` | [`TrieNode`](../README.md#trienode)[] | `undefined` | - | #### Returns -`Promise`<`Path`\> +`Promise`<[`Path`](../interfaces/Path.md)\> #### Defined in -[packages/trie/src/trie.ts:446](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L446) +[packages/trie/src/trie.ts:599](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L599) ___ @@ -349,7 +330,7 @@ Flushes all checkpoints, restoring the initial checkpoint state. #### Defined in -[packages/trie/src/trie.ts:1319](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1319) +[packages/trie/src/trie.ts:1348](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1348) ___ @@ -357,7 +338,9 @@ ___ ▸ **fromProof**(`proof`): `Promise`<`void`\> -Saves the nodes from a proof into the trie. A static version of this function exists with the same name. +Create a trie from a given (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof. An EIP-1186 proof contains the encoded trie nodes from the root +node to the leaf node storing state data. This function does not check if the proof has the same expected root. A static version of this function exists +with the same name. **`Deprecated`** @@ -365,9 +348,9 @@ Use `updateFromProof` #### Parameters -| Name | Type | -| :------ | :------ | -| `proof` | [`Proof`](../README.md#proof) | +| Name | Type | Description | +| :------ | :------ | :------ | +| `proof` | [`Proof`](../README.md#proof) | an EIP-1186 proof to update the trie from | #### Returns @@ -375,7 +358,7 @@ Use `updateFromProof` #### Defined in -[packages/trie/src/trie.ts:986](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L986) +[packages/trie/src/trie.ts:369](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L369) ___ @@ -400,7 +383,7 @@ A Promise that resolves to `Uint8Array` if a value was found or `null` if no val #### Defined in -[packages/trie/src/trie.ts:324](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L324) +[packages/trie/src/trie.ts:477](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L477) ___ @@ -416,7 +399,7 @@ Is the trie during a checkpoint phase? #### Defined in -[packages/trie/src/trie.ts:1269](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1269) +[packages/trie/src/trie.ts:1298](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1298) ___ @@ -438,7 +421,7 @@ Retrieves a node from db by hash. #### Defined in -[packages/trie/src/trie.ts:615](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L615) +[packages/trie/src/trie.ts:787](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L787) ___ @@ -454,7 +437,7 @@ Persists the root hash in the underlying database #### Defined in -[packages/trie/src/trie.ts:1216](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1216) +[packages/trie/src/trie.ts:1245](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1245) ___ @@ -481,7 +464,7 @@ A Promise that resolves once value is stored. #### Defined in -[packages/trie/src/trie.ts:342](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L342) +[packages/trie/src/trie.ts:495](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L495) ___ @@ -499,7 +482,7 @@ parent checkpoint as current. #### Defined in -[packages/trie/src/trie.ts:1303](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1303) +[packages/trie/src/trie.ts:1332](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1332) ___ @@ -521,7 +504,7 @@ Gets and/or Sets the current root of the `trie` #### Defined in -[packages/trie/src/trie.ts:287](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L287) +[packages/trie/src/trie.ts:438](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L438) ___ @@ -545,7 +528,7 @@ Saves a stack of nodes to the database. #### Defined in -[packages/trie/src/trie.ts:881](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L881) +[packages/trie/src/trie.ts:1053](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1053) ___ @@ -576,7 +559,7 @@ explicitly setting `cacheSize` as an option on the method. #### Defined in -[packages/trie/src/trie.ts:1199](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1199) +[packages/trie/src/trie.ts:1228](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1228) ___ @@ -584,13 +567,15 @@ ___ ▸ **updateFromProof**(`proof`, `shouldVerifyRoot?`): `Promise`<`undefined` \| `Uint8Array`\> -Updates a trie from a proof +Updates a trie from a proof by putting all the nodes in the proof into the trie. If a trie is being updated with multiple proofs, {@param shouldVerifyRoot} can +be passed as false in order to not immediately throw on an unexpected root, so that root verification can happen after all proofs and their nodes have been added. +An (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof contains the encoded trie nodes from the root node to the leaf node storing state data. #### Parameters | Name | Type | Default value | Description | | :------ | :------ | :------ | :------ | -| `proof` | [`Proof`](../README.md#proof) | `undefined` | The proof | +| `proof` | [`Proof`](../README.md#proof) | `undefined` | An (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof to update the trie from. | | `shouldVerifyRoot` | `boolean` | `false` | If `true`, verifies that the root key of the proof matches the trie root. Throws if this is not the case. | #### Returns @@ -601,7 +586,7 @@ The root of the proof #### Defined in -[packages/trie/src/trie.ts:1005](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1005) +[packages/trie/src/trie.ts:287](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L287) ___ @@ -609,7 +594,8 @@ ___ ▸ **verifyProof**(`rootHash`, `key`, `proof`): `Promise`<``null`` \| `Uint8Array`\> -Verifies a proof. A static version of this function exists with the same name. +Verifies a proof by putting all of its nodes into a trie and attempting to get the proven key. An (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof +contains the encoded trie nodes from the root node to the leaf node storing state data. A static version of this function exists with the same name. **`Throws`** @@ -617,11 +603,11 @@ If proof is found to be invalid. #### Parameters -| Name | Type | -| :------ | :------ | -| `rootHash` | `Uint8Array` | -| `key` | `Uint8Array` | -| `proof` | [`Proof`](../README.md#proof) | +| Name | Type | Description | +| :------ | :------ | :------ | +| `rootHash` | `Uint8Array` | Root hash of the trie that this proof was created from and is being verified for | +| `key` | `Uint8Array` | Key that is being verified and that the proof is created for | +| `proof` | [`Proof`](../README.md#proof) | an EIP-1186 proof to verify the key against | #### Returns @@ -631,7 +617,7 @@ The value from the key, or null if valid proof of non-existence. #### Defined in -[packages/trie/src/trie.ts:1053](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1053) +[packages/trie/src/trie.ts:322](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L322) ___ @@ -645,7 +631,7 @@ ___ #### Defined in -[packages/trie/src/trie.ts:1119](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1119) +[packages/trie/src/trie.ts:1157](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1157) ___ @@ -653,26 +639,31 @@ ___ ▸ **verifyRangeProof**(`rootHash`, `firstKey`, `lastKey`, `keys`, `values`, `proof`): `Promise`<`boolean`\> -[verifyRangeProof](../README.md#verifyrangeproof) +A range proof is a proof that includes the encoded trie nodes from the root node to leaf node for one or more branches of a trie, +allowing an entire range of leaf nodes to be validated. This is useful in applications such as snap sync where contiguous ranges +of state trie data is received and validated for constructing world state, locally. Also see [verifyRangeProof](../README.md#verifyrangeproof). A static +version of this function also exists. #### Parameters -| Name | Type | -| :------ | :------ | -| `rootHash` | `Uint8Array` | -| `firstKey` | ``null`` \| `Uint8Array` | -| `lastKey` | ``null`` \| `Uint8Array` | -| `keys` | `Uint8Array`[] | -| `values` | `Uint8Array`[] | -| `proof` | ``null`` \| `Uint8Array`[] | +| Name | Type | Description | +| :------ | :------ | :------ | +| `rootHash` | `Uint8Array` | root hash of state trie this proof is being verified against. | +| `firstKey` | ``null`` \| `Uint8Array` | first key of range being proven. | +| `lastKey` | ``null`` \| `Uint8Array` | last key of range being proven. | +| `keys` | `Uint8Array`[] | key list of leaf data being proven. | +| `values` | `Uint8Array`[] | value list of leaf data being proven, one-to-one correspondence with keys. | +| `proof` | ``null`` \| `Uint8Array`[] | proof node list, if all-elements-proof where no proof is needed, proof should be null, and both `firstKey` and `lastKey` must be null as well | #### Returns `Promise`<`boolean`\> +a flag to indicate whether there exists more trie node in the trie + #### Defined in -[packages/trie/src/trie.ts:1096](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L1096) +[packages/trie/src/trie.ts:244](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L244) ___ @@ -696,7 +687,7 @@ Resolves when finished walking trie. #### Defined in -[packages/trie/src/trie.ts:573](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L573) +[packages/trie/src/trie.ts:745](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L745) ___ @@ -720,7 +711,7 @@ Resolves when finished walking trie. #### Defined in -[packages/trie/src/trie.ts:584](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L584) +[packages/trie/src/trie.ts:756](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L756) ___ @@ -745,7 +736,7 @@ Resolves when finished walking trie. #### Defined in -[packages/trie/src/trie.ts:562](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L562) +[packages/trie/src/trie.ts:734](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L734) ___ @@ -765,22 +756,24 @@ ___ #### Defined in -[packages/trie/src/trie.ts:190](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L190) +[packages/trie/src/trie.ts:382](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L382) ___ ### createFromProof -▸ `Static` **createFromProof**(`proof`, `trieOpts?`): `Promise`<[`Trie`](Trie.md)\> +▸ `Static` **createFromProof**(`proof`, `trieOpts?`, `shouldVerifyRoot?`): `Promise`<[`Trie`](Trie.md)\> -Create a trie from a given proof +Create a trie from a given (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof. A proof contains the encoded trie nodes +from the root node to the leaf node storing state data. #### Parameters -| Name | Type | Description | -| :------ | :------ | :------ | -| `proof` | [`Proof`](../README.md#proof) | proof to create trie from | -| `trieOpts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | trie opts to be applied to returned trie | +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `proof` | [`Proof`](../README.md#proof) | `undefined` | an EIP-1186 proof to create trie from | +| `trieOpts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | `undefined` | trie opts to be applied to returned trie | +| `shouldVerifyRoot` | `boolean` | `false` | If `true`, verifies that the root key of the proof matches the trie root. Throws if this is not the case. | #### Returns @@ -790,7 +783,7 @@ new trie created from given proof #### Defined in -[packages/trie/src/trie.ts:156](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L156) +[packages/trie/src/trie.ts:144](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L144) ___ @@ -798,18 +791,19 @@ ___ ▸ `Static` **fromProof**(`proof`, `opts?`): `Promise`<[`Trie`](Trie.md)\> -Static version of fromProof function with the same behavior. +Static version of fromProof function. If a root is provided in the opts param, the proof will be checked to have the same expected root. An +(EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof contains the encoded trie nodes from the root node to the leaf node storing state data. **`Deprecated`** -Use `updateFromProof` +Use `createFromProof` #### Parameters -| Name | Type | -| :------ | :------ | -| `proof` | [`Proof`](../README.md#proof) | -| `opts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | +| Name | Type | Description | +| :------ | :------ | :------ | +| `proof` | [`Proof`](../README.md#proof) | An (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof contains the encoded trie nodes from the root node to the leaf node storing state data. | +| `opts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | - | #### Returns @@ -817,7 +811,7 @@ Use `updateFromProof` #### Defined in -[packages/trie/src/trie.ts:236](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L236) +[packages/trie/src/trie.ts:220](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L220) ___ @@ -825,7 +819,8 @@ ___ ▸ `Static` **verifyProof**(`key`, `proof`, `opts?`): `Promise`<``null`` \| `Uint8Array`\> -Static version of verifyProof function with the same behavior. +Static version of verifyProof function with the same behavior. An (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof contains the encoded trie nodes +from the root node to the leaf node storing state data. **`Throws`** @@ -835,9 +830,9 @@ If proof is found to be invalid. | Name | Type | Description | | :------ | :------ | :------ | -| `key` | `Uint8Array` | | -| `proof` | [`Proof`](../README.md#proof) | | -| `opts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | Trie options | +| `key` | `Uint8Array` | Key that is being verified and that the proof is created for | +| `proof` | [`Proof`](../README.md#proof) | An (EIP-1186)[https://eips.ethereum.org/EIPS/eip-1186] proof contains the encoded trie nodes from the root node to the leaf node storing state data. | +| `opts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | optional, the opts may include a custom hashing function to use with the trie for proof verification | #### Returns @@ -847,7 +842,7 @@ The value from the key, or null if valid proof of non-existence. #### Defined in -[packages/trie/src/trie.ts:256](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L256) +[packages/trie/src/trie.ts:166](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L166) ___ @@ -855,24 +850,29 @@ ___ ▸ `Static` **verifyRangeProof**(`rootHash`, `firstKey`, `lastKey`, `keys`, `values`, `proof`, `opts?`): `Promise`<`boolean`\> -Static version of [verifyRangeProof](../README.md#verifyrangeproof) function with the same behavior +A range proof is a proof that includes the encoded trie nodes from the root node to leaf node for one or more branches of a trie, +allowing an entire range of leaf nodes to be validated. This is useful in applications such as snap sync where contiguous ranges +of state trie data is received and validated for constructing world state, locally. Also see [verifyRangeProof](../README.md#verifyrangeproof). A static +version of this function also exists. #### Parameters -| Name | Type | -| :------ | :------ | -| `rootHash` | `Uint8Array` | -| `firstKey` | ``null`` \| `Uint8Array` | -| `lastKey` | ``null`` \| `Uint8Array` | -| `keys` | `Uint8Array`[] | -| `values` | `Uint8Array`[] | -| `proof` | ``null`` \| `Uint8Array`[] | -| `opts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | +| Name | Type | Description | +| :------ | :------ | :------ | +| `rootHash` | `Uint8Array` | root hash of state trie this proof is being verified against. | +| `firstKey` | ``null`` \| `Uint8Array` | first key of range being proven. | +| `lastKey` | ``null`` \| `Uint8Array` | last key of range being proven. | +| `keys` | `Uint8Array`[] | key list of leaf data being proven. | +| `values` | `Uint8Array`[] | value list of leaf data being proven, one-to-one correspondence with keys. | +| `proof` | ``null`` \| `Uint8Array`[] | proof node list, if all-elements-proof where no proof is needed, proof should be null, and both `firstKey` and `lastKey` must be null as well | +| `opts?` | [`TrieOpts`](../interfaces/TrieOpts.md) | optional, the opts may include a custom hashing function to use with the trie for proof verification | #### Returns `Promise`<`boolean`\> +a flag to indicate whether there exists more trie node in the trie + #### Defined in -[packages/trie/src/trie.ts:167](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L167) +[packages/trie/src/trie.ts:194](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/trie.ts#L194) diff --git a/packages/trie/docs/classes/TrieReadStream.md b/packages/trie/docs/classes/TrieReadStream.md index b22202445..46ee7a87d 100644 --- a/packages/trie/docs/classes/TrieReadStream.md +++ b/packages/trie/docs/classes/TrieReadStream.md @@ -81,7 +81,7 @@ Readable.constructor #### Defined in -[packages/trie/src/util/readStream.ts:36](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/util/readStream.ts#L36) +[packages/trie/src/util/readStream.ts:35](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/util/readStream.ts#L35) ## Properties @@ -324,7 +324,7 @@ Readable.\_read #### Defined in -[packages/trie/src/util/readStream.ts:43](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/util/readStream.ts#L43) +[packages/trie/src/util/readStream.ts:42](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/util/readStream.ts#L42) ___ diff --git a/packages/trie/docs/interfaces/CheckpointDBOpts.md b/packages/trie/docs/interfaces/CheckpointDBOpts.md index 5ccd5cb50..b9fb7d854 100644 --- a/packages/trie/docs/interfaces/CheckpointDBOpts.md +++ b/packages/trie/docs/interfaces/CheckpointDBOpts.md @@ -20,7 +20,7 @@ Cache size (default: 0) #### Defined in -[packages/trie/src/types.ts:126](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L126) +[packages/trie/src/types.ts:132](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L132) ___ @@ -32,7 +32,7 @@ A database instance. #### Defined in -[packages/trie/src/types.ts:116](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L116) +[packages/trie/src/types.ts:122](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L122) ___ @@ -44,4 +44,4 @@ ValueEncoding of the database (the values which are `put`/`get` in the db are of #### Defined in -[packages/trie/src/types.ts:121](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L121) +[packages/trie/src/types.ts:127](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L127) diff --git a/packages/trie/docs/interfaces/Path.md b/packages/trie/docs/interfaces/Path.md new file mode 100644 index 000000000..a434f56a9 --- /dev/null +++ b/packages/trie/docs/interfaces/Path.md @@ -0,0 +1,41 @@ +[@ethereumjs/trie](../README.md) / Path + +# Interface: Path + +## Table of contents + +### Properties + +- [node](Path.md#node) +- [remaining](Path.md#remaining) +- [stack](Path.md#stack) + +## Properties + +### node + +â€ĸ **node**: ``null`` \| [`TrieNode`](../README.md#trienode) + +#### Defined in + +[packages/trie/src/types.ts:24](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L24) + +___ + +### remaining + +â€ĸ **remaining**: [`Nibbles`](../README.md#nibbles) + +#### Defined in + +[packages/trie/src/types.ts:25](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L25) + +___ + +### stack + +â€ĸ **stack**: [`TrieNode`](../README.md#trienode)[] + +#### Defined in + +[packages/trie/src/types.ts:26](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L26) diff --git a/packages/trie/docs/interfaces/TrieOpts.md b/packages/trie/docs/interfaces/TrieOpts.md index ccba3e2d2..16e9ae3f5 100644 --- a/packages/trie/docs/interfaces/TrieOpts.md +++ b/packages/trie/docs/interfaces/TrieOpts.md @@ -29,7 +29,7 @@ Default: 0 (deactivated) #### Defined in -[packages/trie/src/types.ts:91](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L91) +[packages/trie/src/types.ts:97](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L97) ___ @@ -41,7 +41,7 @@ ___ #### Defined in -[packages/trie/src/types.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L96) +[packages/trie/src/types.ts:102](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L102) ___ @@ -53,7 +53,7 @@ A database instance. #### Defined in -[packages/trie/src/types.ts:36](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L36) +[packages/trie/src/types.ts:42](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L42) ___ @@ -68,7 +68,7 @@ e.g. all storage tries being stored in the outer account state DB) #### Defined in -[packages/trie/src/types.ts:68](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L68) +[packages/trie/src/types.ts:74](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L74) ___ @@ -80,7 +80,7 @@ A `Uint8Array` for the root of a previously stored trie #### Defined in -[packages/trie/src/types.ts:41](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L41) +[packages/trie/src/types.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L47) ___ @@ -101,7 +101,7 @@ instantiation with `useKeyHashing` set to `true`. #### Defined in -[packages/trie/src/types.ts:55](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L55) +[packages/trie/src/types.ts:61](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L61) ___ @@ -113,7 +113,7 @@ Hash function used for hashing trie node and securing key. #### Defined in -[packages/trie/src/types.ts:60](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L60) +[packages/trie/src/types.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L66) ___ @@ -126,7 +126,7 @@ unreachable nodes will be pruned (deleted) from the trie #### Defined in -[packages/trie/src/types.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L84) +[packages/trie/src/types.ts:90](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L90) ___ @@ -138,7 +138,7 @@ Store the root inside the database after every `write` operation #### Defined in -[packages/trie/src/types.ts:78](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L78) +[packages/trie/src/types.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L84) ___ @@ -150,4 +150,4 @@ ValueEncoding of the database (the values which are `put`/`get` in the db are of #### Defined in -[packages/trie/src/types.ts:73](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L73) +[packages/trie/src/types.ts:79](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L79) diff --git a/packages/trie/docs/interfaces/TrieShallowCopyOpts.md b/packages/trie/docs/interfaces/TrieShallowCopyOpts.md index 21fa52262..33b985c91 100644 --- a/packages/trie/docs/interfaces/TrieShallowCopyOpts.md +++ b/packages/trie/docs/interfaces/TrieShallowCopyOpts.md @@ -17,7 +17,7 @@ #### Defined in -[packages/trie/src/types.ts:109](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L109) +[packages/trie/src/types.ts:115](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L115) ___ @@ -27,4 +27,4 @@ ___ #### Defined in -[packages/trie/src/types.ts:108](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L108) +[packages/trie/src/types.ts:114](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/trie/src/types.ts#L114) diff --git a/packages/trie/package.json b/packages/trie/package.json index 248ecb2bc..0ba21cc0e 100644 --- a/packages/trie/package.json +++ b/packages/trie/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/trie", - "version": "6.1.1", + "version": "6.2.0", "description": "Implementation of the modified merkle patricia tree as specified in Ethereum's yellow paper.", "keywords": [ "merkle", @@ -48,13 +48,13 @@ "prepublishOnly": "../../config/cli/prepublish.sh", "profiling": "tsc --target ES5 benchmarks/random.ts && 0x benchmarks/random.js", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --config=./vitest.config.browser.ts --browser.name=chrome --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/util": "^9.0.3", "@types/readable-stream": "^2.3.13", "debug": "^4.3.4", "lru-cache": "10.1.0", @@ -62,7 +62,7 @@ "readable-stream": "^3.6.0" }, "devDependencies": { - "@ethereumjs/genesis": "^0.2.1", + "@ethereumjs/genesis": "^0.2.2", "@types/benchmark": "^1.0.33", "abstract-level": "^1.0.3", "level": "^8.0.0", diff --git a/packages/trie/src/db/checkpoint.ts b/packages/trie/src/db/checkpoint.ts index 4e50ee1b3..620447ce8 100644 --- a/packages/trie/src/db/checkpoint.ts +++ b/packages/trie/src/db/checkpoint.ts @@ -55,7 +55,6 @@ export class CheckpointDB implements DB { this.checkpoints = [] if (this.cacheSize > 0) { - // @ts-ignore this._cache = new LRUCache({ max: this.cacheSize, updateAgeOnGet: true, diff --git a/packages/trie/src/util/genesisState.ts b/packages/trie/src/util/genesisState.ts index 418c497f9..6057b8fad 100644 --- a/packages/trie/src/util/genesisState.ts +++ b/packages/trie/src/util/genesisState.ts @@ -1,5 +1,12 @@ import { RLP } from '@ethereumjs/rlp' -import { Account, isHexPrefixed, toBytes, unpadBytes, unprefixedHexToBytes } from '@ethereumjs/util' +import { + Account, + hexToBytes, + isHexPrefixed, + toBytes, + unpadBytes, + unprefixedHexToBytes, +} from '@ethereumjs/util' import { keccak256 } from 'ethereum-cryptography/keccak.js' import { Trie } from '../trie.js' @@ -12,7 +19,7 @@ import type { AccountState, GenesisState } from '@ethereumjs/util' export async function genesisStateRoot(genesisState: GenesisState) { const trie = new Trie({ useKeyHashing: true }) for (const [key, value] of Object.entries(genesisState)) { - const address = isHexPrefixed(key) ? toBytes(key) : unprefixedHexToBytes(key) + const address = isHexPrefixed(key) ? hexToBytes(key) : unprefixedHexToBytes(key) const account = new Account() if (typeof value === 'string') { account.balance = BigInt(value) diff --git a/packages/trie/test/index.spec.ts b/packages/trie/test/index.spec.ts index 5866692fc..1d901575e 100644 --- a/packages/trie/test/index.spec.ts +++ b/packages/trie/test/index.spec.ts @@ -252,8 +252,7 @@ for (const keyPrefix of [undefined, hexToBytes('0x1234')]) { assert.ok(path.node !== null, 'findPath should find a node') const { stack } = await trie.findPath(utf8ToBytes('aaa')) - // @ts-expect-error - await trie._db.del(keccak256(stack[1].serialize())) // delete the BranchNode -> value1 from the DB + await trie['_db'].del(keccak256(stack[1].serialize())) // delete the BranchNode -> value1 from the DB path = await trie.findPath(utf8ToBytes('aaa')) diff --git a/packages/trie/test/proof/range.spec.ts b/packages/trie/test/proof/range.spec.ts index 3ebf4a83c..a82313b2a 100644 --- a/packages/trie/test/proof/range.spec.ts +++ b/packages/trie/test/proof/range.spec.ts @@ -3,10 +3,10 @@ import { compareBytes, concatBytes, hexToBytes, + randomBytes, setLengthLeft, toBytes, } from '@ethereumjs/util' -import * as crypto from 'crypto' import { assert, describe, it } from 'vitest' import { Trie } from '../../src/index.js' @@ -36,8 +36,8 @@ async function randomTrie(db: DB, addKey: boolean = true) { } for (let i = 0; i < TRIE_SIZE; i++) { - const key = crypto.randomBytes(32) - const val = crypto.randomBytes(20) + const key = randomBytes(32) + const val = randomBytes(20) if ((await trie.get(key)) === null) { await trie.put(key, val) entries.push([key, val]) @@ -200,9 +200,7 @@ describe('simple merkle range proofs generation and verification', () => { // Test the mini trie with only a single element. const tinyTrie = new Trie() - const tinyEntries: [Uint8Array, Uint8Array][] = [ - [crypto.randomBytes(32), crypto.randomBytes(20)], - ] + const tinyEntries: [Uint8Array, Uint8Array][] = [[randomBytes(32), randomBytes(20)]] await tinyTrie.put(tinyEntries[0][0], tinyEntries[0][1]) const tinyStartKey = hexToBytes('0x' + '00'.repeat(32)) @@ -282,7 +280,7 @@ describe('simple merkle range proofs generation and verification', () => { const start = getRandomIntInclusive(0, entries.length - 2) const end = getRandomIntInclusive(start + 1, entries.length - 1) const targetIndex = getRandomIntInclusive(start, end) - entries[targetIndex][0] = crypto.randomBytes(32) + entries[targetIndex][0] = randomBytes(32) await verify(trie, entries, start, end) }) @@ -291,7 +289,7 @@ describe('simple merkle range proofs generation and verification', () => { const start = getRandomIntInclusive(0, entries.length - 2) const end = getRandomIntInclusive(start + 1, entries.length - 1) const targetIndex = getRandomIntInclusive(start, end) - entries[targetIndex][1] = crypto.randomBytes(20) + entries[targetIndex][1] = randomBytes(20) await verify(trie, entries, start, end) }) diff --git a/packages/trie/test/trie/checkpoint.spec.ts b/packages/trie/test/trie/checkpoint.spec.ts index 93618b7ba..3e0d320b7 100644 --- a/packages/trie/test/trie/checkpoint.spec.ts +++ b/packages/trie/test/trie/checkpoint.spec.ts @@ -6,8 +6,8 @@ import { hexToBytes, utf8ToBytes, } from '@ethereumjs/util' -import { createHash } from 'crypto' import { keccak256 } from 'ethereum-cryptography/keccak.js' +import { sha256 } from 'ethereum-cryptography/sha256.js' import { assert, describe, it } from 'vitest' import { ROOT_DB_KEY, Trie } from '../../src/index.js' @@ -64,8 +64,7 @@ describe('testing checkpoints', () => { it('should copy trie and get upstream and cache values after checkpoint', async () => { trieCopy = trie.shallowCopy() assert.equal(bytesToHex(trieCopy.root()), postRoot) - // @ts-expect-error - assert.equal(trieCopy._db.checkpoints.length, 1) + assert.equal(trieCopy['_db'].checkpoints.length, 1) assert.ok(trieCopy.hasCheckpoints()) const res = await trieCopy.get(utf8ToBytes('do')) assert.ok(equalsBytes(utf8ToBytes('verb'), res!)) @@ -77,7 +76,7 @@ describe('testing checkpoints', () => { const trie = new Trie({ db: new MapDB(), useKeyHashing: true, - useKeyHashingFunction: (value) => createHash('sha256').update(value).digest(), + useKeyHashingFunction: sha256, }) await trie.put(utf8ToBytes('key1'), utf8ToBytes('value1')) @@ -234,8 +233,7 @@ describe('testing checkpoints', () => { // The CommittedState should not change (not the key/value pairs, not the root, and not the root in DB) assert.equal(bytesToUtf8((await CommittedState.get(KEY))!), '1') assert.equal( - // @ts-expect-error - bytesToHex(await CommittedState._db.get(KEY_ROOT)), + bytesToHex((await CommittedState['_db'].get(KEY_ROOT))!), '0x77ddd505d2a5b76a2a6ee34b827a0d35ca19f8d358bee3d74a84eab59794487c' ) assert.equal( @@ -244,9 +242,9 @@ describe('testing checkpoints', () => { ) // From MemoryState, now take the final checkpoint - const finalCheckpoint = (MemoryState)._db.checkpoints[0] + const finalCheckpoint = MemoryState['_db'].checkpoints[0] // Insert this into CommittedState - ;(CommittedState)._db.checkpoints.push(finalCheckpoint) + CommittedState['_db'].checkpoints.push(finalCheckpoint) // Now all operations done on MemoryState (including pruning) can be // committed into CommittedState diff --git a/packages/trie/test/trie/secure.spec.ts b/packages/trie/test/trie/secure.spec.ts index 235c47107..7700b596a 100644 --- a/packages/trie/test/trie/secure.spec.ts +++ b/packages/trie/test/trie/secure.spec.ts @@ -6,8 +6,8 @@ import { hexToBytes, utf8ToBytes, } from '@ethereumjs/util' -import { createHash } from 'crypto' import { keccak256 } from 'ethereum-cryptography/keccak.js' +import { sha256 } from 'ethereum-cryptography/sha256.js' import { assert, describe, it } from 'vitest' import { ROOT_DB_KEY, Trie } from '../../src/index.js' @@ -203,7 +203,7 @@ describe('SecureTrie.copy', () => { const trie = new Trie({ db: new MapDB(), useKeyHashing: true, - useKeyHashingFunction: (value) => createHash('sha256').update(value).digest(), + useKeyHashingFunction: sha256, }) await trie.put(utf8ToBytes('key1'), utf8ToBytes('value1')) diff --git a/packages/trie/test/trie/trie.spec.ts b/packages/trie/test/trie/trie.spec.ts index 4c69382d3..879fd0fb6 100644 --- a/packages/trie/test/trie/trie.spec.ts +++ b/packages/trie/test/trie/trie.spec.ts @@ -90,13 +90,11 @@ for (const { constructor, defaults, title } of [ useRootPersistence: true, }) - // @ts-expect-error - assert.equal(await trie._db.get(ROOT_DB_KEY), undefined) + assert.equal(await trie['_db'].get(ROOT_DB_KEY), undefined) await trie.put(utf8ToBytes('foo'), utf8ToBytes('bar')) - // @ts-expect-error - assert.equal(bytesToHex(await trie._db.get(ROOT_DB_KEY)), EXPECTED_ROOTS) + assert.equal(bytesToHex((await trie['_db'].get(ROOT_DB_KEY))!), EXPECTED_ROOTS) }) it('persist the root if the `root` option is given', async () => { @@ -107,13 +105,11 @@ for (const { constructor, defaults, title } of [ useRootPersistence: true, }) - // @ts-expect-error - assert.ok(equalsBytes((await trie._db.get(ROOT_DB_KEY))!, KECCAK256_RLP)) + assert.ok(equalsBytes((await trie['_db'].get(ROOT_DB_KEY))!, KECCAK256_RLP)) await trie.put(utf8ToBytes('foo'), utf8ToBytes('bar')) - // @ts-expect-error - assert.isFalse(equalsBytes((await trie._db.get(ROOT_DB_KEY))!, KECCAK256_RLP)) + assert.isFalse(equalsBytes((await trie['_db'].get(ROOT_DB_KEY))!, KECCAK256_RLP)) }) it('does not persist the root if the `useRootPersistence` option is `false`', async () => { @@ -123,41 +119,34 @@ for (const { constructor, defaults, title } of [ useRootPersistence: false, }) - // @ts-expect-error - assert.equal(await trie._db.get(ROOT_DB_KEY), undefined) + assert.equal(await trie['_db'].get(ROOT_DB_KEY), undefined) await trie.put(utf8ToBytes('do_not_persist_with_db'), utf8ToBytes('bar')) - // @ts-expect-error - assert.equal(await trie._db.get(ROOT_DB_KEY), undefined) + assert.equal(await trie['_db'].get(ROOT_DB_KEY), undefined) }) it('persists the root if the `db` option is not provided', async () => { const trie = await constructor.create({ ...defaults, useRootPersistence: true }) - // @ts-expect-error - assert.equal(await trie._db.get(ROOT_DB_KEY), undefined) + assert.equal(await trie['_db'].get(ROOT_DB_KEY), undefined) await trie.put(utf8ToBytes('do_not_persist_without_db'), utf8ToBytes('bar')) - // @ts-expect-error - assert.notEqual(await trie._db.get(ROOT_DB_KEY), undefined) + assert.notEqual(await trie['_db'].get(ROOT_DB_KEY), undefined) }) it('persist and restore the root', async () => { const db = new MapDB() const trie = await constructor.create({ ...defaults, db, useRootPersistence: true }) - // @ts-expect-error - assert.equal(await trie._db.get(ROOT_DB_KEY), undefined) + assert.equal(await trie['_db'].get(ROOT_DB_KEY), undefined) await trie.put(utf8ToBytes('foo'), utf8ToBytes('bar')) - // @ts-expect-error - assert.equal(bytesToHex(await trie._db.get(ROOT_DB_KEY)), EXPECTED_ROOTS) + assert.equal(bytesToHex((await trie['_db'].get(ROOT_DB_KEY))!), EXPECTED_ROOTS) // Using the same database as `trie` so we should have restored the root const copy = await constructor.create({ ...defaults, db, useRootPersistence: true }) - // @ts-expect-error - assert.equal(bytesToHex(await copy._db.get(ROOT_DB_KEY)), EXPECTED_ROOTS) + assert.equal(bytesToHex((await copy['_db'].get(ROOT_DB_KEY))!), EXPECTED_ROOTS) // New trie with a new database so we shouldn't find a root to restore const empty = await constructor.create({ @@ -165,8 +154,7 @@ for (const { constructor, defaults, title } of [ db: new MapDB(), useRootPersistence: true, }) - // @ts-expect-error - assert.equal(await empty._db.get(ROOT_DB_KEY), undefined) + assert.equal(await empty['_db'].get(ROOT_DB_KEY), undefined) }) it('put fails if the key is the ROOT_DB_KEY', async () => { diff --git a/packages/tx/CHANGELOG.md b/packages/tx/CHANGELOG.md index 67b84771e..de7c0520f 100644 --- a/packages/tx/CHANGELOG.md +++ b/packages/tx/CHANGELOG.md @@ -6,6 +6,42 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 5.3.0 - 2024-03-05 + +### Full 4844 Browser Readiness + +#### WASM KZG + +Shortly following the "Dencun Hardfork Support" release round from last month, this is now the first round of releases where the EthereumJS libraries are now fully browser compatible regarding the new 4844 functionality, see PRs [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) and [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296)! 🎉 + +Our WASM wizard @acolytec3 has spent the last two weeks and created a WASM build of the [c-kzg](https://github.com/benjaminion/c-kzg) library which we have released under the `kzg-wasm` name on npm (and you can also use independently for other projects). See the newly created [GitHub repository](https://github.com/ethereumjs/kzg-wasm) for some library-specific documentation. + +This WASM KZG library can now be used for KZG initialization (replacing the old recommended `c-kzg` initialization), see the respective [README section](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/README.md#kzg-initialization) from the tx library for usage instructions (which is also accurate for the other using upstream libraries like block or EVM). + +Note that `kzg-wasm` needs to be added manually to your own dependencies and the KZG initialization code needs to be adopted like the following (which you will likely want to do in most cases, so if you deal with post Dencun EVM bytecode and/or 4844 blob txs in any way): + +```typescript +import { loadKZG } from 'kzg-wasm' +import { Chain, Common, Hardfork } from '@ethereumjs/common' + +const kzg = await loadKZG() + +// Instantiate `common` +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, +}) +``` + +Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. + +Note that passing in the KZG setup file is not necessary anymore, since this is now defaulting to the setup file from the official [KZG ceremony](https://ceremony.ethereum.org/) (which is now bundled with the KZG library). + +#### Trie Node.js Import Bug + +Since this fits well also to be placed here relatively prominently for awareness: we had a relatively nasty bug in the `@ethereumjs/trie` library with a `Node.js` web stream import also affecting browser compatibility, see PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). This bug has been fixed along with these releases and this library now references the updated trie library version. + ## 5.2.1 - 2024-02-08 - Hotfix release adding a missing `debug` dependency to the `@ethereumjs/trie` package (dependency), PR [#3271](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3271) diff --git a/packages/tx/README.md b/packages/tx/README.md index 1d58b90c8..f20517123 100644 --- a/packages/tx/README.md +++ b/packages/tx/README.md @@ -23,42 +23,43 @@ npm install @ethereumjs/tx ### KZG Setup -This library supports an experimental version of `EIP-4844` blob transactions (see usage instructions below) starting with `v4.1.0`. +This library now fully supports `EIP-4844` blob transactions (see usage instructions below) starting with `v5.2.0`. For blob transactions and other KZG related proof functionality (e.g. for EVM precompiles) KZG has to be manually installed and initialized in the `common` instance to be used in instantiating blob transactions. -#### Manual Installation +Note: starting with the `v5.3` release of this library and associated releases of upstream EthereumJS libraries the old `c-kzg` centered recommended setup has been replaced by using our own WASM build of the `c-kzg` library which has been released as a separate package [kzg-wasm](https://github.com/ethereumjs/kzg-wasm) on npm. -The following two manual installation steps for a KZG library and the trusted setup are needed. - -1. Install an additional dependency that supports the `kzg` interface defined in [the kzg interface](./src/kzg/kzg.ts). You can install the default option [c-kzg](https://github.com/ethereum/c-kzg-4844) by simply running `npm install c-kzg`. -2. Download the trusted setup required for the KZG module. It can be found [here](../client/src/trustedSetups/trusted_setup.txt) within the client package. +This new setup is now both browser compatible 🎉 and the official KZG setup file has been integrated by default and the new setup is now the default recommended setup to be used. #### KZG Initialization -Initialization can then be done like this (using the `c-kzg` module for our KZG dependency): +As a first step add the `kzg-wasm` package as a dependency to your `package.json` file and install the library. + +Initialization can then be done like the following: ```ts // ./examples/initKzg.ts -import * as kzg from 'c-kzg' +import { loadKZG } from 'kzg-wasm' import { Chain, Common, Hardfork } from '@ethereumjs/common' -import { initKZG } from '@ethereumjs/util' -// Instantiate KZG -initKZG(kzg, __dirname + '/../../client/src/trustedSetups/official.txt') +const main = async () => { + const kzg = await loadKZG() + + // Instantiate `common` + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, + }) -// Instantiate `common` -const common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.Cancun, - customCrypto: { kzg }, -}) + console.log(common.customCrypto.kzg) // should output the KZG API as an object +} -console.log(common.customCrypto.kzg) // should output the KZG API as an object +main() ``` -At the moment using the Node.js bindings for the `c-kzg` library is the only option to get KZG related functionality to work, note that this solution is not browser compatible. We are currently working on a WASM build of that respective library which can hopefully be released soon [TM]. +Note: Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. ## Usage @@ -124,39 +125,43 @@ See the following code snipped for an example on how to instantiate (using the ` import { Chain, Common, Hardfork } from '@ethereumjs/common' import { BlobEIP4844Transaction } from '@ethereumjs/tx' -import { bytesToHex, initKZG } from '@ethereumjs/util' -import * as kzg from 'c-kzg' - -initKZG(kzg, __dirname + '/../../client/src/trustedSetups/devnet6.txt') - -const common = new Common({ - chain: Chain.Mainnet, - hardfork: Hardfork.Shanghai, - eips: [4844], - customCrypto: { kzg }, -}) - -const txData = { - data: '0x1a8451e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', - gasLimit: '0x02625a00', - maxPriorityFeePerGas: '0x01', - maxFeePerGas: '0xff', - maxFeePerDataGas: '0xfff', - nonce: '0x00', - to: '0xcccccccccccccccccccccccccccccccccccccccc', - value: '0x0186a0', - v: '0x01', - r: '0xafb6e247b1c490e284053c87ab5f6b59e219d51f743f7a4d83e400782bc7e4b9', - s: '0x479a268e0e0acd4de3f1e28e4fac2a6b32a4195e8dfa9d19147abe8807aa6f64', - chainId: '0x01', - accessList: [], - type: '0x05', - blobsData: ['abcd'], +import { bytesToHex } from '@ethereumjs/util' +import { loadKZG } from 'kzg-wasm' + +const main = async () => { + const kzg = await loadKZG() + + const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Shanghai, + eips: [4844], + customCrypto: { kzg }, + }) + + const txData = { + data: '0x1a8451e600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + gasLimit: '0x02625a00', + maxPriorityFeePerGas: '0x01', + maxFeePerGas: '0xff', + maxFeePerDataGas: '0xfff', + nonce: '0x00', + to: '0xcccccccccccccccccccccccccccccccccccccccc', + value: '0x0186a0', + v: '0x01', + r: '0xafb6e247b1c490e284053c87ab5f6b59e219d51f743f7a4d83e400782bc7e4b9', + s: '0x479a268e0e0acd4de3f1e28e4fac2a6b32a4195e8dfa9d19147abe8807aa6f64', + chainId: '0x01', + accessList: [], + type: '0x05', + blobsData: ['abcd'], + } + + const tx = BlobEIP4844Transaction.fromTxData(txData, { common }) + + console.log(bytesToHex(tx.hash())) //0x3c3e7c5e09c250d2200bcc3530f4a9088d7e3fb4ea3f4fccfd09f535a3539e84 } -const tx = BlobEIP4844Transaction.fromTxData(txData, { common }) - -console.log(bytesToHex(tx.hash())) //0x3c3e7c5e09c250d2200bcc3530f4a9088d7e3fb4ea3f4fccfd09f535a3539e84 +main() ``` Note that `versionedHashes` and `kzgCommitments` have a real length of 32 bytes, `blobs` have a real length of `4096` bytes and values are trimmed here for brevity. diff --git a/packages/tx/docs/classes/AccessListEIP2930Transaction.md b/packages/tx/docs/classes/AccessListEIP2930Transaction.md index 9a381de72..e32c14b27 100644 --- a/packages/tx/docs/classes/AccessListEIP2930Transaction.md +++ b/packages/tx/docs/classes/AccessListEIP2930Transaction.md @@ -46,6 +46,7 @@ Typed transaction with optional access lists - [errorStr](AccessListEIP2930Transaction.md#errorstr) - [getBaseFee](AccessListEIP2930Transaction.md#getbasefee) - [getDataFee](AccessListEIP2930Transaction.md#getdatafee) +- [getEffectivePriorityFee](AccessListEIP2930Transaction.md#geteffectivepriorityfee) - [getHashedMessageToSign](AccessListEIP2930Transaction.md#gethashedmessagetosign) - [getMessageToSign](AccessListEIP2930Transaction.md#getmessagetosign) - [getMessageToVerifySignature](AccessListEIP2930Transaction.md#getmessagetoverifysignature) @@ -321,7 +322,7 @@ BaseTransaction.addSignature #### Defined in -[tx/src/eip2930Transaction.ts:283](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L283) +[tx/src/eip2930Transaction.ts:287](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L287) ___ @@ -341,7 +342,7 @@ BaseTransaction.errorStr #### Defined in -[tx/src/eip2930Transaction.ts:329](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L329) +[tx/src/eip2930Transaction.ts:333](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L333) ___ @@ -381,7 +382,31 @@ BaseTransaction.getDataFee #### Defined in -[tx/src/eip2930Transaction.ts:179](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L179) +[tx/src/eip2930Transaction.ts:183](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L183) + +___ + +### getEffectivePriorityFee + +▸ **getEffectivePriorityFee**(`baseFee?`): `bigint` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `baseFee?` | `bigint` | + +#### Returns + +`bigint` + +#### Overrides + +BaseTransaction.getEffectivePriorityFee + +#### Defined in + +[tx/src/eip2930Transaction.ts:176](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L176) ___ @@ -405,7 +430,7 @@ BaseTransaction.getHashedMessageToSign #### Defined in -[tx/src/eip2930Transaction.ts:255](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L255) +[tx/src/eip2930Transaction.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L259) ___ @@ -433,7 +458,7 @@ BaseTransaction.getMessageToSign #### Defined in -[tx/src/eip2930Transaction.ts:244](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L244) +[tx/src/eip2930Transaction.ts:248](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L248) ___ @@ -453,7 +478,7 @@ BaseTransaction.getMessageToVerifySignature #### Defined in -[tx/src/eip2930Transaction.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L272) +[tx/src/eip2930Transaction.ts:276](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L276) ___ @@ -473,7 +498,7 @@ BaseTransaction.getSenderAddress #### Defined in -[tx/src/baseTransaction.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L272) +[tx/src/baseTransaction.ts:279](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L279) ___ @@ -493,7 +518,7 @@ BaseTransaction.getSenderPublicKey #### Defined in -[tx/src/eip2930Transaction.ts:279](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L279) +[tx/src/eip2930Transaction.ts:283](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L283) ___ @@ -513,7 +538,7 @@ BaseTransaction.getUpfrontCost #### Defined in -[tx/src/eip2930Transaction.ts:186](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L186) +[tx/src/eip2930Transaction.ts:190](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L190) ___ @@ -558,7 +583,7 @@ BaseTransaction.hash #### Defined in -[tx/src/eip2930Transaction.ts:265](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L265) +[tx/src/eip2930Transaction.ts:269](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L269) ___ @@ -576,7 +601,7 @@ BaseTransaction.isSigned #### Defined in -[tx/src/baseTransaction.ts:247](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L247) +[tx/src/baseTransaction.ts:254](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L254) ___ @@ -628,7 +653,7 @@ BaseTransaction.raw #### Defined in -[tx/src/eip2930Transaction.ts:203](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L203) +[tx/src/eip2930Transaction.ts:207](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L207) ___ @@ -655,7 +680,7 @@ BaseTransaction.serialize #### Defined in -[tx/src/eip2930Transaction.ts:229](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L229) +[tx/src/eip2930Transaction.ts:233](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L233) ___ @@ -687,7 +712,7 @@ BaseTransaction.sign #### Defined in -[tx/src/baseTransaction.ts:290](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L290) +[tx/src/baseTransaction.ts:297](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L297) ___ @@ -746,7 +771,7 @@ BaseTransaction.toCreationAddress #### Defined in -[tx/src/baseTransaction.ts:216](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L216) +[tx/src/baseTransaction.ts:223](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L223) ___ @@ -766,7 +791,7 @@ BaseTransaction.toJSON #### Defined in -[tx/src/eip2930Transaction.ts:314](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L314) +[tx/src/eip2930Transaction.ts:318](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip2930Transaction.ts#L318) ___ @@ -786,7 +811,7 @@ BaseTransaction.verifySignature #### Defined in -[tx/src/baseTransaction.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L259) +[tx/src/baseTransaction.ts:266](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L266) ___ diff --git a/packages/tx/docs/classes/BlobEIP4844Transaction.md b/packages/tx/docs/classes/BlobEIP4844Transaction.md index 384038d85..a0df79aa7 100644 --- a/packages/tx/docs/classes/BlobEIP4844Transaction.md +++ b/packages/tx/docs/classes/BlobEIP4844Transaction.md @@ -52,6 +52,7 @@ Typed transaction with a new gas fee market mechanism for transactions that incl - [errorStr](BlobEIP4844Transaction.md#errorstr) - [getBaseFee](BlobEIP4844Transaction.md#getbasefee) - [getDataFee](BlobEIP4844Transaction.md#getdatafee) +- [getEffectivePriorityFee](BlobEIP4844Transaction.md#geteffectivepriorityfee) - [getHashedMessageToSign](BlobEIP4844Transaction.md#gethashedmessagetosign) - [getMessageToSign](BlobEIP4844Transaction.md#getmessagetosign) - [getMessageToVerifySignature](BlobEIP4844Transaction.md#getmessagetoverifysignature) @@ -102,7 +103,7 @@ BaseTransaction<TransactionType.BlobEIP4844\>.constructor #### Defined in -[tx/src/eip4844Transaction.ts:103](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L103) +[tx/src/eip4844Transaction.ts:104](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L104) ## Properties @@ -112,7 +113,7 @@ BaseTransaction<TransactionType.BlobEIP4844\>.constructor #### Defined in -[tx/src/eip4844Transaction.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L85) +[tx/src/eip4844Transaction.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L86) ___ @@ -122,7 +123,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L84) +[tx/src/eip4844Transaction.ts:85](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L85) ___ @@ -132,7 +133,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:91](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L91) +[tx/src/eip4844Transaction.ts:92](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L92) ___ @@ -142,7 +143,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:92](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L92) +[tx/src/eip4844Transaction.ts:93](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L93) ___ @@ -166,7 +167,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L83) +[tx/src/eip4844Transaction.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L84) ___ @@ -180,7 +181,7 @@ BaseTransaction.common #### Defined in -[tx/src/eip4844Transaction.ts:90](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L90) +[tx/src/eip4844Transaction.ts:91](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L91) ___ @@ -218,7 +219,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:93](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L93) +[tx/src/eip4844Transaction.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L94) ___ @@ -228,7 +229,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L94) +[tx/src/eip4844Transaction.ts:95](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L95) ___ @@ -238,7 +239,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:88](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L88) +[tx/src/eip4844Transaction.ts:89](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L89) ___ @@ -248,7 +249,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:87](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L87) +[tx/src/eip4844Transaction.ts:88](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L88) ___ @@ -258,7 +259,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L86) +[tx/src/eip4844Transaction.ts:87](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L87) ___ @@ -391,7 +392,7 @@ BaseTransaction.addSignature #### Defined in -[tx/src/eip4844Transaction.ts:532](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L532) +[tx/src/eip4844Transaction.ts:558](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L558) ___ @@ -411,7 +412,7 @@ BaseTransaction.errorStr #### Defined in -[tx/src/eip4844Transaction.ts:568](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L568) +[tx/src/eip4844Transaction.ts:594](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L594) ___ @@ -451,7 +452,33 @@ BaseTransaction.getDataFee #### Defined in -[tx/src/eip4844Transaction.ts:395](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L395) +[tx/src/eip4844Transaction.ts:421](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L421) + +___ + +### getEffectivePriorityFee + +▸ **getEffectivePriorityFee**(`baseFee`): `bigint` + +Returns the minimum of calculated priority fee (from maxFeePerGas and baseFee) and maxPriorityFeePerGas + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `baseFee` | `bigint` | Base fee retrieved from block | + +#### Returns + +`bigint` + +#### Overrides + +BaseTransaction.getEffectivePriorityFee + +#### Defined in + +[tx/src/eip4844Transaction.ts:224](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L224) ___ @@ -475,7 +502,7 @@ BaseTransaction.getHashedMessageToSign #### Defined in -[tx/src/eip4844Transaction.ts:492](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L492) +[tx/src/eip4844Transaction.ts:518](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L518) ___ @@ -503,7 +530,7 @@ BaseTransaction.getMessageToSign #### Defined in -[tx/src/eip4844Transaction.ts:481](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L481) +[tx/src/eip4844Transaction.ts:507](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L507) ___ @@ -521,7 +548,7 @@ BaseTransaction.getMessageToVerifySignature #### Defined in -[tx/src/eip4844Transaction.ts:506](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L506) +[tx/src/eip4844Transaction.ts:532](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L532) ___ @@ -541,7 +568,7 @@ BaseTransaction.getSenderAddress #### Defined in -[tx/src/baseTransaction.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L272) +[tx/src/baseTransaction.ts:279](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L279) ___ @@ -561,7 +588,7 @@ BaseTransaction.getSenderPublicKey #### Defined in -[tx/src/eip4844Transaction.ts:513](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L513) +[tx/src/eip4844Transaction.ts:539](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L539) ___ @@ -587,7 +614,7 @@ BaseTransaction.getUpfrontCost #### Defined in -[tx/src/eip4844Transaction.ts:403](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L403) +[tx/src/eip4844Transaction.ts:429](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L429) ___ @@ -632,7 +659,7 @@ BaseTransaction.hash #### Defined in -[tx/src/eip4844Transaction.ts:502](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L502) +[tx/src/eip4844Transaction.ts:528](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L528) ___ @@ -650,7 +677,7 @@ BaseTransaction.isSigned #### Defined in -[tx/src/baseTransaction.ts:247](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L247) +[tx/src/baseTransaction.ts:254](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L254) ___ @@ -688,7 +715,7 @@ the number of blobs included with this transaction #### Defined in -[tx/src/eip4844Transaction.ts:587](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L587) +[tx/src/eip4844Transaction.ts:613](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L613) ___ @@ -718,7 +745,7 @@ BaseTransaction.raw #### Defined in -[tx/src/eip4844Transaction.ts:420](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L420) +[tx/src/eip4844Transaction.ts:446](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L446) ___ @@ -745,7 +772,7 @@ BaseTransaction.serialize #### Defined in -[tx/src/eip4844Transaction.ts:449](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L449) +[tx/src/eip4844Transaction.ts:475](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L475) ___ @@ -761,7 +788,7 @@ the serialized form of a blob transaction in the network wrapper format (used fo #### Defined in -[tx/src/eip4844Transaction.ts:456](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L456) +[tx/src/eip4844Transaction.ts:482](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L482) ___ @@ -793,7 +820,7 @@ BaseTransaction.sign #### Defined in -[tx/src/baseTransaction.ts:290](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L290) +[tx/src/baseTransaction.ts:297](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L297) ___ @@ -852,7 +879,7 @@ BaseTransaction.toCreationAddress #### Defined in -[tx/src/baseTransaction.ts:216](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L216) +[tx/src/baseTransaction.ts:223](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L223) ___ @@ -870,7 +897,7 @@ BaseTransaction.toJSON #### Defined in -[tx/src/eip4844Transaction.ts:517](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L517) +[tx/src/eip4844Transaction.ts:543](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L543) ___ @@ -890,7 +917,7 @@ BaseTransaction.verifySignature #### Defined in -[tx/src/baseTransaction.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L259) +[tx/src/baseTransaction.ts:266](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L266) ___ @@ -915,7 +942,7 @@ a BlobEIP4844Transaction #### Defined in -[tx/src/eip4844Transaction.ts:337](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L337) +[tx/src/eip4844Transaction.ts:358](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L358) ___ @@ -941,7 +968,7 @@ access_list, max_fee_per_data_gas, blob_versioned_hashes, y_parity, r, s])` #### Defined in -[tx/src/eip4844Transaction.ts:246](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L246) +[tx/src/eip4844Transaction.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L259) ___ @@ -962,7 +989,7 @@ ___ #### Defined in -[tx/src/eip4844Transaction.ts:191](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L191) +[tx/src/eip4844Transaction.ts:192](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L192) ___ @@ -988,7 +1015,7 @@ accessList, signatureYParity, signatureR, signatureS]` #### Defined in -[tx/src/eip4844Transaction.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L272) +[tx/src/eip4844Transaction.ts:289](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L289) ___ @@ -1014,4 +1041,4 @@ the "minimal" representation of a BlobEIP4844Transaction (i.e. transaction objec #### Defined in -[tx/src/eip4844Transaction.ts:226](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L226) +[tx/src/eip4844Transaction.ts:235](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip4844Transaction.ts#L235) diff --git a/packages/tx/docs/classes/FeeMarketEIP1559Transaction.md b/packages/tx/docs/classes/FeeMarketEIP1559Transaction.md index c77979488..ed999030c 100644 --- a/packages/tx/docs/classes/FeeMarketEIP1559Transaction.md +++ b/packages/tx/docs/classes/FeeMarketEIP1559Transaction.md @@ -47,6 +47,7 @@ Typed transaction with a new gas fee market mechanism - [errorStr](FeeMarketEIP1559Transaction.md#errorstr) - [getBaseFee](FeeMarketEIP1559Transaction.md#getbasefee) - [getDataFee](FeeMarketEIP1559Transaction.md#getdatafee) +- [getEffectivePriorityFee](FeeMarketEIP1559Transaction.md#geteffectivepriorityfee) - [getHashedMessageToSign](FeeMarketEIP1559Transaction.md#gethashedmessagetosign) - [getMessageToSign](FeeMarketEIP1559Transaction.md#getmessagetosign) - [getMessageToVerifySignature](FeeMarketEIP1559Transaction.md#getmessagetoverifysignature) @@ -332,7 +333,7 @@ BaseTransaction.addSignature #### Defined in -[tx/src/eip1559Transaction.ts:311](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L311) +[tx/src/eip1559Transaction.ts:319](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L319) ___ @@ -352,7 +353,7 @@ BaseTransaction.errorStr #### Defined in -[tx/src/eip1559Transaction.ts:359](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L359) +[tx/src/eip1559Transaction.ts:367](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L367) ___ @@ -396,6 +397,32 @@ BaseTransaction.getDataFee ___ +### getEffectivePriorityFee + +▸ **getEffectivePriorityFee**(`baseFee`): `bigint` + +Returns the minimum of calculated priority fee (from maxFeePerGas and baseFee) and maxPriorityFeePerGas + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `baseFee` | `bigint` | Base fee retrieved from block | + +#### Returns + +`bigint` + +#### Overrides + +BaseTransaction.getEffectivePriorityFee + +#### Defined in + +[tx/src/eip1559Transaction.ts:213](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L213) + +___ + ### getHashedMessageToSign ▸ **getHashedMessageToSign**(): `Uint8Array` @@ -416,7 +443,7 @@ BaseTransaction.getHashedMessageToSign #### Defined in -[tx/src/eip1559Transaction.ts:283](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L283) +[tx/src/eip1559Transaction.ts:291](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L291) ___ @@ -444,7 +471,7 @@ BaseTransaction.getMessageToSign #### Defined in -[tx/src/eip1559Transaction.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L272) +[tx/src/eip1559Transaction.ts:280](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L280) ___ @@ -464,7 +491,7 @@ BaseTransaction.getMessageToVerifySignature #### Defined in -[tx/src/eip1559Transaction.ts:300](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L300) +[tx/src/eip1559Transaction.ts:308](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L308) ___ @@ -484,7 +511,7 @@ BaseTransaction.getSenderAddress #### Defined in -[tx/src/baseTransaction.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L272) +[tx/src/baseTransaction.ts:279](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L279) ___ @@ -504,7 +531,7 @@ BaseTransaction.getSenderPublicKey #### Defined in -[tx/src/eip1559Transaction.ts:307](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L307) +[tx/src/eip1559Transaction.ts:315](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L315) ___ @@ -530,7 +557,7 @@ BaseTransaction.getUpfrontCost #### Defined in -[tx/src/eip1559Transaction.ts:213](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L213) +[tx/src/eip1559Transaction.ts:221](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L221) ___ @@ -575,7 +602,7 @@ BaseTransaction.hash #### Defined in -[tx/src/eip1559Transaction.ts:293](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L293) +[tx/src/eip1559Transaction.ts:301](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L301) ___ @@ -593,7 +620,7 @@ BaseTransaction.isSigned #### Defined in -[tx/src/baseTransaction.ts:247](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L247) +[tx/src/baseTransaction.ts:254](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L254) ___ @@ -645,7 +672,7 @@ BaseTransaction.raw #### Defined in -[tx/src/eip1559Transaction.ts:230](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L230) +[tx/src/eip1559Transaction.ts:238](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L238) ___ @@ -672,7 +699,7 @@ BaseTransaction.serialize #### Defined in -[tx/src/eip1559Transaction.ts:257](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L257) +[tx/src/eip1559Transaction.ts:265](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L265) ___ @@ -704,7 +731,7 @@ BaseTransaction.sign #### Defined in -[tx/src/baseTransaction.ts:290](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L290) +[tx/src/baseTransaction.ts:297](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L297) ___ @@ -763,7 +790,7 @@ BaseTransaction.toCreationAddress #### Defined in -[tx/src/baseTransaction.ts:216](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L216) +[tx/src/baseTransaction.ts:223](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L223) ___ @@ -783,7 +810,7 @@ BaseTransaction.toJSON #### Defined in -[tx/src/eip1559Transaction.ts:343](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L343) +[tx/src/eip1559Transaction.ts:351](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/eip1559Transaction.ts#L351) ___ @@ -803,7 +830,7 @@ BaseTransaction.verifySignature #### Defined in -[tx/src/baseTransaction.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L259) +[tx/src/baseTransaction.ts:266](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L266) ___ diff --git a/packages/tx/docs/classes/LegacyTransaction.md b/packages/tx/docs/classes/LegacyTransaction.md index f3bf0e469..bedeb9e01 100644 --- a/packages/tx/docs/classes/LegacyTransaction.md +++ b/packages/tx/docs/classes/LegacyTransaction.md @@ -40,6 +40,7 @@ An Ethereum non-typed (legacy) transaction - [errorStr](LegacyTransaction.md#errorstr) - [getBaseFee](LegacyTransaction.md#getbasefee) - [getDataFee](LegacyTransaction.md#getdatafee) +- [getEffectivePriorityFee](LegacyTransaction.md#geteffectivepriorityfee) - [getHashedMessageToSign](LegacyTransaction.md#gethashedmessagetosign) - [getMessageToSign](LegacyTransaction.md#getmessagetosign) - [getMessageToVerifySignature](LegacyTransaction.md#getmessagetoverifysignature) @@ -285,7 +286,7 @@ BaseTransaction.addSignature #### Defined in -[tx/src/legacyTransaction.ts:273](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L273) +[tx/src/legacyTransaction.ts:277](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L277) ___ @@ -305,7 +306,7 @@ BaseTransaction.errorStr #### Defined in -[tx/src/legacyTransaction.ts:363](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L363) +[tx/src/legacyTransaction.ts:367](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L367) ___ @@ -345,7 +346,31 @@ BaseTransaction.getDataFee #### Defined in -[tx/src/legacyTransaction.ts:234](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L234) +[tx/src/legacyTransaction.ts:238](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L238) + +___ + +### getEffectivePriorityFee + +▸ **getEffectivePriorityFee**(`baseFee?`): `bigint` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `baseFee?` | `bigint` | + +#### Returns + +`bigint` + +#### Overrides + +BaseTransaction.getEffectivePriorityFee + +#### Defined in + +[tx/src/legacyTransaction.ts:150](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L150) ___ @@ -366,7 +391,7 @@ BaseTransaction.getHashedMessageToSign #### Defined in -[tx/src/legacyTransaction.ts:226](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L226) +[tx/src/legacyTransaction.ts:230](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L230) ___ @@ -396,7 +421,7 @@ BaseTransaction.getMessageToSign #### Defined in -[tx/src/legacyTransaction.ts:203](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L203) +[tx/src/legacyTransaction.ts:207](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L207) ___ @@ -416,7 +441,7 @@ BaseTransaction.getMessageToVerifySignature #### Defined in -[tx/src/legacyTransaction.ts:258](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L258) +[tx/src/legacyTransaction.ts:262](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L262) ___ @@ -436,7 +461,7 @@ BaseTransaction.getSenderAddress #### Defined in -[tx/src/baseTransaction.ts:272](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L272) +[tx/src/baseTransaction.ts:279](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L279) ___ @@ -456,7 +481,7 @@ BaseTransaction.getSenderPublicKey #### Defined in -[tx/src/legacyTransaction.ts:269](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L269) +[tx/src/legacyTransaction.ts:273](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L273) ___ @@ -476,7 +501,7 @@ BaseTransaction.getUpfrontCost #### Defined in -[tx/src/legacyTransaction.ts:241](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L241) +[tx/src/legacyTransaction.ts:245](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L245) ___ @@ -521,7 +546,7 @@ BaseTransaction.hash #### Defined in -[tx/src/legacyTransaction.ts:251](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L251) +[tx/src/legacyTransaction.ts:255](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L255) ___ @@ -539,7 +564,7 @@ BaseTransaction.isSigned #### Defined in -[tx/src/baseTransaction.ts:247](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L247) +[tx/src/baseTransaction.ts:254](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L254) ___ @@ -591,7 +616,7 @@ BaseTransaction.raw #### Defined in -[tx/src/legacyTransaction.ts:163](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L163) +[tx/src/legacyTransaction.ts:167](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L167) ___ @@ -617,7 +642,7 @@ BaseTransaction.serialize #### Defined in -[tx/src/legacyTransaction.ts:186](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L186) +[tx/src/legacyTransaction.ts:190](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L190) ___ @@ -649,7 +674,7 @@ BaseTransaction.sign #### Defined in -[tx/src/baseTransaction.ts:290](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L290) +[tx/src/baseTransaction.ts:297](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L297) ___ @@ -708,7 +733,7 @@ BaseTransaction.toCreationAddress #### Defined in -[tx/src/baseTransaction.ts:216](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L216) +[tx/src/baseTransaction.ts:223](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L223) ___ @@ -728,7 +753,7 @@ BaseTransaction.toJSON #### Defined in -[tx/src/legacyTransaction.ts:306](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L306) +[tx/src/legacyTransaction.ts:310](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/legacyTransaction.ts#L310) ___ @@ -748,7 +773,7 @@ BaseTransaction.verifySignature #### Defined in -[tx/src/baseTransaction.ts:259](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L259) +[tx/src/baseTransaction.ts:266](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/src/baseTransaction.ts#L266) ___ diff --git a/packages/tx/examples/blobTx.ts b/packages/tx/examples/blobTx.ts index 86e9a0e7e..9600e2218 100644 --- a/packages/tx/examples/blobTx.ts +++ b/packages/tx/examples/blobTx.ts @@ -1,11 +1,10 @@ import { Chain, Common, Hardfork } from '@ethereumjs/common' import { BlobEIP4844Transaction } from '@ethereumjs/tx' -import { bytesToHex, initKZG } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { bytesToHex } from '@ethereumjs/util' +import { loadKZG } from 'kzg-wasm' const main = async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const common = new Common({ chain: Chain.Mainnet, diff --git a/packages/tx/examples/initKzg.ts b/packages/tx/examples/initKzg.ts index 94c2905ab..de6276d97 100644 --- a/packages/tx/examples/initKzg.ts +++ b/packages/tx/examples/initKzg.ts @@ -1,10 +1,8 @@ -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { Chain, Common, Hardfork } from '@ethereumjs/common' -import { initKZG } from '@ethereumjs/util' const main = async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() // Instantiate `common` const common = new Common({ diff --git a/packages/tx/package.json b/packages/tx/package.json index eec17eecf..2f2bd794e 100644 --- a/packages/tx/package.json +++ b/packages/tx/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/tx", - "version": "5.2.1", + "version": "5.3.0", "description": "Implementation of the various Ethereum Transaction Types", "keywords": [ "ethereum", @@ -52,20 +52,20 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --config=./vitest.config.browser.ts --browser.name=chrome --browser.headless", + "test:browser": "npx vitest run --config=./vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/common": "^4.2.0", + "@ethereumjs/common": "^4.3.0", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/util": "^9.0.3", "ethereum-cryptography": "^2.1.3" }, "devDependencies": { "@types/minimist": "^1.2.0", "@types/node-dir": "^0.0.34", - "kzg-wasm": "^0.2.0", + "kzg-wasm": "^0.4.0", "minimist": "^1.2.0", "node-dir": "^0.1.16" }, diff --git a/packages/tx/src/baseTransaction.ts b/packages/tx/src/baseTransaction.ts index fd56e6760..7540c7795 100644 --- a/packages/tx/src/baseTransaction.ts +++ b/packages/tx/src/baseTransaction.ts @@ -83,15 +83,15 @@ export abstract class BaseTransaction this.txOptions = opts const toB = toBytes(to === '' ? '0x' : to) - const vB = toBytes(v === '' ? '0x' : v) - const rB = toBytes(r === '' ? '0x' : r) - const sB = toBytes(s === '' ? '0x' : s) + const vB = toBytes(v) + const rB = toBytes(r) + const sB = toBytes(s) - this.nonce = bytesToBigInt(toBytes(nonce === '' ? '0x' : nonce)) - this.gasLimit = bytesToBigInt(toBytes(gasLimit === '' ? '0x' : gasLimit)) + this.nonce = bytesToBigInt(toBytes(nonce)) + this.gasLimit = bytesToBigInt(toBytes(gasLimit)) this.to = toB.length > 0 ? new Address(toB) : undefined - this.value = bytesToBigInt(toBytes(value === '' ? '0x' : value)) - this.data = toBytes(data === '' ? '0x' : data) + this.value = bytesToBigInt(toBytes(value)) + this.data = toBytes(data) this.v = vB.length > 0 ? bytesToBigInt(vB) : undefined this.r = rB.length > 0 ? bytesToBigInt(rB) : undefined diff --git a/packages/tx/src/eip1559Transaction.ts b/packages/tx/src/eip1559Transaction.ts index f0332f784..265c7c69b 100644 --- a/packages/tx/src/eip1559Transaction.ts +++ b/packages/tx/src/eip1559Transaction.ts @@ -166,10 +166,8 @@ export class FeeMarketEIP1559Transaction extends BaseTransaction acc + cur)) - txData.kzgCommitments = blobsToCommitments(txData.blobs as Uint8Array[]) + txData.kzgCommitments = blobsToCommitments(kzg, txData.blobs as Uint8Array[]) txData.blobVersionedHashes = commitmentsToVersionedHashes( txData.kzgCommitments as Uint8Array[] ) txData.kzgProofs = blobsToProofs( + kzg, txData.blobs as Uint8Array[], txData.kzgCommitments as Uint8Array[] ) @@ -237,7 +242,9 @@ export class BlobEIP4844Transaction extends BaseTransaction { this.common = this._validateTxV(this.v, opts.common) this.keccakFunction = this.common.customCrypto.keccak256 ?? keccak256 - this.gasPrice = bytesToBigInt(toBytes(txData.gasPrice === '' ? '0x' : txData.gasPrice)) + this.gasPrice = bytesToBigInt(toBytes(txData.gasPrice)) if (this.gasPrice * this.gasLimit > MAX_INTEGER) { const msg = this._errorMsg('gas limit * gasPrice cannot exceed MAX_INTEGER (2^256-1)') diff --git a/packages/tx/src/types.ts b/packages/tx/src/types.ts index 6c9272fc9..c667096c3 100644 --- a/packages/tx/src/types.ts +++ b/packages/tx/src/types.ts @@ -254,7 +254,7 @@ export type LegacyTxData = { /** * The transaction's the address is sent to. */ - to?: AddressLike + to?: AddressLike | '' /** * The amount of Ether sent. diff --git a/packages/tx/src/util.ts b/packages/tx/src/util.ts index cbc3c97d3..4bd370fa2 100644 --- a/packages/tx/src/util.ts +++ b/packages/tx/src/util.ts @@ -1,4 +1,4 @@ -import { bytesToHex, hexToBytes, setLengthLeft } from '@ethereumjs/util' +import { type PrefixedHexString, bytesToHex, hexToBytes, setLengthLeft } from '@ethereumjs/util' import { isAccessList } from './types.js' @@ -42,7 +42,7 @@ export class AccessLists { for (let i = 0; i < bufferAccessList.length; i++) { const data = bufferAccessList[i] const address = bytesToHex(data[0]) - const storageKeys: string[] = [] + const storageKeys: PrefixedHexString[] = [] for (let item = 0; item < data[1].length; item++) { storageKeys.push(bytesToHex(data[1][item])) } diff --git a/packages/tx/test/base.spec.ts b/packages/tx/test/base.spec.ts index c58ab8456..742d1ff57 100644 --- a/packages/tx/test/base.spec.ts +++ b/packages/tx/test/base.spec.ts @@ -25,6 +25,7 @@ import eip2930Fixtures from './json/eip2930txs.json' import legacyFixtures from './json/txs.json' import type { BaseTransaction } from '../src/baseTransaction.js' +import type { AccessListEIP2930TxData, FeeMarketEIP1559TxData, LegacyTxData } from '../src/index.js' describe('[BaseTransaction]', () => { // EIP-2930 is not enabled in Common by default (2021-03-06) @@ -32,17 +33,21 @@ describe('[BaseTransaction]', () => { const legacyTxs: BaseTransaction[] = [] for (const tx of legacyFixtures.slice(0, 4)) { - legacyTxs.push(LegacyTransaction.fromTxData(tx.data, { common })) + legacyTxs.push(LegacyTransaction.fromTxData(tx.data as LegacyTxData, { common })) } const eip2930Txs: BaseTransaction[] = [] for (const tx of eip2930Fixtures) { - eip2930Txs.push(AccessListEIP2930Transaction.fromTxData(tx.data, { common })) + eip2930Txs.push( + AccessListEIP2930Transaction.fromTxData(tx.data as AccessListEIP2930TxData, { common }) + ) } const eip1559Txs: BaseTransaction[] = [] for (const tx of eip1559Fixtures) { - eip1559Txs.push(FeeMarketEIP1559Transaction.fromTxData(tx.data, { common })) + eip1559Txs.push( + FeeMarketEIP1559Transaction.fromTxData(tx.data as FeeMarketEIP1559TxData, { common }) + ) } const zero = new Uint8Array(0) @@ -382,15 +387,15 @@ describe('[BaseTransaction]', () => { it('initialization with defaults', () => { const bufferZero = toBytes('0x') const tx = LegacyTransaction.fromTxData({ - nonce: '', - gasLimit: '', - gasPrice: '', - to: '', - value: '', - data: '', - v: '', - r: '', - s: '', + nonce: undefined, + gasLimit: undefined, + gasPrice: undefined, + to: undefined, + value: undefined, + data: undefined, + v: undefined, + r: undefined, + s: undefined, }) assert.equal(tx.v, undefined) assert.equal(tx.r, undefined) diff --git a/packages/tx/test/eip4844.spec.ts b/packages/tx/test/eip4844.spec.ts index a6a76952f..0f5dc907a 100644 --- a/packages/tx/test/eip4844.spec.ts +++ b/packages/tx/test/eip4844.spec.ts @@ -10,10 +10,9 @@ import { equalsBytes, getBlobs, hexToBytes, - initKZG, + randomBytes, } from '@ethereumjs/util' -import { randomBytes } from 'crypto' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, beforeAll, describe, it } from 'vitest' import gethGenesis from '../../block/test/testdata/4844-hardfork.json' @@ -21,12 +20,13 @@ import { BlobEIP4844Transaction, TransactionFactory } from '../src/index.js' import blobTx from './json/serialized4844tx.json' +import type { Kzg } from '@ethereumjs/util' + const pk = randomBytes(32) describe('EIP4844 addSignature tests', () => { let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -90,8 +90,7 @@ describe('EIP4844 addSignature tests', () => { describe('EIP4844 constructor tests - valid scenarios', () => { let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -129,8 +128,7 @@ describe('EIP4844 constructor tests - valid scenarios', () => { describe('fromTxData using from a json', () => { let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -201,8 +199,7 @@ describe('fromTxData using from a json', () => { describe('EIP4844 constructor tests - invalid scenarios', () => { let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -256,10 +253,10 @@ describe('EIP4844 constructor tests - invalid scenarios', () => { }) describe('Network wrapper tests', () => { + let kzg: Kzg let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -268,9 +265,9 @@ describe('Network wrapper tests', () => { }) it('should work', async () => { const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const blobVersionedHashes = commitmentsToVersionedHashes(commitments) - const proofs = blobsToProofs(blobs, commitments) + const proofs = blobsToProofs(kzg, blobs, commitments) const unsignedTx = BlobEIP4844Transaction.fromTxData( { blobVersionedHashes, @@ -502,8 +499,7 @@ describe('Network wrapper tests', () => { describe('hash() and signature verification', () => { let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -551,8 +547,7 @@ describe('hash() and signature verification', () => { }) it('getEffectivePriorityFee()', async () => { - const kzg = await createKZG() - initKZG(kzg, '') + const kzg = await loadKZG() const common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -577,10 +572,10 @@ it('getEffectivePriorityFee()', async () => { }) describe('Network wrapper deserialization test', () => { + let kzg: Kzg let common: Common beforeAll(async () => { - const kzg = await createKZG() - initKZG(kzg) + kzg = await loadKZG() common = Common.fromGethGenesis(gethGenesis, { chain: 'customChain', hardfork: Hardfork.Cancun, @@ -619,8 +614,8 @@ describe('Network wrapper deserialization test', () => { const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) - const proofs = blobsToProofs(blobs, commitments) + const commitments = blobsToCommitments(kzg, blobs) + const proofs = blobsToProofs(kzg, blobs, commitments) /* eslint-disable @typescript-eslint/no-use-before-define */ const wrapper = hexToBytes(blobTx.tx) diff --git a/packages/tx/test/fromRpc.spec.ts b/packages/tx/test/fromRpc.spec.ts index 9dcadb2b2..a0940408b 100644 --- a/packages/tx/test/fromRpc.spec.ts +++ b/packages/tx/test/fromRpc.spec.ts @@ -9,6 +9,8 @@ import optimismTx from './json/optimismTx.json' import rpcTx from './json/rpcTx.json' import v0Tx from './json/v0tx.json' +import type { TypedTxData } from '../src/index.js' + const txTypes = [ TransactionType.Legacy, TransactionType.AccessListEIP2930, @@ -77,7 +79,7 @@ describe('fromRPC: interpret v/r/s vals of 0x0 as undefined for Optimism system it('should work', async () => { for (const txType of txTypes) { ;(optimismTx as any).type = txType - const tx = await TransactionFactory.fromRPC(optimismTx) + const tx = await TransactionFactory.fromRPC(optimismTx as TypedTxData) assert.ok(tx.v === undefined) assert.ok(tx.s === undefined) assert.ok(tx.r === undefined) @@ -96,7 +98,7 @@ describe('fromRPC: ensure `v="0x0"` is correctly decoded for signed txs', () => continue } ;(v0Tx as any).type = txType - const tx = await TransactionFactory.fromRPC(v0Tx) + const tx = await TransactionFactory.fromRPC(v0Tx as TypedTxData) assert.ok(tx.isSigned()) } }) diff --git a/packages/tx/test/legacy.spec.ts b/packages/tx/test/legacy.spec.ts index dfd17b6ed..8390f8b3b 100644 --- a/packages/tx/test/legacy.spec.ts +++ b/packages/tx/test/legacy.spec.ts @@ -60,7 +60,7 @@ describe('[Transaction]', () => { 'should initialize on a pre-Berlin Harfork (EIP-2930 not activated)' ) - const txData = txFixtures[3].raw.map(toBytes) + const txData = txFixtures[3].raw.map(hexToBytes) txData[6] = intToBytes(45) // v with 0-parity and chain ID 5 let tx = LegacyTransaction.fromValuesArray(txData) assert.ok( @@ -94,7 +94,7 @@ describe('[Transaction]', () => { it('Initialization -> decode with fromValuesArray()', () => { for (const tx of txFixtures.slice(0, 4)) { - const txData = tx.raw.map(toBytes) + const txData = tx.raw.map(hexToBytes) const pt = LegacyTransaction.fromValuesArray(txData) assert.equal(bytesToHex(unpadBytes(toBytes(pt.nonce))), tx.raw[0]) @@ -112,7 +112,7 @@ describe('[Transaction]', () => { }) it('Initialization -> should accept lesser r values', () => { - const tx = LegacyTransaction.fromTxData({ r: bytesToBigInt(toBytes('0x0005')) }) + const tx = LegacyTransaction.fromTxData({ r: bytesToBigInt(hexToBytes('0x0005')) }) assert.equal(tx.r!.toString(16), '5') }) @@ -185,10 +185,10 @@ describe('[Transaction]', () => { let tx = LegacyTransaction.fromTxData({}) assert.equal(tx.getDataFee(), BigInt(0)) - tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(toBytes)) + tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(hexToBytes)) assert.equal(tx.getDataFee(), BigInt(1716)) - tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(toBytes), { freeze: false }) + tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(hexToBytes), { freeze: false }) assert.equal(tx.getDataFee(), BigInt(1716)) }) @@ -197,7 +197,7 @@ describe('[Transaction]', () => { let tx = LegacyTransaction.fromTxData({}, { common }) assert.equal(tx.getDataFee(), BigInt(0)) - tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(toBytes), { + tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(hexToBytes), { common, }) assert.equal(tx.getDataFee(), BigInt(1716)) @@ -205,7 +205,7 @@ describe('[Transaction]', () => { it('getDataFee() -> should invalidate cached value on hardfork change', () => { const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Byzantium }) - const tx = LegacyTransaction.fromValuesArray(txFixtures[0].raw.map(toBytes), { + const tx = LegacyTransaction.fromValuesArray(txFixtures[0].raw.map(hexToBytes), { common, }) assert.equal(tx.getDataFee(), BigInt(656)) @@ -257,7 +257,7 @@ describe('[Transaction]', () => { hardfork: Hardfork.TangerineWhistle, }) - let tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.slice(0, 6).map(toBytes), { + let tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.slice(0, 6).map(hexToBytes), { common, }) assert.throws( @@ -268,7 +268,7 @@ describe('[Transaction]', () => { undefined, 'should throw calling hash with unsigned tx' ) - tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(toBytes), { + tx = LegacyTransaction.fromValuesArray(txFixtures[3].raw.map(hexToBytes), { common, }) assert.deepEqual( @@ -287,7 +287,7 @@ describe('[Transaction]', () => { }) it('hash() -> with defined chainId', () => { - const tx = LegacyTransaction.fromValuesArray(txFixtures[4].raw.map(toBytes)) + const tx = LegacyTransaction.fromValuesArray(txFixtures[4].raw.map(hexToBytes)) assert.equal( bytesToHex(tx.hash()), '0x0f09dc98ea85b7872f4409131a790b91e7540953992886fc268b7ba5c96820e4' @@ -304,7 +304,7 @@ describe('[Transaction]', () => { it("getHashedMessageToSign(), getSenderPublicKey() (implicit call) -> verify EIP155 signature based on Vitalik's tests", () => { for (const tx of txFixturesEip155) { - const pt = LegacyTransaction.fromSerializedTx(toBytes(tx.rlp)) + const pt = LegacyTransaction.fromSerializedTx(hexToBytes(tx.rlp)) assert.equal(bytesToHex(pt.getHashedMessageToSign()), '0x' + tx.hash) assert.equal(bytesToHex(pt.serialize()), tx.rlp) assert.equal(pt.getSenderAddress().toString(), '0x' + tx.sender) @@ -324,7 +324,7 @@ describe('[Transaction]', () => { const privateKey = hexToBytes( '0x4646464646464646464646464646464646464646464646464646464646464646' ) - const pt = LegacyTransaction.fromValuesArray(txRaw.map(toBytes)) + const pt = LegacyTransaction.fromValuesArray(txRaw.map(hexToBytes)) // Note that Vitalik's example has a very similar value denoted "signing data". // It's not the output of `serialize()`, but the pre-image of the hash returned by `tx.hash(false)`. @@ -347,7 +347,7 @@ describe('[Transaction]', () => { it('sign(), getSenderPublicKey() (implicit call) -> EIP155 hashing when singing', () => { const common = new Common({ chain: 1, hardfork: Hardfork.Petersburg }) for (const txData of txFixtures.slice(0, 3)) { - const tx = LegacyTransaction.fromValuesArray(txData.raw.slice(0, 6).map(toBytes), { + const tx = LegacyTransaction.fromValuesArray(txData.raw.slice(0, 6).map(hexToBytes), { common, }) @@ -375,7 +375,7 @@ describe('[Transaction]', () => { '0xDE3128752F183E8930D7F00A2AAA302DCB5E700B2CBA2D8CA5795660F07DEFD5' ) const common = Common.custom({ chainId: 3 }) - const tx = LegacyTransaction.fromValuesArray(txRaw.map(toBytes), { common }) + const tx = LegacyTransaction.fromValuesArray(txRaw.map(hexToBytes), { common }) const signedTx = tx.sign(privateKey) assert.equal( bytesToHex(signedTx.serialize()), diff --git a/packages/tx/vitest.browser.config.mts b/packages/tx/vitest.browser.config.mts new file mode 100644 index 000000000..c831ac0e7 --- /dev/null +++ b/packages/tx/vitest.browser.config.mts @@ -0,0 +1,17 @@ + +import { configDefaults, defineConfig, mergeConfig } from 'vitest/config' +import baseConfig from '../../config/vitest.browser.config.mts' + +export default mergeConfig( + baseConfig, + defineConfig({ + test: { + exclude: [ + ...configDefaults.exclude, + // default export for minimist + // wrong ethereum-tests path reference (../ is stripped) + 'test/transactionRunner.spec.ts', + ], + }, + }) +) \ No newline at end of file diff --git a/packages/util/CHANGELOG.md b/packages/util/CHANGELOG.md index 8c8d80377..2e4fb43ec 100644 --- a/packages/util/CHANGELOG.md +++ b/packages/util/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 9.0.3 - 2024-03-05 + +- Allow optional `trustedSetupPath` for the `initKZG()` method, PR [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296) + ## 9.0.2 - 2024-02-08 ### Self-Contained (and Working 🙂) README Examples diff --git a/packages/util/docs/README.md b/packages/util/docs/README.md index 685c05a52..8333d27d8 100644 --- a/packages/util/docs/README.md +++ b/packages/util/docs/README.md @@ -102,6 +102,8 @@ - [addHexPrefix](README.md#addhexprefix) - [arrayContainsArray](README.md#arraycontainsarray) - [bigInt64ToBytes](README.md#bigint64tobytes) +- [bigIntMax](README.md#bigintmax) +- [bigIntMin](README.md#bigintmin) - [bigIntToBytes](README.md#biginttobytes) - [bigIntToHex](README.md#biginttohex) - [bigIntToUnpaddedBytes](README.md#biginttounpaddedbytes) @@ -933,7 +935,51 @@ A Uint8Array of length 8 containing the bigint. #### Defined in -[packages/util/src/bytes.ts:517](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L517) +[packages/util/src/bytes.ts:529](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L529) + +___ + +### bigIntMax + +▸ **bigIntMax**(...`args`): `bigint` + +Calculates max bigint from an array of bigints + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `...args` | `bigint`[] | array of bigints | + +#### Returns + +`bigint` + +#### Defined in + +[packages/util/src/bytes.ts:409](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L409) + +___ + +### bigIntMin + +▸ **bigIntMin**(...`args`): `bigint` + +Calculates min BigInt from an array of BigInts + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `...args` | `bigint`[] | array of bigints | + +#### Returns + +`bigint` + +#### Defined in + +[packages/util/src/bytes.ts:415](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L415) ___ @@ -1002,7 +1048,7 @@ Convert value from bigint to an unpadded Uint8Array #### Defined in -[packages/util/src/bytes.ts:411](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L411) +[packages/util/src/bytes.ts:423](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L423) ___ @@ -1093,7 +1139,7 @@ The 64-bit bigint read from the input Uint8Array. #### Defined in -[packages/util/src/bytes.ts:490](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L490) +[packages/util/src/bytes.ts:502](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L502) ___ @@ -1166,7 +1212,7 @@ The 32-bit integer read from the input Uint8Array. #### Defined in -[packages/util/src/bytes.ts:476](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L476) +[packages/util/src/bytes.ts:488](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L488) ___ @@ -1285,7 +1331,7 @@ A positive number if value1 is larger than value2, #### Defined in -[packages/util/src/bytes.ts:434](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L434) +[packages/util/src/bytes.ts:446](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L446) ___ @@ -1339,7 +1385,7 @@ works like `Buffer.concat` #### Defined in -[packages/util/src/bytes.ts:458](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L458) +[packages/util/src/bytes.ts:470](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L470) ___ @@ -1792,14 +1838,14 @@ ___ ### initKZG -▸ **initKZG**(`kzgLib`, `trustedSetupPath`): `void` +▸ **initKZG**(`kzgLib`, `trustedSetupPath?`): `void` #### Parameters | Name | Type | Description | | :------ | :------ | :------ | | `kzgLib` | [`Kzg`](interfaces/Kzg.md) | a KZG implementation (defaults to c-kzg) | -| `trustedSetupPath` | `string` | the full path (e.g. "/home/linux/devnet4.txt") to a kzg trusted setup text file | +| `trustedSetupPath?` | `string` | the full path (e.g. "/home/linux/devnet4.txt") to a kzg trusted setup text file | #### Returns @@ -1834,7 +1880,7 @@ A Uint8Array of length 4 containing the integer. #### Defined in -[packages/util/src/bytes.ts:504](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L504) +[packages/util/src/bytes.ts:516](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L516) ___ @@ -1901,7 +1947,7 @@ Convert value from number to an unpadded Uint8Array #### Defined in -[packages/util/src/bytes.ts:421](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L421) +[packages/util/src/bytes.ts:433](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L433) ___ @@ -2258,7 +2304,7 @@ A Uint8Array of random bytes of specified length. #### Defined in -[packages/util/src/bytes.ts:446](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L446) +[packages/util/src/bytes.ts:458](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/util/src/bytes.ts#L458) ___ diff --git a/packages/util/docs/interfaces/Kzg.md b/packages/util/docs/interfaces/Kzg.md index 61308665c..bbe40b452 100644 --- a/packages/util/docs/interfaces/Kzg.md +++ b/packages/util/docs/interfaces/Kzg.md @@ -59,13 +59,13 @@ ___ ### loadTrustedSetup -▸ **loadTrustedSetup**(`filePath`): `void` +▸ **loadTrustedSetup**(`filePath?`): `void` #### Parameters | Name | Type | | :------ | :------ | -| `filePath` | `string` | +| `filePath?` | `string` | #### Returns diff --git a/packages/util/package.json b/packages/util/package.json index 9a7b4ae32..9f3b7982c 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/util", - "version": "9.0.2", + "version": "9.0.3", "description": "A collection of utility functions for Ethereum", "keywords": [ "ethereum", @@ -86,7 +86,7 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node && npm run test:browser", - "test:browser": "npx vitest run --config=./vitest.config.browser.ts --browser.name=chrome --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "npx vitest run", "tsc": "../../config/cli/ts-compile.sh" }, @@ -95,7 +95,7 @@ "ethereum-cryptography": "^2.1.3" }, "devDependencies": { - "kzg-wasm": "^0.2.0" + "kzg-wasm": "^0.4.0" }, "engines": { "node": ">=18" diff --git a/packages/util/src/account.ts b/packages/util/src/account.ts index ad2551a32..b74b493f7 100644 --- a/packages/util/src/account.ts +++ b/packages/util/src/account.ts @@ -6,9 +6,11 @@ import { bigIntToUnpaddedBytes, bytesToBigInt, bytesToHex, + bytesToInt, concatBytes, equalsBytes, hexToBytes, + intToUnpaddedBytes, toBytes, utf8ToBytes, zeros, @@ -17,7 +19,7 @@ import { BIGINT_0, KECCAK256_NULL, KECCAK256_RLP } from './constants.js' import { assertIsBytes, assertIsHexString, assertIsString } from './helpers.js' import { stripHexPrefix } from './internal.js' -import type { BigIntLike, BytesLike } from './types.js' +import type { BigIntLike, BytesLike, PrefixedHexString } from './types.js' export interface AccountData { nonce?: BigIntLike @@ -26,16 +28,107 @@ export interface AccountData { codeHash?: BytesLike } +export interface PartialAccountData { + nonce?: BigIntLike | null + balance?: BigIntLike | null + storageRoot?: BytesLike | null + codeHash?: BytesLike | null + codeSize?: BigIntLike | null + version?: BigIntLike | null +} + export type AccountBodyBytes = [Uint8Array, Uint8Array, Uint8Array, Uint8Array] +/** + * Account class to load and maintain the basic account objects. + * Supports partial loading and access required for verkle with null + * as the placeholder. + * + * Note: passing undefined in constructor is different from null + * While undefined leads to default assignment, null is retained + * to track the information not available/loaded because of partial + * witness access + */ export class Account { - nonce: bigint - balance: bigint - storageRoot: Uint8Array - codeHash: Uint8Array + _nonce: bigint | null = null + _balance: bigint | null = null + _storageRoot: Uint8Array | null = null + _codeHash: Uint8Array | null = null + // codeSize and version is separately stored in VKT + _codeSize: number | null = null + _version: number | null = null + + get version() { + if (this._version !== null) { + return this._version + } else { + throw Error(`version=${this._version} not loaded`) + } + } + set version(_version: number) { + this._version = _version + } + + get nonce() { + if (this._nonce !== null) { + return this._nonce + } else { + throw Error(`nonce=${this._nonce} not loaded`) + } + } + set nonce(_nonce: bigint) { + this._nonce = _nonce + } + + get balance() { + if (this._balance !== null) { + return this._balance + } else { + throw Error(`bonce=${this._balance} not loaded`) + } + } + set balance(_balance: bigint) { + this._balance = _balance + } + + get storageRoot() { + if (this._storageRoot !== null) { + return this._storageRoot + } else { + throw Error(`storageRoot=${this._storageRoot} not loaded`) + } + } + set storageRoot(_storageRoot: Uint8Array) { + this._storageRoot = _storageRoot + } + + get codeHash() { + if (this._codeHash !== null) { + return this._codeHash + } else { + throw Error(`codeHash=${this._codeHash} not loaded`) + } + } + set codeHash(_codeHash: Uint8Array) { + this._codeHash = _codeHash + } + + get codeSize() { + if (this._codeSize !== null) { + return this._codeSize + } else { + throw Error(`codeHash=${this._codeSize} not loaded`) + } + } + set codeSize(_codeSize: number) { + this._codeSize = _codeSize + } static fromAccountData(accountData: AccountData) { const { nonce, balance, storageRoot, codeHash } = accountData + if (nonce === null || balance === null || storageRoot === null || codeHash === null) { + throw Error(`Partial fields not supported in fromAccountData`) + } return new Account( nonce !== undefined ? bytesToBigInt(toBytes(nonce)) : undefined, @@ -45,6 +138,30 @@ export class Account { ) } + static fromPartialAccountData(partialAccountData: PartialAccountData) { + const { nonce, balance, storageRoot, codeHash, codeSize, version } = partialAccountData + + if ( + nonce === null && + balance === null && + storageRoot === null && + codeHash === null && + codeSize === null && + version === null + ) { + throw Error(`All partial fields null`) + } + + return new Account( + nonce !== undefined && nonce !== null ? bytesToBigInt(toBytes(nonce)) : nonce, + balance !== undefined && balance !== null ? bytesToBigInt(toBytes(balance)) : balance, + storageRoot !== undefined && storageRoot !== null ? toBytes(storageRoot) : storageRoot, + codeHash !== undefined && codeHash !== null ? toBytes(codeHash) : codeHash, + codeSize !== undefined && codeSize !== null ? bytesToInt(toBytes(codeSize)) : codeSize, + version !== undefined && version !== null ? bytesToInt(toBytes(version)) : version + ) + } + public static fromRlpSerializedAccount(serialized: Uint8Array) { const values = RLP.decode(serialized) as Uint8Array[] @@ -55,6 +172,94 @@ export class Account { return this.fromValuesArray(values) } + public static fromRlpSerializedPartialAccount(serialized: Uint8Array) { + const values = RLP.decode(serialized) as Uint8Array[][] + + if (!Array.isArray(values)) { + throw new Error('Invalid serialized account input. Must be array') + } + + let nonce = null + if (!Array.isArray(values[0])) { + throw new Error('Invalid partial nonce encoding. Must be array') + } else { + const isNotNullIndicator = bytesToInt(values[0][0]) + if (isNotNullIndicator !== 0 && isNotNullIndicator !== 1) { + throw new Error(`Invalid isNullIndicator=${isNotNullIndicator} for nonce`) + } + if (isNotNullIndicator === 1) { + nonce = bytesToBigInt(values[0][1]) + } + } + + let balance = null + if (!Array.isArray(values[1])) { + throw new Error('Invalid partial balance encoding. Must be array') + } else { + const isNotNullIndicator = bytesToInt(values[1][0]) + if (isNotNullIndicator !== 0 && isNotNullIndicator !== 1) { + throw new Error(`Invalid isNullIndicator=${isNotNullIndicator} for balance`) + } + if (isNotNullIndicator === 1) { + balance = bytesToBigInt(values[1][1]) + } + } + + let storageRoot = null + if (!Array.isArray(values[2])) { + throw new Error('Invalid partial storageRoot encoding. Must be array') + } else { + const isNotNullIndicator = bytesToInt(values[2][0]) + if (isNotNullIndicator !== 0 && isNotNullIndicator !== 1) { + throw new Error(`Invalid isNullIndicator=${isNotNullIndicator} for storageRoot`) + } + if (isNotNullIndicator === 1) { + storageRoot = values[2][1] + } + } + + let codeHash = null + if (!Array.isArray(values[3])) { + throw new Error('Invalid partial codeHash encoding. Must be array') + } else { + const isNotNullIndicator = bytesToInt(values[3][0]) + if (isNotNullIndicator !== 0 && isNotNullIndicator !== 1) { + throw new Error(`Invalid isNullIndicator=${isNotNullIndicator} for codeHash`) + } + if (isNotNullIndicator === 1) { + codeHash = values[3][1] + } + } + + let codeSize = null + if (!Array.isArray(values[4])) { + throw new Error('Invalid partial codeSize encoding. Must be array') + } else { + const isNotNullIndicator = bytesToInt(values[4][0]) + if (isNotNullIndicator !== 0 && isNotNullIndicator !== 1) { + throw new Error(`Invalid isNullIndicator=${isNotNullIndicator} for codeSize`) + } + if (isNotNullIndicator === 1) { + codeSize = bytesToInt(values[4][1]) + } + } + + let version = null + if (!Array.isArray(values[5])) { + throw new Error('Invalid partial version encoding. Must be array') + } else { + const isNotNullIndicator = bytesToInt(values[5][0]) + if (isNotNullIndicator !== 0 && isNotNullIndicator !== 1) { + throw new Error(`Invalid isNullIndicator=${isNotNullIndicator} for version`) + } + if (isNotNullIndicator === 1) { + version = bytesToInt(values[5][1]) + } + } + + return this.fromPartialAccountData({ balance, nonce, storageRoot, codeHash, codeSize, version }) + } + public static fromValuesArray(values: Uint8Array[]) { const [nonce, balance, storageRoot, codeHash] = values @@ -64,34 +269,46 @@ export class Account { /** * This constructor assigns and validates the values. * Use the static factory methods to assist in creating an Account from varying data types. + * undefined get assigned with the defaults present, but null args are retained as is */ constructor( - nonce = BIGINT_0, - balance = BIGINT_0, - storageRoot = KECCAK256_RLP, - codeHash = KECCAK256_NULL + nonce: bigint | null = BIGINT_0, + balance: bigint | null = BIGINT_0, + storageRoot: Uint8Array | null = KECCAK256_RLP, + codeHash: Uint8Array | null = KECCAK256_NULL, + codeSize: number | null = null, + version: number | null = 0 ) { - this.nonce = nonce - this.balance = balance - this.storageRoot = storageRoot - this.codeHash = codeHash + this._nonce = nonce + this._balance = balance + this._storageRoot = storageRoot + this._codeHash = codeHash + + if (codeSize === null && codeHash !== null && !this.isContract()) { + codeSize = 0 + } + this._codeSize = codeSize + this._version = version this._validate() } private _validate() { - if (this.nonce < BIGINT_0) { + if (this._nonce !== null && this._nonce < BIGINT_0) { throw new Error('nonce must be greater than zero') } - if (this.balance < BIGINT_0) { + if (this._balance !== null && this._balance < BIGINT_0) { throw new Error('balance must be greater than zero') } - if (this.storageRoot.length !== 32) { + if (this._storageRoot !== null && this._storageRoot.length !== 32) { throw new Error('storageRoot must have a length of 32') } - if (this.codeHash.length !== 32) { + if (this._codeHash !== null && this._codeHash.length !== 32) { throw new Error('codeHash must have a length of 32') } + if (this._codeSize !== null && this._codeSize < BIGINT_0) { + throw new Error('codeSize must be greater than zero') + } } /** @@ -113,11 +330,61 @@ export class Account { return RLP.encode(this.raw()) } + serializeWithPartialInfo(): Uint8Array { + const partialData = [] + const zeroEncoded = intToUnpaddedBytes(0) + const oneEncoded = intToUnpaddedBytes(1) + + if (this._nonce !== null) { + partialData.push([oneEncoded, bigIntToUnpaddedBytes(this._nonce)]) + } else { + partialData.push([zeroEncoded]) + } + + if (this._balance !== null) { + partialData.push([oneEncoded, bigIntToUnpaddedBytes(this._balance)]) + } else { + partialData.push([zeroEncoded]) + } + + if (this._storageRoot !== null) { + partialData.push([oneEncoded, this._storageRoot]) + } else { + partialData.push([zeroEncoded]) + } + + if (this._codeHash !== null) { + partialData.push([oneEncoded, this._codeHash]) + } else { + partialData.push([zeroEncoded]) + } + + if (this._codeSize !== null) { + partialData.push([oneEncoded, intToUnpaddedBytes(this._codeSize)]) + } else { + partialData.push([zeroEncoded]) + } + + if (this._version !== null) { + partialData.push([oneEncoded, intToUnpaddedBytes(this._version)]) + } else { + partialData.push([zeroEncoded]) + } + + return RLP.encode(partialData) + } + /** * Returns a `Boolean` determining if the account is a contract. */ isContract(): boolean { - return !equalsBytes(this.codeHash, KECCAK256_NULL) + if (this._codeHash === null && this._codeSize === null) { + throw Error(`Insufficient data as codeHash=null and codeSize=null`) + } + return ( + (this._codeHash !== null && !equalsBytes(this._codeHash, KECCAK256_NULL)) || + (this._codeSize !== null && this._codeSize !== 0) + ) } /** @@ -137,7 +404,7 @@ export class Account { /** * Checks if the address is a valid. Accepts checksummed addresses too. */ -export const isValidAddress = function (hexAddress: string): boolean { +export const isValidAddress = function (hexAddress: string): hexAddress is PrefixedHexString { try { assertIsString(hexAddress) } catch (e: any) { @@ -162,7 +429,7 @@ export const isValidAddress = function (hexAddress: string): boolean { export const toChecksumAddress = function ( hexAddress: string, eip1191ChainId?: BigIntLike -): string { +): PrefixedHexString { assertIsHexString(hexAddress) const address = stripHexPrefix(hexAddress).toLowerCase() @@ -174,7 +441,7 @@ export const toChecksumAddress = function ( const bytes = utf8ToBytes(prefix + address) const hash = bytesToHex(keccak256(bytes)).slice(2) - let ret = '0x' + let ret = '' for (let i = 0; i < address.length; i++) { if (parseInt(hash[i], 16) >= 8) { @@ -184,7 +451,7 @@ export const toChecksumAddress = function ( } } - return ret + return `0x${ret}` } /** diff --git a/packages/util/src/address.ts b/packages/util/src/address.ts index fc452cad9..5fdf192df 100644 --- a/packages/util/src/address.ts +++ b/packages/util/src/address.ts @@ -5,9 +5,18 @@ import { privateToAddress, pubToAddress, } from './account.js' -import { bigIntToBytes, bytesToBigInt, bytesToHex, equalsBytes, toBytes, zeros } from './bytes.js' +import { + bigIntToBytes, + bytesToBigInt, + bytesToHex, + equalsBytes, + hexToBytes, + zeros, +} from './bytes.js' import { BIGINT_0 } from './constants.js' +import type { PrefixedHexString } from './types.js' + /** * Handling and generating Ethereum addresses */ @@ -36,7 +45,7 @@ export class Address { if (!isValidAddress(str)) { throw new Error('Invalid address') } - return new Address(toBytes(str)) + return new Address(hexToBytes(str)) } /** @@ -119,7 +128,7 @@ export class Address { /** * Returns hex encoding of address. */ - toString(): string { + toString(): PrefixedHexString { return bytesToHex(this.bytes) } diff --git a/packages/util/src/blobs.ts b/packages/util/src/blobs.ts index 2c2554a49..1aec3aeb5 100644 --- a/packages/util/src/blobs.ts +++ b/packages/util/src/blobs.ts @@ -1,7 +1,8 @@ import { sha256 } from 'ethereum-cryptography/sha256.js' import { utf8ToBytes } from './bytes.js' -import { kzg } from './kzg.js' + +import type { Kzg } from './kzg.js' /** * These utilities for constructing blobs are borrowed from https://github.com/Inphi/eip4844-interop.git @@ -55,7 +56,7 @@ export const getBlobs = (input: string) => { return blobs } -export const blobsToCommitments = (blobs: Uint8Array[]) => { +export const blobsToCommitments = (kzg: Kzg, blobs: Uint8Array[]) => { const commitments: Uint8Array[] = [] for (const blob of blobs) { commitments.push(kzg.blobToKzgCommitment(blob)) @@ -63,7 +64,7 @@ export const blobsToCommitments = (blobs: Uint8Array[]) => { return commitments } -export const blobsToProofs = (blobs: Uint8Array[], commitments: Uint8Array[]) => { +export const blobsToProofs = (kzg: Kzg, blobs: Uint8Array[], commitments: Uint8Array[]) => { const proofs = blobs.map((blob, ctx) => kzg.computeBlobKzgProof(blob, commitments[ctx])) return proofs diff --git a/packages/util/src/bytes.ts b/packages/util/src/bytes.ts index 7100ad354..a4c873d03 100644 --- a/packages/util/src/bytes.ts +++ b/packages/util/src/bytes.ts @@ -57,13 +57,13 @@ export const unprefixedHexToBytes = (inp: string) => { // Caching this info costs about ~1000 bytes and speeds up toHexString() by x6 const hexByByte = Array.from({ length: 256 }, (v, i) => i.toString(16).padStart(2, '0')) -export const bytesToHex = (bytes: Uint8Array): string => { - let hex = '0x' - if (bytes === undefined || bytes.length === 0) return hex +export const bytesToHex = (bytes: Uint8Array): PrefixedHexString => { + let hex: string = '' + if (bytes === undefined || bytes.length === 0) return `0x` for (const byte of bytes) { hex += hexByByte[byte] } - return hex + return `0x${hex}` } // BigInt cache for the numbers 0 - 256*256-1 (two-byte bytes) @@ -155,7 +155,7 @@ export const intToBytes = (i: number): Uint8Array => { */ export const bigIntToBytes = (num: bigint, littleEndian = false): Uint8Array => { // eslint-disable-next-line @typescript-eslint/no-use-before-define - const bytes = toBytes('0x' + padToEven(num.toString(16))) + const bytes = toBytes(`0x${padToEven(num.toString(16))}`) return littleEndian ? bytes.reverse() : bytes } @@ -216,13 +216,11 @@ export const setLengthRight = (msg: Uint8Array, length: number): Uint8Array => { } /** - * Trims leading zeros from a `Uint8Array`, `number[]` or PrefixedHexString`. - * @param {Uint8Array|number[]|PrefixedHexString} a - * @return {Uint8Array|number[]|PrefixedHexString} + * Trims leading zeros from a `Uint8Array`, `number[]` or `string`. + * @param {Uint8Array|number[]|string} a + * @return {Uint8Array|number[]|string} */ -const stripZeros = < - T extends Uint8Array | number[] | PrefixedHexString = Uint8Array | number[] | PrefixedHexString ->( +const stripZeros = ( a: T ): T => { let first = a[0] @@ -258,10 +256,9 @@ export const unpadArray = (a: number[]): number[] => { * @param {PrefixedHexString} a * @return {PrefixedHexString} */ -export const unpadHex = (a: string): PrefixedHexString => { +export const unpadHex = (a: PrefixedHexString): PrefixedHexString => { assertIsHexString(a) - a = stripHexPrefix(a) - return '0x' + stripZeros(a) + return `0x${stripZeros(stripHexPrefix(a))}` } export type ToBytesInputTypes = @@ -349,7 +346,7 @@ export const addHexPrefix = (str: string): PrefixedHexString => { return str } - return isHexPrefixed(str) ? str : '0x' + str + return isHexPrefixed(str) ? str : `0x${str}` } /** @@ -399,7 +396,7 @@ export const validateNoLeadingZeroes = (values: { [key: string]: Uint8Array | un * @returns {PrefixedHexString} */ export const bigIntToHex = (num: bigint): PrefixedHexString => { - return '0x' + num.toString(16) + return `0x${num.toString(16)}` } /** diff --git a/packages/util/src/genesis.ts b/packages/util/src/genesis.ts index 70d293dc1..3cf5cacba 100644 --- a/packages/util/src/genesis.ts +++ b/packages/util/src/genesis.ts @@ -46,15 +46,15 @@ export interface GenesisState { */ export function parseGethGenesisState(json: any) { const state: GenesisState = {} - for (let address of Object.keys(json.alloc)) { + for (const address of Object.keys(json.alloc)) { let { balance, code, storage, nonce } = json.alloc[address] // create a map with lowercase for easy lookups - address = addHexPrefix(address.toLowerCase()) + const prefixedAddress = addHexPrefix(address.toLowerCase()) balance = isHexPrefixed(balance) ? balance : bigIntToHex(BigInt(balance)) code = code !== undefined ? addHexPrefix(code) : undefined storage = storage !== undefined ? Object.entries(storage) : undefined nonce = nonce !== undefined ? addHexPrefix(nonce) : undefined - state[address] = [balance, code, storage, nonce] + state[prefixedAddress] = [balance, code, storage, nonce] } return state } diff --git a/packages/util/src/internal.ts b/packages/util/src/internal.ts index 6257ab25b..bccc53886 100644 --- a/packages/util/src/internal.ts +++ b/packages/util/src/internal.ts @@ -24,13 +24,15 @@ THE SOFTWARE import { bytesToUnprefixedHex, utf8ToBytes } from './bytes.js' +import type { PrefixedHexString } from './types.js' + /** * Returns a `Boolean` on whether or not the a `String` starts with '0x' * @param str the string input value * @return a boolean if it is or is not hex prefixed * @throws if the str input is not a string */ -export function isHexPrefixed(str: string): boolean { +export function isHexPrefixed(str: string): str is PrefixedHexString { if (typeof str !== 'string') { throw new Error(`[isHexPrefixed] input must be type 'string', received type ${typeof str}`) } @@ -201,9 +203,9 @@ export function getKeys(params: Record[], key: string, allowEmpt * * @param value * @param length - * @returns output the string is a hex string + * @returns output the string is a hex string */ -export function isHexString(value: string, length?: number): boolean { +export function isHexString(value: string, length?: number): value is PrefixedHexString { if (typeof value !== 'string' || !value.match(/^0x[0-9A-Fa-f]*$/)) return false if (typeof length !== 'undefined' && length > 0 && value.length !== 2 + 2 * length) return false diff --git a/packages/util/src/kzg.ts b/packages/util/src/kzg.ts index 54ae45d68..4930b161c 100644 --- a/packages/util/src/kzg.ts +++ b/packages/util/src/kzg.ts @@ -2,7 +2,12 @@ * Interface for an externally provided kzg library used when creating blob transactions */ export interface Kzg { - loadTrustedSetup(filePath?: string): void + loadTrustedSetup(trustedSetup?: { + g1: string // unprefixed hex string + g2: string // unprefixed hex string + n1: number // bytes per element + n2: number // 65 + }): void blobToKzgCommitment(blob: Uint8Array): Uint8Array computeBlobKzgProof(blob: Uint8Array, commitment: Uint8Array): Uint8Array verifyKzgProof( @@ -18,24 +23,13 @@ export interface Kzg { ): boolean } -function kzgNotLoaded(): never { - throw Error('kzg library not loaded') -} - -// eslint-disable-next-line import/no-mutable-exports -export let kzg: Kzg = { - loadTrustedSetup: kzgNotLoaded, - blobToKzgCommitment: kzgNotLoaded, - computeBlobKzgProof: kzgNotLoaded, - verifyKzgProof: kzgNotLoaded, - verifyBlobKzgProofBatch: kzgNotLoaded, -} - /** + * @deprecated This initialization method is deprecated since trusted setup loading is done directly in the reference KZG library + * initialization or should othewise be assured independently before KZG libary usage. + * * @param kzgLib a KZG implementation (defaults to c-kzg) - * @param trustedSetupPath the full path (e.g. "/home/linux/devnet4.txt") to a kzg trusted setup text file + * @param a dictionary of trusted setup options */ -export function initKZG(kzgLib: Kzg, trustedSetupPath?: string) { - kzg = kzgLib - kzg.loadTrustedSetup(trustedSetupPath) +export function initKZG(kzg: Kzg, _trustedSetupPath?: string) { + kzg.loadTrustedSetup() } diff --git a/packages/util/src/provider.ts b/packages/util/src/provider.ts index f1ae8f817..bc8dfa009 100644 --- a/packages/util/src/provider.ts +++ b/packages/util/src/provider.ts @@ -18,7 +18,8 @@ type rpcParams = { * method: 'eth_getBlockByNumber', * params: ['latest', false], * } - * const block = await fetchFromProvider(provider, params) + * const block = await fetchFromProvider(provider, params) + * ``` */ export const fetchFromProvider = async (url: string, params: rpcParams) => { const data = JSON.stringify({ diff --git a/packages/util/src/signature.ts b/packages/util/src/signature.ts index 4e8f1d44e..9dd846683 100644 --- a/packages/util/src/signature.ts +++ b/packages/util/src/signature.ts @@ -20,6 +20,8 @@ import { } from './constants.js' import { assertIsBytes } from './helpers.js' +import type { PrefixedHexString } from './types.js' + export interface ECDSASignature { v: bigint r: Uint8Array @@ -139,7 +141,7 @@ export const toCompactSig = function ( * NOTE: After EIP1559, `v` could be `0` or `1` but this function assumes * it's a signed message (EIP-191 or EIP-712) adding `27` at the end. Remove if needed. */ -export const fromRpcSig = function (sig: string): ECDSASignature { +export const fromRpcSig = function (sig: PrefixedHexString): ECDSASignature { const bytes: Uint8Array = toBytes(sig) let r: Uint8Array diff --git a/packages/util/src/types.ts b/packages/util/src/types.ts index b62d103c6..b3392873a 100644 --- a/packages/util/src/types.ts +++ b/packages/util/src/types.ts @@ -23,7 +23,7 @@ export type BytesLike = /* * A type that represents a `0x`-prefixed hex string. */ -export type PrefixedHexString = string +export type PrefixedHexString = `0x${string}` /** * A type that represents an input that can be converted to an Address. diff --git a/packages/util/src/withdrawal.ts b/packages/util/src/withdrawal.ts index e9b7bc13b..1724aef44 100644 --- a/packages/util/src/withdrawal.ts +++ b/packages/util/src/withdrawal.ts @@ -3,7 +3,7 @@ import { bigIntToHex, bytesToHex, toBytes } from './bytes.js' import { BIGINT_0 } from './constants.js' import { TypeOutput, toType } from './types.js' -import type { AddressLike, BigIntLike } from './types.js' +import type { AddressLike, BigIntLike, PrefixedHexString } from './types.js' /** * Flexible input data type for EIP-4895 withdrawal data with amount in Gwei to @@ -21,10 +21,10 @@ export type WithdrawalData = { * match CL representation and for eventual ssz withdrawalsRoot */ export interface JsonRpcWithdrawal { - index: string // QUANTITY - bigint 8 bytes - validatorIndex: string // QUANTITY - bigint 8 bytes - address: string // DATA, 20 Bytes address to withdraw to - amount: string // QUANTITY - bigint amount in Gwei 8 bytes + index: PrefixedHexString // QUANTITY - bigint 8 bytes + validatorIndex: PrefixedHexString // QUANTITY - bigint 8 bytes + address: PrefixedHexString // DATA, 20 Bytes address to withdraw to + amount: PrefixedHexString // QUANTITY - bigint amount in Gwei 8 bytes } export type WithdrawalBytes = [Uint8Array, Uint8Array, Uint8Array, Uint8Array] diff --git a/packages/util/test/signature.spec.ts b/packages/util/test/signature.spec.ts index dc3932e0e..b7bc655cc 100644 --- a/packages/util/test/signature.spec.ts +++ b/packages/util/test/signature.spec.ts @@ -332,7 +332,7 @@ describe('message sig', () => { it('should throw on shorter length', () => { assert.throws(function () { - fromRpcSig('') + fromRpcSig('0x') }) assert.throws(function () { fromRpcSig( diff --git a/packages/util/test/types.spec.ts b/packages/util/test/types.spec.ts index 99411fc91..38a4adf3d 100644 --- a/packages/util/test/types.spec.ts +++ b/packages/util/test/types.spec.ts @@ -25,91 +25,76 @@ describe('toType', () => { }) it('from Number', () => { const num = 1000 - it('should convert to Number', () => { - const result = toType(num, TypeOutput.Number) - assert.strictEqual(result, num) - }) - it('should convert to BigInt', () => { - const result = toType(num, TypeOutput.BigInt) - assert.equal(result, BigInt(num)) - }) - it('should convert to Uint8Array', () => { - const result = toType(num, TypeOutput.Uint8Array) - assert.deepEqual(result, intToBytes(num)) - }) - it('should convert to PrefixedHexString', () => { - const result = toType(num, TypeOutput.PrefixedHexString) - assert.strictEqual(result, bytesToHex(bigIntToBytes(BigInt(num)))) - }) - it('should throw an error if greater than MAX_SAFE_INTEGER', () => { - assert.throws(() => { - const num = Number.MAX_SAFE_INTEGER + 1 - toType(num, TypeOutput.BigInt) - }, /^Error: The provided number is greater than MAX_SAFE_INTEGER \(please use an alternative input type\)$/) - }) + let result + result = toType(num, TypeOutput.Number) + assert.strictEqual(result, num) + + result = toType(num, TypeOutput.BigInt) + assert.equal(result, BigInt(num)) + + result = toType(num, TypeOutput.Uint8Array) + assert.deepEqual(result, intToBytes(num)) + + result = toType(num, TypeOutput.PrefixedHexString) + assert.strictEqual(result, bytesToHex(bigIntToBytes(BigInt(num)))) + + assert.throws(() => { + const num = Number.MAX_SAFE_INTEGER + 1 + toType(num, TypeOutput.BigInt) + }, /^The provided number is greater than MAX_SAFE_INTEGER \(please use an alternative input type\)$/) }) + it('from BigInt', () => { const num = BigInt(1000) - it('should convert to Number', () => { - const result = toType(num, TypeOutput.Number) - assert.strictEqual(result, Number(num)) - }) - it('should convert to BigInt', () => { - const result = toType(num, TypeOutput.BigInt) - assert.equal(result, num) - }) - it('should convert to Uint8Array', () => { - const result = toType(num, TypeOutput.Uint8Array) - assert.deepEqual(result, bigIntToBytes(num)) - }) - it('should convert to PrefixedHexString', () => { - const result = toType(num, TypeOutput.PrefixedHexString) - assert.strictEqual(result, bytesToHex(bigIntToBytes(num))) - }) - it('should throw an error if converting to Number and greater than MAX_SAFE_INTEGER', () => { - const num = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1) - assert.throws(() => { - toType(num, TypeOutput.Number) - }, /^Error: The provided number is greater than MAX_SAFE_INTEGER \(please use an alternative output type\)$/) - }) + let result + result = toType(num, TypeOutput.Number) + assert.strictEqual(result, Number(num)) + + result = toType(num, TypeOutput.BigInt) + assert.equal(result, num) + + result = toType(num, TypeOutput.Uint8Array) + assert.deepEqual(result, bigIntToBytes(num)) + + result = toType(num, TypeOutput.PrefixedHexString) + assert.strictEqual(result, bytesToHex(bigIntToBytes(num))) + + const num2 = BigInt(Number.MAX_SAFE_INTEGER) + BigInt(1) + assert.throws(() => { + toType(num2, TypeOutput.Number) + }, /^The provided number is greater than MAX_SAFE_INTEGER \(please use an alternative output type\)$/) }) it('from Uint8Array', () => { const num = intToBytes(1000) - it('should convert to Number', () => { - const result = toType(num, TypeOutput.Number) - assert.deepEqual(intToBytes(result), num) - }) - it('should convert to BigInt', () => { - const result = toType(num, TypeOutput.BigInt) - assert.equal(result, bytesToBigInt(num)) - }) - it('should convert to Uint8Array', () => { - const result = toType(num, TypeOutput.Uint8Array) - assert.deepEqual(result, num) - }) - it('should convert to PrefixedHexString', () => { - const result = toType(num, TypeOutput.PrefixedHexString) - assert.strictEqual(result, bytesToHex(num)) - }) + let result + + result = toType(num, TypeOutput.Number) + assert.deepEqual(intToBytes(result), num) + + result = toType(num, TypeOutput.BigInt) + assert.equal(result, bytesToBigInt(num)) + + result = toType(num, TypeOutput.Uint8Array) + assert.deepEqual(result, num) + + result = toType(num, TypeOutput.PrefixedHexString) + assert.strictEqual(result, bytesToHex(num)) }) it('from PrefixedHexString', () => { const num = intToHex(1000) - it('should convert to Number', () => { - const result = toType(num, TypeOutput.Number) - assert.strictEqual(intToHex(result), num) - }) - it('should convert to BigInt', () => { - const result = toType(num, TypeOutput.BigInt) - assert.strictEqual(bigIntToHex(result), num) - }) - it('should convert to Uint8Array', () => { - const result = toType(num, TypeOutput.Uint8Array) - assert.deepEqual(result, toBytes(num)) - }) - it('should throw an error if is not 0x-prefixed', () => { - assert.throws(() => { - toType('1', TypeOutput.Number) - }, /^Error: A string must be provided with a 0x-prefix, given: 1$/) - }) + let result + + result = toType(num, TypeOutput.Number) + assert.strictEqual(intToHex(result), num) + + result = toType(num, TypeOutput.BigInt) + assert.strictEqual(bigIntToHex(result), num) + + result = toType(num, TypeOutput.Uint8Array) + assert.deepEqual(result, toBytes(num)) + + assert.throws(() => { + toType('1', TypeOutput.Number) + }, /^A string must be provided with a 0x-prefix, given: 1$/) }) }) diff --git a/packages/verkle/CHANGELOG.md b/packages/verkle/CHANGELOG.md index 459edbc1b..536f107d5 100644 --- a/packages/verkle/CHANGELOG.md +++ b/packages/verkle/CHANGELOG.md @@ -6,6 +6,11 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). -## [0.0.1] - 2023-10-15 +## 0.0.2 - 2024-03-05 + +- Fix a type error related to the `lru-cache` dependency, PR [#3285](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3285) +- Downstream dependency updates, see PR [#3297](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3297) + +## 0.0.1 - 2023-10-15 - Initial development release diff --git a/packages/verkle/docs/README.md b/packages/verkle/docs/README.md new file mode 100644 index 000000000..d6f44f876 --- /dev/null +++ b/packages/verkle/docs/README.md @@ -0,0 +1,372 @@ +@ethereumjs/verkle + +# @ethereumjs/verkle + +## Table of contents + +### Enumerations + +- [VerkleNodeType](enums/VerkleNodeType.md) + +### Classes + +- [BaseVerkleNode](classes/BaseVerkleNode.md) +- [CheckpointDB](classes/CheckpointDB.md) +- [InternalNode](classes/InternalNode.md) +- [LeafNode](classes/LeafNode.md) +- [PrioritizedTaskExecutor](classes/PrioritizedTaskExecutor.md) +- [VerkleTree](classes/VerkleTree.md) +- [WalkController](classes/WalkController.md) + +### Interfaces + +- [CheckpointDBOpts](interfaces/CheckpointDBOpts.md) +- [Fr](interfaces/Fr.md) +- [Point](interfaces/Point.md) +- [TypedVerkleNode](interfaces/TypedVerkleNode.md) +- [VerkleNodeInterface](interfaces/VerkleNodeInterface.md) +- [VerkleNodeOptions](interfaces/VerkleNodeOptions.md) +- [VerkleTreeOpts](interfaces/VerkleTreeOpts.md) + +### Type Aliases + +- [Checkpoint](README.md#checkpoint) +- [FoundNodeFunction](README.md#foundnodefunction) +- [Proof](README.md#proof) +- [VerkleNode](README.md#verklenode) +- [VerkleTreeOptsWithDefaults](README.md#verkletreeoptswithdefaults) + +### Variables + +- [NODE\_WIDTH](README.md#node_width) +- [POINT\_IDENTITY](README.md#point_identity) +- [ROOT\_DB\_KEY](README.md#root_db_key) + +### Functions + +- [decodeNode](README.md#decodenode) +- [decodeRawNode](README.md#decoderawnode) +- [getKey](README.md#getkey) +- [getStem](README.md#getstem) +- [isRawNode](README.md#israwnode) +- [matchingBytesLength](README.md#matchingbyteslength) +- [pedersenHash](README.md#pedersenhash) +- [verifyProof](README.md#verifyproof) +- [verifyUpdate](README.md#verifyupdate) + +## Type Aliases + +### Checkpoint + +ÆŦ **Checkpoint**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `keyValueMap` | `Map`<`string`, `Uint8Array` \| `undefined`\> | +| `root` | `Uint8Array` | + +#### Defined in + +[types.ts:104](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L104) + +___ + +### FoundNodeFunction + +ÆŦ **FoundNodeFunction**: (`nodeRef`: `Uint8Array`, `node`: [`VerkleNode`](README.md#verklenode) \| ``null``, `key`: `Uint8Array`, `walkController`: [`WalkController`](classes/WalkController.md)) => `void` + +#### Type declaration + +▸ (`nodeRef`, `node`, `key`, `walkController`): `void` + +##### Parameters + +| Name | Type | +| :------ | :------ | +| `nodeRef` | `Uint8Array` | +| `node` | [`VerkleNode`](README.md#verklenode) \| ``null`` | +| `key` | `Uint8Array` | +| `walkController` | [`WalkController`](classes/WalkController.md) | + +##### Returns + +`void` + +#### Defined in + +[types.ts:111](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L111) + +___ + +### Proof + +ÆŦ **Proof**: `Uint8Array`[] + +#### Defined in + +[types.ts:61](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L61) + +___ + +### VerkleNode + +ÆŦ **VerkleNode**: [`TypedVerkleNode`](interfaces/TypedVerkleNode.md)[[`VerkleNodeType`](enums/VerkleNodeType.md)] + +#### Defined in + +[node/types.ts:15](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L15) + +___ + +### VerkleTreeOptsWithDefaults + +ÆŦ **VerkleTreeOptsWithDefaults**: [`VerkleTreeOpts`](interfaces/VerkleTreeOpts.md) & { `cacheSize`: `number` ; `useRootPersistence`: `boolean` } + +#### Defined in + +[types.ts:87](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L87) + +## Variables + +### NODE\_WIDTH + +â€ĸ `Const` **NODE\_WIDTH**: ``256`` + +#### Defined in + +[node/types.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L49) + +___ + +### POINT\_IDENTITY + +â€ĸ `Const` **POINT\_IDENTITY**: [`Point`](interfaces/Point.md) + +#### Defined in + +[util/crypto.ts:81](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/crypto.ts#L81) + +___ + +### ROOT\_DB\_KEY + +â€ĸ `Const` **ROOT\_DB\_KEY**: `Uint8Array` + +#### Defined in + +[types.ts:118](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L118) + +## Functions + +### decodeNode + +▸ **decodeNode**(`raw`): [`VerkleNode`](README.md#verklenode) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `raw` | `Uint8Array` | + +#### Returns + +[`VerkleNode`](README.md#verklenode) + +#### Defined in + +[node/util.ts:20](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/util.ts#L20) + +___ + +### decodeRawNode + +▸ **decodeRawNode**(`raw`): [`VerkleNode`](README.md#verklenode) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `raw` | `Uint8Array`[] | + +#### Returns + +[`VerkleNode`](README.md#verklenode) + +#### Defined in + +[node/util.ts:7](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/util.ts#L7) + +___ + +### getKey + +▸ **getKey**(`stem`, `subIndex`): `Uint8Array` + +**`Dev`** + +Returns the tree key for a given verkle tree stem, and sub index. + +**`Dev`** + +Assumes that the verkle node width = 256 + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `stem` | `Uint8Array` | The 31-bytes verkle tree stem as a Uint8Array. | +| `subIndex` | `Uint8Array` | The sub index of the tree to generate the key for as a Uint8Array. | + +#### Returns + +`Uint8Array` + +The tree key as a Uint8Array. + +#### Defined in + +[util/crypto.ts:67](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/crypto.ts#L67) + +___ + +### getStem + +▸ **getStem**(`address`, `treeIndex?`): `Uint8Array` + +**`Dev`** + +Returns the 31-bytes verkle tree stem for a given address and tree index. + +**`Dev`** + +Assumes that the verkle node width = 256 + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `address` | `Address` | `undefined` | The address to generate the tree key for. | +| `treeIndex` | `number` \| `bigint` | `0` | The index of the tree to generate the key for. Defaults to 0. | + +#### Returns + +`Uint8Array` + +The 31-bytes verkle tree stem as a Uint8Array. + +#### Defined in + +[util/crypto.ts:43](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/crypto.ts#L43) + +___ + +### isRawNode + +▸ **isRawNode**(`node`): node is Uint8Array[] + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `node` | `Uint8Array` \| `Uint8Array`[] | + +#### Returns + +node is Uint8Array[] + +#### Defined in + +[node/util.ts:28](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/util.ts#L28) + +___ + +### matchingBytesLength + +▸ **matchingBytesLength**(`bytes1`, `bytes2`): `number` + +Compares two byte arrays and returns the count of consecutively matching items from the start. + +**`Function`** + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `bytes1` | `Uint8Array` | The first Uint8Array to compare. | +| `bytes2` | `Uint8Array` | The second Uint8Array to compare. | + +#### Returns + +`number` + +The count of consecutively matching items from the start. + +#### Defined in + +[util/bytes.ts:9](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/bytes.ts#L9) + +___ + +### pedersenHash + +▸ **pedersenHash**(`input`): `Uint8Array` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `input` | `Uint8Array` | + +#### Returns + +`Uint8Array` + +#### Defined in + +[util/crypto.ts:14](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/crypto.ts#L14) + +___ + +### verifyProof + +▸ **verifyProof**(`root`, `proof`, `keyValues`): `Uint8Array` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `root` | `Uint8Array` | +| `proof` | `Uint8Array` | +| `keyValues` | `Map`<`any`, `any`\> | + +#### Returns + +`Uint8Array` + +#### Defined in + +[util/crypto.ts:72](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/crypto.ts#L72) + +___ + +### verifyUpdate + +▸ **verifyUpdate**(`root`, `proof`, `keyValues`): `Uint8Array` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `root` | `Uint8Array` | +| `proof` | `Uint8Array` | +| `keyValues` | `Map`<`any`, `any`\> | + +#### Returns + +`Uint8Array` + +#### Defined in + +[util/crypto.ts:28](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/crypto.ts#L28) diff --git a/packages/verkle/docs/classes/BaseVerkleNode.md b/packages/verkle/docs/classes/BaseVerkleNode.md new file mode 100644 index 000000000..32d2438ad --- /dev/null +++ b/packages/verkle/docs/classes/BaseVerkleNode.md @@ -0,0 +1,174 @@ +[@ethereumjs/verkle](../README.md) / BaseVerkleNode + +# Class: BaseVerkleNode + +## Type parameters + +| Name | Type | +| :------ | :------ | +| `T` | extends [`VerkleNodeType`](../enums/VerkleNodeType.md) | + +## Hierarchy + +- **`BaseVerkleNode`** + + â†ŗ [`InternalNode`](InternalNode.md) + + â†ŗ [`LeafNode`](LeafNode.md) + +## Implements + +- [`VerkleNodeInterface`](../interfaces/VerkleNodeInterface.md) + +## Table of contents + +### Constructors + +- [constructor](BaseVerkleNode.md#constructor) + +### Properties + +- [commitment](BaseVerkleNode.md#commitment) +- [depth](BaseVerkleNode.md#depth) + +### Methods + +- [commit](BaseVerkleNode.md#commit) +- [hash](BaseVerkleNode.md#hash) +- [insert](BaseVerkleNode.md#insert) +- [raw](BaseVerkleNode.md#raw) +- [serialize](BaseVerkleNode.md#serialize) + +## Constructors + +### constructor + +â€ĸ **new BaseVerkleNode**<`T`\>(`options`) + +#### Type parameters + +| Name | Type | +| :------ | :------ | +| `T` | extends [`VerkleNodeType`](../enums/VerkleNodeType.md) | + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options` | [`VerkleNodeOptions`](../interfaces/VerkleNodeOptions.md)[`T`] | + +#### Defined in + +[node/baseVerkleNode.ts:11](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L11) + +## Properties + +### commitment + +â€ĸ **commitment**: [`Point`](../interfaces/Point.md) + +#### Defined in + +[node/baseVerkleNode.ts:8](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L8) + +___ + +### depth + +â€ĸ **depth**: `number` + +#### Defined in + +[node/baseVerkleNode.ts:9](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L9) + +## Methods + +### commit + +▸ `Abstract` **commit**(): [`Point`](../interfaces/Point.md) + +#### Returns + +[`Point`](../interfaces/Point.md) + +#### Implementation of + +[VerkleNodeInterface](../interfaces/VerkleNodeInterface.md).[commit](../interfaces/VerkleNodeInterface.md#commit) + +#### Defined in + +[node/baseVerkleNode.ts:16](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L16) + +___ + +### hash + +▸ **hash**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +#### Implementation of + +[VerkleNodeInterface](../interfaces/VerkleNodeInterface.md).[hash](../interfaces/VerkleNodeInterface.md#hash) + +#### Defined in + +[node/baseVerkleNode.ts:19](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L19) + +___ + +### insert + +▸ `Abstract` **insert**(`key`, `value`, `nodeResolverFn`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | +| `value` | `Uint8Array` | +| `nodeResolverFn` | () => `void` | + +#### Returns + +`void` + +#### Defined in + +[node/baseVerkleNode.ts:23](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L23) + +___ + +### raw + +▸ `Abstract` **raw**(): `Uint8Array`[] + +#### Returns + +`Uint8Array`[] + +#### Defined in + +[node/baseVerkleNode.ts:25](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L25) + +___ + +### serialize + +▸ **serialize**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +the RLP serialized node + +#### Implementation of + +[VerkleNodeInterface](../interfaces/VerkleNodeInterface.md).[serialize](../interfaces/VerkleNodeInterface.md#serialize) + +#### Defined in + +[node/baseVerkleNode.ts:30](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L30) diff --git a/packages/verkle/docs/classes/CheckpointDB.md b/packages/verkle/docs/classes/CheckpointDB.md new file mode 100644 index 000000000..76bf691d3 --- /dev/null +++ b/packages/verkle/docs/classes/CheckpointDB.md @@ -0,0 +1,376 @@ +[@ethereumjs/verkle](../README.md) / CheckpointDB + +# Class: CheckpointDB + +DB is a thin wrapper around the underlying levelup db, +which validates inputs and sets encoding type. + +## Implements + +- `DB` + +## Table of contents + +### Constructors + +- [constructor](CheckpointDB.md#constructor) + +### Properties + +- [\_stats](CheckpointDB.md#_stats) +- [cacheSize](CheckpointDB.md#cachesize) +- [checkpoints](CheckpointDB.md#checkpoints) +- [db](CheckpointDB.md#db) + +### Methods + +- [batch](CheckpointDB.md#batch) +- [checkpoint](CheckpointDB.md#checkpoint) +- [commit](CheckpointDB.md#commit) +- [del](CheckpointDB.md#del) +- [get](CheckpointDB.md#get) +- [hasCheckpoints](CheckpointDB.md#hascheckpoints) +- [open](CheckpointDB.md#open) +- [put](CheckpointDB.md#put) +- [revert](CheckpointDB.md#revert) +- [setCheckpoints](CheckpointDB.md#setcheckpoints) +- [shallowCopy](CheckpointDB.md#shallowcopy) +- [stats](CheckpointDB.md#stats) + +## Constructors + +### constructor + +â€ĸ **new CheckpointDB**(`opts`) + +Initialize a DB instance. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `opts` | [`CheckpointDBOpts`](../interfaces/CheckpointDBOpts.md) | + +#### Defined in + +[db/checkpoint.ts:43](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L43) + +## Properties + +### \_stats + +â€ĸ **\_stats**: `Object` + +#### Type declaration + +| Name | Type | +| :------ | :------ | +| `cache` | { `hits`: `number` = 0; `reads`: `number` = 0; `writes`: `number` = 0 } | +| `cache.hits` | `number` | +| `cache.reads` | `number` | +| `cache.writes` | `number` | +| `db` | { `hits`: `number` = 0; `reads`: `number` = 0; `writes`: `number` = 0 } | +| `db.hits` | `number` | +| `db.reads` | `number` | +| `db.writes` | `number` | + +#### Defined in + +[db/checkpoint.ts:27](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L27) + +___ + +### cacheSize + +â€ĸ `Readonly` **cacheSize**: `number` + +#### Defined in + +[db/checkpoint.ts:14](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L14) + +___ + +### checkpoints + +â€ĸ **checkpoints**: [`Checkpoint`](../README.md#checkpoint)[] + +#### Defined in + +[db/checkpoint.ts:12](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L12) + +___ + +### db + +â€ĸ **db**: `DB`<`Uint8Array`, `Uint8Array`\> + +#### Defined in + +[db/checkpoint.ts:13](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L13) + +## Methods + +### batch + +▸ **batch**(`opStack`): `Promise`<`void`\> + +**`Inherit Doc`** + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `opStack` | `BatchDBOp`<`Uint8Array`, `Uint8Array`\>[] | + +#### Returns + +`Promise`<`void`\> + +#### Implementation of + +DB.batch + +#### Defined in + +[db/checkpoint.ts:217](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L217) + +___ + +### checkpoint + +▸ **checkpoint**(`root`): `void` + +Adds a new checkpoint to the stack + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `root` | `Uint8Array` | + +#### Returns + +`void` + +#### Defined in + +[db/checkpoint.ts:83](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L83) + +___ + +### commit + +▸ **commit**(): `Promise`<`void`\> + +Commits the latest checkpoint + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[db/checkpoint.ts:90](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L90) + +___ + +### del + +▸ **del**(`key`): `Promise`<`void`\> + +**`Inherit Doc`** + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | + +#### Returns + +`Promise`<`void`\> + +#### Implementation of + +DB.del + +#### Defined in + +[db/checkpoint.ts:195](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L195) + +___ + +### get + +▸ **get**(`key`): `Promise`<`undefined` \| `Uint8Array`\> + +**`Inherit Doc`** + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | + +#### Returns + +`Promise`<`undefined` \| `Uint8Array`\> + +#### Implementation of + +DB.get + +#### Defined in + +[db/checkpoint.ts:134](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L134) + +___ + +### hasCheckpoints + +▸ **hasCheckpoints**(): `boolean` + +Is the DB during a checkpoint phase? + +#### Returns + +`boolean` + +#### Defined in + +[db/checkpoint.ts:75](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L75) + +___ + +### open + +▸ **open**(): `Promise`<`void`\> + +#### Returns + +`Promise`<`void`\> + +#### Implementation of + +DB.open + +#### Defined in + +[db/checkpoint.ts:267](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L267) + +___ + +### put + +▸ **put**(`key`, `value`): `Promise`<`void`\> + +**`Inherit Doc`** + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | +| `value` | `Uint8Array` | + +#### Returns + +`Promise`<`void`\> + +#### Implementation of + +DB.put + +#### Defined in + +[db/checkpoint.ts:173](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L173) + +___ + +### revert + +▸ **revert**(): `Promise`<`Uint8Array`\> + +Reverts the latest checkpoint + +#### Returns + +`Promise`<`Uint8Array`\> + +#### Defined in + +[db/checkpoint.ts:126](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L126) + +___ + +### setCheckpoints + +▸ **setCheckpoints**(`checkpoints`): `void` + +Flush the checkpoints and use the given checkpoints instead. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `checkpoints` | [`Checkpoint`](../README.md#checkpoint)[] | + +#### Returns + +`void` + +#### Defined in + +[db/checkpoint.ts:61](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L61) + +___ + +### shallowCopy + +▸ **shallowCopy**(): [`CheckpointDB`](CheckpointDB.md) + +**`Inherit Doc`** + +#### Returns + +[`CheckpointDB`](CheckpointDB.md) + +#### Implementation of + +DB.shallowCopy + +#### Defined in + +[db/checkpoint.ts:263](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L263) + +___ + +### stats + +▸ **stats**(`reset?`): `Object` + +#### Parameters + +| Name | Type | Default value | +| :------ | :------ | :------ | +| `reset` | `boolean` | `true` | + +#### Returns + +`Object` + +| Name | Type | +| :------ | :------ | +| `cache` | { `hits`: `number` = 0; `reads`: `number` = 0; `writes`: `number` = 0 } | +| `cache.hits` | `number` | +| `cache.reads` | `number` | +| `cache.writes` | `number` | +| `db` | { `hits`: `number` = 0; `reads`: `number` = 0; `writes`: `number` = 0 } | +| `db.hits` | `number` | +| `db.reads` | `number` | +| `db.writes` | `number` | +| `size` | `number` | + +#### Defined in + +[db/checkpoint.ts:241](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/db/checkpoint.ts#L241) diff --git a/packages/verkle/docs/classes/InternalNode.md b/packages/verkle/docs/classes/InternalNode.md new file mode 100644 index 000000000..a214dc30b --- /dev/null +++ b/packages/verkle/docs/classes/InternalNode.md @@ -0,0 +1,339 @@ +[@ethereumjs/verkle](../README.md) / InternalNode + +# Class: InternalNode + +## Hierarchy + +- [`BaseVerkleNode`](BaseVerkleNode.md)<[`Internal`](../enums/VerkleNodeType.md#internal)\> + + â†ŗ **`InternalNode`** + +## Table of contents + +### Constructors + +- [constructor](InternalNode.md#constructor) + +### Properties + +- [children](InternalNode.md#children) +- [commitment](InternalNode.md#commitment) +- [copyOnWrite](InternalNode.md#copyonwrite) +- [depth](InternalNode.md#depth) +- [type](InternalNode.md#type) + +### Methods + +- [commit](InternalNode.md#commit) +- [cowChild](InternalNode.md#cowchild) +- [getChildren](InternalNode.md#getchildren) +- [hash](InternalNode.md#hash) +- [insert](InternalNode.md#insert) +- [insertStem](InternalNode.md#insertstem) +- [raw](InternalNode.md#raw) +- [serialize](InternalNode.md#serialize) +- [setChild](InternalNode.md#setchild) +- [create](InternalNode.md#create) +- [fromRawNode](InternalNode.md#fromrawnode) + +## Constructors + +### constructor + +â€ĸ **new InternalNode**(`options`) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options` | `VerkleInternalNodeOptions` | + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[constructor](BaseVerkleNode.md#constructor) + +#### Defined in + +[node/internalNode.ts:19](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L19) + +## Properties + +### children + +â€ĸ **children**: (``null`` \| [`VerkleNode`](../README.md#verklenode))[] + +#### Defined in + +[node/internalNode.ts:14](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L14) + +___ + +### commitment + +â€ĸ **commitment**: [`Point`](../interfaces/Point.md) + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[commitment](BaseVerkleNode.md#commitment) + +#### Defined in + +[node/baseVerkleNode.ts:8](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L8) + +___ + +### copyOnWrite + +â€ĸ **copyOnWrite**: `Record`<`string`, [`Point`](../interfaces/Point.md)\> + +#### Defined in + +[node/internalNode.ts:15](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L15) + +___ + +### depth + +â€ĸ **depth**: `number` + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[depth](BaseVerkleNode.md#depth) + +#### Defined in + +[node/baseVerkleNode.ts:9](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L9) + +___ + +### type + +â€ĸ **type**: [`VerkleNodeType`](../enums/VerkleNodeType.md) = `VerkleNodeType.Internal` + +#### Defined in + +[node/internalNode.ts:16](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L16) + +## Methods + +### commit + +▸ **commit**(): [`Point`](../interfaces/Point.md) + +#### Returns + +[`Point`](../interfaces/Point.md) + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[commit](BaseVerkleNode.md#commit) + +#### Defined in + +[node/internalNode.ts:25](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L25) + +___ + +### cowChild + +▸ **cowChild**(`_`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `_` | `number` | + +#### Returns + +`void` + +#### Defined in + +[node/internalNode.ts:29](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L29) + +___ + +### getChildren + +▸ **getChildren**(`index`): ``null`` \| [`VerkleNode`](../README.md#verklenode) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `index` | `number` | + +#### Returns + +``null`` \| [`VerkleNode`](../README.md#verklenode) + +#### Defined in + +[node/internalNode.ts:63](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L63) + +___ + +### hash + +▸ **hash**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[hash](BaseVerkleNode.md#hash) + +#### Defined in + +[node/baseVerkleNode.ts:19](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L19) + +___ + +### insert + +▸ **insert**(`key`, `value`, `resolver`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | +| `value` | `Uint8Array` | +| `resolver` | () => `void` | + +#### Returns + +`void` + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[insert](BaseVerkleNode.md#insert) + +#### Defined in + +[node/internalNode.ts:67](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L67) + +___ + +### insertStem + +▸ **insertStem**(`stem`, `values`, `resolver`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `stem` | `Uint8Array` | +| `values` | `Uint8Array`[] | +| `resolver` | () => `void` | + +#### Returns + +`void` + +#### Defined in + +[node/internalNode.ts:73](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L73) + +___ + +### raw + +▸ **raw**(): `Uint8Array`[] + +#### Returns + +`Uint8Array`[] + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[raw](BaseVerkleNode.md#raw) + +#### Defined in + +[node/internalNode.ts:116](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L116) + +___ + +### serialize + +▸ **serialize**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +the RLP serialized node + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[serialize](BaseVerkleNode.md#serialize) + +#### Defined in + +[node/baseVerkleNode.ts:30](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L30) + +___ + +### setChild + +▸ **setChild**(`index`, `child`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `index` | `number` | +| `child` | [`VerkleNode`](../README.md#verklenode) | + +#### Returns + +`void` + +#### Defined in + +[node/internalNode.ts:33](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L33) + +___ + +### create + +▸ `Static` **create**(`depth`): [`InternalNode`](InternalNode.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `depth` | `number` | + +#### Returns + +[`InternalNode`](InternalNode.md) + +#### Defined in + +[node/internalNode.ts:54](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L54) + +___ + +### fromRawNode + +▸ `Static` **fromRawNode**(`rawNode`, `depth`): [`InternalNode`](InternalNode.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `rawNode` | `Uint8Array`[] | +| `depth` | `number` | + +#### Returns + +[`InternalNode`](InternalNode.md) + +#### Defined in + +[node/internalNode.ts:37](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/internalNode.ts#L37) diff --git a/packages/verkle/docs/classes/LeafNode.md b/packages/verkle/docs/classes/LeafNode.md new file mode 100644 index 000000000..67349ed7d --- /dev/null +++ b/packages/verkle/docs/classes/LeafNode.md @@ -0,0 +1,362 @@ +[@ethereumjs/verkle](../README.md) / LeafNode + +# Class: LeafNode + +## Hierarchy + +- [`BaseVerkleNode`](BaseVerkleNode.md)<[`Leaf`](../enums/VerkleNodeType.md#leaf)\> + + â†ŗ **`LeafNode`** + +## Table of contents + +### Constructors + +- [constructor](LeafNode.md#constructor) + +### Properties + +- [c1](LeafNode.md#c1) +- [c2](LeafNode.md#c2) +- [commitment](LeafNode.md#commitment) +- [depth](LeafNode.md#depth) +- [stem](LeafNode.md#stem) +- [type](LeafNode.md#type) +- [values](LeafNode.md#values) + +### Methods + +- [commit](LeafNode.md#commit) +- [getValue](LeafNode.md#getvalue) +- [hash](LeafNode.md#hash) +- [insert](LeafNode.md#insert) +- [insertMultiple](LeafNode.md#insertmultiple) +- [insertStem](LeafNode.md#insertstem) +- [raw](LeafNode.md#raw) +- [serialize](LeafNode.md#serialize) +- [setDepth](LeafNode.md#setdepth) +- [create](LeafNode.md#create) +- [fromRawNode](LeafNode.md#fromrawnode) + +## Constructors + +### constructor + +â€ĸ **new LeafNode**(`options`) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `options` | `VerkleLeafNodeOptions` | + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[constructor](BaseVerkleNode.md#constructor) + +#### Defined in + +[node/leafNode.ts:15](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L15) + +## Properties + +### c1 + +â€ĸ **c1**: [`Point`](../interfaces/Point.md) + +#### Defined in + +[node/leafNode.ts:11](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L11) + +___ + +### c2 + +â€ĸ **c2**: [`Point`](../interfaces/Point.md) + +#### Defined in + +[node/leafNode.ts:12](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L12) + +___ + +### commitment + +â€ĸ **commitment**: [`Point`](../interfaces/Point.md) + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[commitment](BaseVerkleNode.md#commitment) + +#### Defined in + +[node/baseVerkleNode.ts:8](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L8) + +___ + +### depth + +â€ĸ **depth**: `number` + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[depth](BaseVerkleNode.md#depth) + +#### Defined in + +[node/baseVerkleNode.ts:9](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L9) + +___ + +### stem + +â€ĸ **stem**: `Uint8Array` + +#### Defined in + +[node/leafNode.ts:9](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L9) + +___ + +### type + +â€ĸ **type**: [`VerkleNodeType`](../enums/VerkleNodeType.md) = `VerkleNodeType.Leaf` + +#### Defined in + +[node/leafNode.ts:13](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L13) + +___ + +### values + +â€ĸ **values**: `Uint8Array`[] + +#### Defined in + +[node/leafNode.ts:10](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L10) + +## Methods + +### commit + +▸ **commit**(): [`Point`](../interfaces/Point.md) + +#### Returns + +[`Point`](../interfaces/Point.md) + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[commit](BaseVerkleNode.md#commit) + +#### Defined in + +[node/leafNode.ts:48](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L48) + +___ + +### getValue + +▸ **getValue**(`index`): ``null`` \| `Uint8Array` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `index` | `number` | + +#### Returns + +``null`` \| `Uint8Array` + +#### Defined in + +[node/leafNode.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L52) + +___ + +### hash + +▸ **hash**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[hash](BaseVerkleNode.md#hash) + +#### Defined in + +[node/baseVerkleNode.ts:19](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L19) + +___ + +### insert + +▸ **insert**(`key`, `value`, `nodeResolverFn`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | +| `value` | `Uint8Array` | +| `nodeResolverFn` | () => `void` | + +#### Returns + +`void` + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[insert](BaseVerkleNode.md#insert) + +#### Defined in + +[node/leafNode.ts:56](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L56) + +___ + +### insertMultiple + +▸ **insertMultiple**(`key`, `values`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | +| `values` | `Uint8Array`[] | + +#### Returns + +`void` + +#### Defined in + +[node/leafNode.ts:62](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L62) + +___ + +### insertStem + +▸ **insertStem**(`key`, `value`, `resolver`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | +| `value` | `Uint8Array`[] | +| `resolver` | () => `void` | + +#### Returns + +`void` + +#### Defined in + +[node/leafNode.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L66) + +___ + +### raw + +▸ **raw**(): `Uint8Array`[] + +#### Returns + +`Uint8Array`[] + +#### Overrides + +[BaseVerkleNode](BaseVerkleNode.md).[raw](BaseVerkleNode.md#raw) + +#### Defined in + +[node/leafNode.ts:71](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L71) + +___ + +### serialize + +▸ **serialize**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +the RLP serialized node + +#### Inherited from + +[BaseVerkleNode](BaseVerkleNode.md).[serialize](BaseVerkleNode.md#serialize) + +#### Defined in + +[node/baseVerkleNode.ts:30](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/baseVerkleNode.ts#L30) + +___ + +### setDepth + +▸ **setDepth**(`depth`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `depth` | `number` | + +#### Returns + +`void` + +#### Defined in + +[node/leafNode.ts:82](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L82) + +___ + +### create + +▸ `Static` **create**(`stem`, `values`): [`LeafNode`](LeafNode.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `stem` | `Uint8Array` | +| `values` | `Uint8Array`[] | + +#### Returns + +[`LeafNode`](LeafNode.md) + +#### Defined in + +[node/leafNode.ts:24](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L24) + +___ + +### fromRawNode + +▸ `Static` **fromRawNode**(`rawNode`, `depth`): [`LeafNode`](LeafNode.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `rawNode` | `Uint8Array`[] | +| `depth` | `number` | + +#### Returns + +[`LeafNode`](LeafNode.md) + +#### Defined in + +[node/leafNode.ts:28](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/leafNode.ts#L28) diff --git a/packages/verkle/docs/classes/PrioritizedTaskExecutor.md b/packages/verkle/docs/classes/PrioritizedTaskExecutor.md new file mode 100644 index 000000000..cdb162e3f --- /dev/null +++ b/packages/verkle/docs/classes/PrioritizedTaskExecutor.md @@ -0,0 +1,3 @@ +[@ethereumjs/verkle](../README.md) / PrioritizedTaskExecutor + +# Class: PrioritizedTaskExecutor diff --git a/packages/verkle/docs/classes/VerkleTree.md b/packages/verkle/docs/classes/VerkleTree.md new file mode 100644 index 000000000..68004575f --- /dev/null +++ b/packages/verkle/docs/classes/VerkleTree.md @@ -0,0 +1,585 @@ +[@ethereumjs/verkle](../README.md) / VerkleTree + +# Class: VerkleTree + +The basic verkle tree interface, use with `import { VerkleTree } from '@ethereumjs/verkle'`. + +## Table of contents + +### Constructors + +- [constructor](VerkleTree.md#constructor) + +### Properties + +- [EMPTY\_TREE\_ROOT](VerkleTree.md#empty_tree_root) + +### Methods + +- [batch](VerkleTree.md#batch) +- [checkRoot](VerkleTree.md#checkroot) +- [checkpoint](VerkleTree.md#checkpoint) +- [commit](VerkleTree.md#commit) +- [createProof](VerkleTree.md#createproof) +- [createReadStream](VerkleTree.md#createreadstream) +- [database](VerkleTree.md#database) +- [findLeafNode](VerkleTree.md#findleafnode) +- [findPath](VerkleTree.md#findpath) +- [flushCheckpoints](VerkleTree.md#flushcheckpoints) +- [fromProof](VerkleTree.md#fromproof) +- [get](VerkleTree.md#get) +- [hasCheckpoints](VerkleTree.md#hascheckpoints) +- [lookupNode](VerkleTree.md#lookupnode) +- [persistRoot](VerkleTree.md#persistroot) +- [put](VerkleTree.md#put) +- [revert](VerkleTree.md#revert) +- [root](VerkleTree.md#root) +- [saveStack](VerkleTree.md#savestack) +- [shallowCopy](VerkleTree.md#shallowcopy) +- [verifyProof](VerkleTree.md#verifyproof) +- [walkTree](VerkleTree.md#walktree) +- [create](VerkleTree.md#create) + +## Constructors + +### constructor + +â€ĸ **new VerkleTree**(`opts?`) + +Creates a new verkle tree. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `opts?` | [`VerkleTreeOpts`](../interfaces/VerkleTreeOpts.md) | Options for instantiating the verkle tree Note: in most cases, the static [create](VerkleTree.md#create) constructor should be used. It uses the same API but provides sensible defaults | + +#### Defined in + +[verkleTree.ts:50](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L50) + +## Properties + +### EMPTY\_TREE\_ROOT + +â€ĸ **EMPTY\_TREE\_ROOT**: `Uint8Array` + +The root for an empty tree + +#### Defined in + +[verkleTree.ts:36](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L36) + +## Methods + +### batch + +▸ **batch**(`ops`): `Promise`<`void`\> + +The given hash of operations (key additions or deletions) are executed on the tree +(delete operations are only executed on DB with `deleteFromDB` set to `true`) + +**`Example`** + +```ts +const ops = [ + { type: 'del', key: Uint8Array.from('father') } + , { type: 'put', key: Uint8Array.from('name'), value: Uint8Array.from('Yuri Irsenovich Kim') } + , { type: 'put', key: Uint8Array.from('dob'), value: Uint8Array.from('16 February 1941') } + , { type: 'put', key: Uint8Array.from('spouse'), value: Uint8Array.from('Kim Young-sook') } + , { type: 'put', key: Uint8Array.from('occupation'), value: Uint8Array.from('Clown') } +] +await tree.batch(ops) +``` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `ops` | `BatchDBOp`<`Uint8Array`, `Uint8Array`\>[] | + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[verkleTree.ts:366](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L366) + +___ + +### checkRoot + +▸ **checkRoot**(`root`): `Promise`<`boolean`\> + +Checks if a given root exists. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `root` | `Uint8Array` | + +#### Returns + +`Promise`<`boolean`\> + +#### Defined in + +[verkleTree.ts:120](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L120) + +___ + +### checkpoint + +▸ **checkpoint**(): `void` + +Creates a checkpoint that can later be reverted to or committed. +After this is called, all changes can be reverted until `commit` is called. + +#### Returns + +`void` + +#### Defined in + +[verkleTree.ts:465](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L465) + +___ + +### commit + +▸ **commit**(): `Promise`<`void`\> + +Commits a checkpoint to disk, if current checkpoint is not nested. +If nested, only sets the parent checkpoint as current checkpoint. + +**`Throws`** + +If not during a checkpoint phase + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[verkleTree.ts:474](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L474) + +___ + +### createProof + +▸ **createProof**(`key`): `Promise`<[`Proof`](../README.md#proof)\> + +Creates a proof from a tree and key that can be verified using [verifyProof](VerkleTree.md#verifyproof). + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `key` | `Uint8Array` | + +#### Returns + +`Promise`<[`Proof`](../README.md#proof)\> + +#### Defined in + +[verkleTree.ts:382](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L382) + +___ + +### createReadStream + +▸ **createReadStream**(): `any` + +The `data` event is given an `Object` that has two properties; the `key` and the `value`. Both should be Uint8Arrays. + +#### Returns + +`any` + +Returns a [stream](https://nodejs.org/dist/latest-v12.x/docs/api/stream.html#stream_class_stream_readable) of the contents of the `tree` + +#### Defined in + +[verkleTree.ts:406](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L406) + +___ + +### database + +▸ **database**(`db?`): [`CheckpointDB`](CheckpointDB.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `db?` | `DB`<`Uint8Array`, `Uint8Array`\> | + +#### Returns + +[`CheckpointDB`](CheckpointDB.md) + +#### Defined in + +[verkleTree.ts:86](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L86) + +___ + +### findLeafNode + +▸ **findLeafNode**(`key`, `throwIfMissing?`): `Promise`<``null`` \| [`LeafNode`](LeafNode.md)\> + +Tries to find the leaf node leading up to the given key, or null if not found. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `key` | `Uint8Array` | `undefined` | the search key | +| `throwIfMissing` | `boolean` | `false` | if true, throws if any nodes are missing. Used for verifying proofs. (default: false) | + +#### Returns + +`Promise`<``null`` \| [`LeafNode`](LeafNode.md)\> + +#### Defined in + +[verkleTree.ts:267](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L267) + +___ + +### findPath + +▸ **findPath**(`key`, `throwIfMissing?`): `Promise`<`Path`\> + +Tries to find a path to the node for the given key. +It returns a `stack` of nodes to the closest node. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `key` | `Uint8Array` | `undefined` | the search key | +| `throwIfMissing` | `boolean` | `false` | if true, throws if any nodes are missing. Used for verifying proofs. (default: false) | + +#### Returns + +`Promise`<`Path`\> + +#### Defined in + +[verkleTree.ts:196](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L196) + +___ + +### flushCheckpoints + +▸ **flushCheckpoints**(): `void` + +Flushes all checkpoints, restoring the initial checkpoint state. + +#### Returns + +`void` + +#### Defined in + +[verkleTree.ts:504](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L504) + +___ + +### fromProof + +▸ **fromProof**(`proof`): `Promise`<`void`\> + +Saves the nodes from a proof into the tree. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `proof` | [`Proof`](../README.md#proof) | + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[verkleTree.ts:374](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L374) + +___ + +### get + +▸ **get**(`key`, `throwIfMissing?`): `Promise`<``null`` \| `Uint8Array`\> + +Gets a value given a `key` + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `key` | `Uint8Array` | `undefined` | the key to search for | +| `throwIfMissing` | `boolean` | `false` | if true, throws if any nodes are missing. Used for verifying proofs. (default: false) | + +#### Returns + +`Promise`<``null`` \| `Uint8Array`\> + +A Promise that resolves to `Uint8Array` if a value was found or `null` if no value was found. + +#### Defined in + +[verkleTree.ts:139](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L139) + +___ + +### hasCheckpoints + +▸ **hasCheckpoints**(): `boolean` + +Is the tree during a checkpoint phase? + +#### Returns + +`boolean` + +#### Defined in + +[verkleTree.ts:457](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L457) + +___ + +### lookupNode + +▸ **lookupNode**(`node`): `Promise`<``null`` \| [`VerkleNode`](../README.md#verklenode)\> + +Retrieves a node from db by hash. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `node` | `Uint8Array` \| `Uint8Array`[] | + +#### Returns + +`Promise`<``null`` \| [`VerkleNode`](../README.md#verklenode)\> + +#### Defined in + +[verkleTree.ts:289](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L289) + +___ + +### persistRoot + +▸ **persistRoot**(): `Promise`<`void`\> + +Persists the root hash in the underlying database + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[verkleTree.ts:438](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L438) + +___ + +### put + +▸ **put**(`key`, `value`): `Promise`<`void`\> + +Stores a given `value` at the given `key` or do a delete if `value` is empty +(delete operations are only executed on DB with `deleteFromDB` set to `true`) + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `key` | `Uint8Array` | the key to store the value at | +| `value` | `Uint8Array` | the value to store | + +#### Returns + +`Promise`<`void`\> + +A Promise that resolves once value is stored. + +#### Defined in + +[verkleTree.ts:159](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L159) + +___ + +### revert + +▸ **revert**(): `Promise`<`void`\> + +Reverts the tree to the state it was at when `checkpoint` was first called. +If during a nested checkpoint, sets root to most recent checkpoint, and sets +parent checkpoint as current. + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[verkleTree.ts:490](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L490) + +___ + +### root + +▸ **root**(`value?`): `Uint8Array` + +Gets and/or Sets the current root of the `tree` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `value?` | ``null`` \| `Uint8Array` | + +#### Returns + +`Uint8Array` + +#### Defined in + +[verkleTree.ts:101](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L101) + +___ + +### saveStack + +▸ **saveStack**(`key`, `stack`, `opStack`): `Promise`<`void`\> + +Saves a stack of nodes to the database. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `key` | `Uint8Array` | the key. Should follow the stack | +| `stack` | [`VerkleNode`](../README.md#verklenode)[] | a stack of nodes to the value given by the key | +| `opStack` | `PutBatch`<`Uint8Array`, `Uint8Array`\>[] | a stack of levelup operations to commit at the end of this function | + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[verkleTree.ts:326](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L326) + +___ + +### shallowCopy + +▸ **shallowCopy**(`includeCheckpoints?`): [`VerkleTree`](VerkleTree.md) + +Returns a copy of the underlying tree. + +Note on db: the copy will create a reference to the +same underlying database. + +Note on cache: for memory reasons a copy will not +recreate a new LRU cache but initialize with cache +being deactivated. + +#### Parameters + +| Name | Type | Default value | Description | +| :------ | :------ | :------ | :------ | +| `includeCheckpoints` | `boolean` | `true` | If true and during a checkpoint, the copy will contain the checkpointing metadata and will use the same scratch as underlying db. | + +#### Returns + +[`VerkleTree`](VerkleTree.md) + +#### Defined in + +[verkleTree.ts:422](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L422) + +___ + +### verifyProof + +▸ **verifyProof**(`rootHash`, `key`, `proof`): `Promise`<``null`` \| `Uint8Array`\> + +Verifies a proof. + +**`Throws`** + +If proof is found to be invalid. + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `rootHash` | `Uint8Array` | +| `key` | `Uint8Array` | +| `proof` | [`Proof`](../README.md#proof) | + +#### Returns + +`Promise`<``null`` \| `Uint8Array`\> + +The value from the key, or null if valid proof of non-existence. + +#### Defined in + +[verkleTree.ts:394](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L394) + +___ + +### walkTree + +▸ **walkTree**(`root`, `onFound`): `Promise`<`void`\> + +Walks a tree until finished. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `root` | `Uint8Array` | | +| `onFound` | [`FoundNodeFunction`](../README.md#foundnodefunction) | callback to call when a node is found. This schedules new tasks. If no tasks are available, the Promise resolves. | + +#### Returns + +`Promise`<`void`\> + +Resolves when finished walking tree. + +#### Defined in + +[verkleTree.ts:258](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L258) + +___ + +### create + +▸ `Static` **create**(`opts?`): `Promise`<[`VerkleTree`](VerkleTree.md)\> + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `opts?` | [`VerkleTreeOpts`](../interfaces/VerkleTreeOpts.md) | + +#### Returns + +`Promise`<[`VerkleTree`](VerkleTree.md)\> + +#### Defined in + +[verkleTree.ts:66](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/verkleTree.ts#L66) diff --git a/packages/verkle/docs/classes/WalkController.md b/packages/verkle/docs/classes/WalkController.md new file mode 100644 index 000000000..c7b248f0f --- /dev/null +++ b/packages/verkle/docs/classes/WalkController.md @@ -0,0 +1,147 @@ +[@ethereumjs/verkle](../README.md) / WalkController + +# Class: WalkController + +WalkController is an interface to control how the tree is being traversed. + +## Table of contents + +### Properties + +- [onNode](WalkController.md#onnode) +- [taskExecutor](WalkController.md#taskexecutor) +- [tree](WalkController.md#tree) + +### Methods + +- [allChildren](WalkController.md#allchildren) +- [pushChildrenAtIndex](WalkController.md#pushchildrenatindex) +- [pushNodeToQueue](WalkController.md#pushnodetoqueue) +- [newWalk](WalkController.md#newwalk) + +## Properties + +### onNode + +â€ĸ `Readonly` **onNode**: [`FoundNodeFunction`](../README.md#foundnodefunction) + +#### Defined in + +[util/walkController.ts:13](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/walkController.ts#L13) + +___ + +### taskExecutor + +â€ĸ `Readonly` **taskExecutor**: [`PrioritizedTaskExecutor`](PrioritizedTaskExecutor.md) + +#### Defined in + +[util/walkController.ts:14](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/walkController.ts#L14) + +___ + +### tree + +â€ĸ `Readonly` **tree**: [`VerkleTree`](VerkleTree.md) + +#### Defined in + +[util/walkController.ts:15](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/walkController.ts#L15) + +## Methods + +### allChildren + +▸ **allChildren**(`node`, `key?`): `void` + +Run all children of a node. Priority of these nodes are the key length of the children. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `node` | [`VerkleNode`](../README.md#verklenode) | Node to retrieve all children from of and call onNode on. | +| `key` | `Uint8Array` | The current `key` which would yield the `node` when trying to get this node with a `get` operation. | + +#### Returns + +`void` + +#### Defined in + +[util/walkController.ts:70](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/walkController.ts#L70) + +___ + +### pushChildrenAtIndex + +▸ **pushChildrenAtIndex**(`node`, `key?`, `childIndex`, `priority?`): `void` + +Push the child of an internal node to the event queue. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `node` | [`InternalNode`](InternalNode.md) | The node to select a children from. Should be an InternalNode. | +| `key` | `Uint8Array` | The current key which leads to the corresponding node. | +| `childIndex` | `number` | The child index to add to the event queue. | +| `priority?` | `number` | Optional priority of the event, defaults to the total key length. | + +#### Returns + +`void` + +#### Defined in + +[util/walkController.ts:117](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/walkController.ts#L117) + +___ + +### pushNodeToQueue + +▸ **pushNodeToQueue**(`nodeRef`, `key?`, `priority?`): `void` + +Push a node to the queue. If the queue has places left for tasks, the node is executed immediately, otherwise it is queued. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `nodeRef` | `Uint8Array` | Push a node reference to the event queue. This reference is a 32-byte keccak hash of the value corresponding to the `key`. | +| `key` | `Uint8Array` | The current key. | +| `priority?` | `number` | Optional priority, defaults to key length | + +#### Returns + +`void` + +#### Defined in + +[util/walkController.ts:94](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/walkController.ts#L94) + +___ + +### newWalk + +▸ `Static` **newWalk**(`onNode`, `tree`, `root`, `poolSize?`): `Promise`<`void`\> + +Async function to create and start a new walk over a tree. + +#### Parameters + +| Name | Type | Description | +| :------ | :------ | :------ | +| `onNode` | [`FoundNodeFunction`](../README.md#foundnodefunction) | The `FoundNodeFunction to call if a node is found. | +| `tree` | [`VerkleTree`](VerkleTree.md) | The tree to walk on. | +| `root` | `Uint8Array` | The root key to walk on. | +| `poolSize?` | `number` | Task execution pool size to prevent OOM errors. Defaults to 500. | + +#### Returns + +`Promise`<`void`\> + +#### Defined in + +[util/walkController.ts:40](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/util/walkController.ts#L40) diff --git a/packages/verkle/docs/enums/VerkleNodeType.md b/packages/verkle/docs/enums/VerkleNodeType.md new file mode 100644 index 000000000..abe82c097 --- /dev/null +++ b/packages/verkle/docs/enums/VerkleNodeType.md @@ -0,0 +1,30 @@ +[@ethereumjs/verkle](../README.md) / VerkleNodeType + +# Enumeration: VerkleNodeType + +## Table of contents + +### Enumeration Members + +- [Internal](VerkleNodeType.md#internal) +- [Leaf](VerkleNodeType.md#leaf) + +## Enumeration Members + +### Internal + +â€ĸ **Internal** = ``0`` + +#### Defined in + +[node/types.ts:6](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L6) + +___ + +### Leaf + +â€ĸ **Leaf** = ``1`` + +#### Defined in + +[node/types.ts:7](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L7) diff --git a/packages/verkle/docs/interfaces/CheckpointDBOpts.md b/packages/verkle/docs/interfaces/CheckpointDBOpts.md new file mode 100644 index 000000000..967fe434e --- /dev/null +++ b/packages/verkle/docs/interfaces/CheckpointDBOpts.md @@ -0,0 +1,34 @@ +[@ethereumjs/verkle](../README.md) / CheckpointDBOpts + +# Interface: CheckpointDBOpts + +## Table of contents + +### Properties + +- [cacheSize](CheckpointDBOpts.md#cachesize) +- [db](CheckpointDBOpts.md#db) + +## Properties + +### cacheSize + +â€ĸ `Optional` **cacheSize**: `number` + +Cache size (default: 0) + +#### Defined in + +[types.ts:101](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L101) + +___ + +### db + +â€ĸ **db**: `DB`<`Uint8Array`, `Uint8Array`\> + +A database instance. + +#### Defined in + +[types.ts:96](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L96) diff --git a/packages/verkle/docs/interfaces/Fr.md b/packages/verkle/docs/interfaces/Fr.md new file mode 100644 index 000000000..2e57edb48 --- /dev/null +++ b/packages/verkle/docs/interfaces/Fr.md @@ -0,0 +1,3 @@ +[@ethereumjs/verkle](../README.md) / Fr + +# Interface: Fr diff --git a/packages/verkle/docs/interfaces/Point.md b/packages/verkle/docs/interfaces/Point.md new file mode 100644 index 000000000..50109e8a4 --- /dev/null +++ b/packages/verkle/docs/interfaces/Point.md @@ -0,0 +1,300 @@ +[@ethereumjs/verkle](../README.md) / Point + +# Interface: Point + +## Table of contents + +### Methods + +- [add](Point.md#add) +- [bytes](Point.md#bytes) +- [bytesUncompressed](Point.md#bytesuncompressed) +- [double](Point.md#double) +- [equal](Point.md#equal) +- [isOnCurve](Point.md#isoncurve) +- [mapToBaseField](Point.md#maptobasefield) +- [mapToScalarField](Point.md#maptoscalarfield) +- [neg](Point.md#neg) +- [normalise](Point.md#normalise) +- [scalarMul](Point.md#scalarmul) +- [set](Point.md#set) +- [setBytes](Point.md#setbytes) +- [setBytesUncompressed](Point.md#setbytesuncompressed) +- [setIdentity](Point.md#setidentity) +- [sub](Point.md#sub) + +## Methods + +### add + +▸ **add**(`point1`, `point2`): [`Point`](Point.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `point1` | [`Point`](Point.md) | +| `point2` | [`Point`](Point.md) | + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:41](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L41) + +___ + +### bytes + +▸ **bytes**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +#### Defined in + +[types.ts:13](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L13) + +___ + +### bytesUncompressed + +▸ **bytesUncompressed**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +#### Defined in + +[types.ts:15](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L15) + +___ + +### double + +▸ **double**(`point1`): [`Point`](Point.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `point1` | [`Point`](Point.md) | + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:38](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L38) + +___ + +### equal + +▸ **equal**(`secondPoint`): `boolean` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `secondPoint` | [`Point`](Point.md) | + +#### Returns + +`boolean` + +#### Defined in + +[types.ts:32](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L32) + +___ + +### isOnCurve + +▸ **isOnCurve**(): `boolean` + +#### Returns + +`boolean` + +#### Defined in + +[types.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L47) + +___ + +### mapToBaseField + +▸ **mapToBaseField**(): [`Point`](Point.md) + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:26](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L26) + +___ + +### mapToScalarField + +▸ **mapToScalarField**(`field`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `field` | [`Fr`](Fr.md) | + +#### Returns + +`void` + +#### Defined in + +[types.ts:29](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L29) + +___ + +### neg + +▸ **neg**(): [`Point`](Point.md) + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:55](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L55) + +___ + +### normalise + +▸ **normalise**(): `void` + +#### Returns + +`void` + +#### Defined in + +[types.ts:49](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L49) + +___ + +### scalarMul + +▸ **scalarMul**(`point1`, `scalarMont`): [`Point`](Point.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `point1` | [`Point`](Point.md) | +| `scalarMont` | [`Fr`](Fr.md) | + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:58](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L58) + +___ + +### set + +▸ **set**(): [`Point`](Point.md) + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L52) + +___ + +### setBytes + +▸ **setBytes**(`bytes`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `bytes` | `Uint8Array` | + +#### Returns + +`void` + +#### Defined in + +[types.ts:20](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L20) + +___ + +### setBytesUncompressed + +▸ **setBytesUncompressed**(`bytes`, `trusted`): `void` + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `bytes` | `Uint8Array` | +| `trusted` | `boolean` | + +#### Returns + +`void` + +#### Defined in + +[types.ts:23](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L23) + +___ + +### setIdentity + +▸ **setIdentity**(): [`Point`](Point.md) + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:35](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L35) + +___ + +### sub + +▸ **sub**(`point1`, `point2`): [`Point`](Point.md) + +#### Parameters + +| Name | Type | +| :------ | :------ | +| `point1` | [`Point`](Point.md) | +| `point2` | [`Point`](Point.md) | + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[types.ts:44](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L44) diff --git a/packages/verkle/docs/interfaces/TypedVerkleNode.md b/packages/verkle/docs/interfaces/TypedVerkleNode.md new file mode 100644 index 000000000..ffa0e038e --- /dev/null +++ b/packages/verkle/docs/interfaces/TypedVerkleNode.md @@ -0,0 +1,30 @@ +[@ethereumjs/verkle](../README.md) / TypedVerkleNode + +# Interface: TypedVerkleNode + +## Table of contents + +### Properties + +- [0](TypedVerkleNode.md#0) +- [1](TypedVerkleNode.md#1) + +## Properties + +### 0 + +â€ĸ **0**: [`InternalNode`](../classes/InternalNode.md) + +#### Defined in + +[node/types.ts:11](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L11) + +___ + +### 1 + +â€ĸ **1**: [`LeafNode`](../classes/LeafNode.md) + +#### Defined in + +[node/types.ts:12](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L12) diff --git a/packages/verkle/docs/interfaces/VerkleNodeInterface.md b/packages/verkle/docs/interfaces/VerkleNodeInterface.md new file mode 100644 index 000000000..925a51804 --- /dev/null +++ b/packages/verkle/docs/interfaces/VerkleNodeInterface.md @@ -0,0 +1,57 @@ +[@ethereumjs/verkle](../README.md) / VerkleNodeInterface + +# Interface: VerkleNodeInterface + +## Implemented by + +- [`BaseVerkleNode`](../classes/BaseVerkleNode.md) + +## Table of contents + +### Methods + +- [commit](VerkleNodeInterface.md#commit) +- [hash](VerkleNodeInterface.md#hash) +- [serialize](VerkleNodeInterface.md#serialize) + +## Methods + +### commit + +▸ **commit**(): [`Point`](Point.md) + +#### Returns + +[`Point`](Point.md) + +#### Defined in + +[node/types.ts:18](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L18) + +___ + +### hash + +▸ **hash**(): `any` + +#### Returns + +`any` + +#### Defined in + +[node/types.ts:19](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L19) + +___ + +### serialize + +▸ **serialize**(): `Uint8Array` + +#### Returns + +`Uint8Array` + +#### Defined in + +[node/types.ts:20](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L20) diff --git a/packages/verkle/docs/interfaces/VerkleNodeOptions.md b/packages/verkle/docs/interfaces/VerkleNodeOptions.md new file mode 100644 index 000000000..070465d87 --- /dev/null +++ b/packages/verkle/docs/interfaces/VerkleNodeOptions.md @@ -0,0 +1,30 @@ +[@ethereumjs/verkle](../README.md) / VerkleNodeOptions + +# Interface: VerkleNodeOptions + +## Table of contents + +### Properties + +- [0](VerkleNodeOptions.md#0) +- [1](VerkleNodeOptions.md#1) + +## Properties + +### 0 + +â€ĸ **0**: `VerkleInternalNodeOptions` + +#### Defined in + +[node/types.ts:45](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L45) + +___ + +### 1 + +â€ĸ **1**: `VerkleLeafNodeOptions` + +#### Defined in + +[node/types.ts:46](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/node/types.ts#L46) diff --git a/packages/verkle/docs/interfaces/VerkleTreeOpts.md b/packages/verkle/docs/interfaces/VerkleTreeOpts.md new file mode 100644 index 000000000..2983d0edc --- /dev/null +++ b/packages/verkle/docs/interfaces/VerkleTreeOpts.md @@ -0,0 +1,62 @@ +[@ethereumjs/verkle](../README.md) / VerkleTreeOpts + +# Interface: VerkleTreeOpts + +## Table of contents + +### Properties + +- [cacheSize](VerkleTreeOpts.md#cachesize) +- [db](VerkleTreeOpts.md#db) +- [root](VerkleTreeOpts.md#root) +- [useRootPersistence](VerkleTreeOpts.md#userootpersistence) + +## Properties + +### cacheSize + +â€ĸ `Optional` **cacheSize**: `number` + +LRU cache for tree nodes to allow for faster node retrieval. + +Default: 0 (deactivated) + +#### Defined in + +[types.ts:84](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L84) + +___ + +### db + +â€ĸ `Optional` **db**: `DB`<`Uint8Array`, `Uint8Array`\> + +A database instance. + +#### Defined in + +[types.ts:67](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L67) + +___ + +### root + +â€ĸ `Optional` **root**: `Uint8Array` + +A `Uint8Array` for the root of a previously stored tree + +#### Defined in + +[types.ts:72](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L72) + +___ + +### useRootPersistence + +â€ĸ `Optional` **useRootPersistence**: `boolean` + +Store the root inside the database after every `write` operation + +#### Defined in + +[types.ts:77](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/verkle/src/types.ts#L77) diff --git a/packages/verkle/package.json b/packages/verkle/package.json index 4e3e26da3..ca1d5fa68 100644 --- a/packages/verkle/package.json +++ b/packages/verkle/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/verkle", - "version": "0.0.1", + "version": "0.0.2", "description": "Implementation of verkle trees as used in Ethereum.", "keywords": [ "verkle", @@ -48,13 +48,14 @@ "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node", "test:node": "npx vitest run", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/rlp": "5.0.2", - "@ethereumjs/util": "9.0.2", "lru-cache": "10.1.0", - "rust-verkle-wasm": "^0.0.1" + "verkle-cryptography-wasm": "^0.4.0", + "@ethereumjs/rlp": "^5.0.2", + "@ethereumjs/util": "^9.0.3" }, "engines": { "node": ">=18" diff --git a/packages/verkle/src/node/baseVerkleNode.ts b/packages/verkle/src/node/baseVerkleNode.ts index 01aee3ebf..43edb1500 100644 --- a/packages/verkle/src/node/baseVerkleNode.ts +++ b/packages/verkle/src/node/baseVerkleNode.ts @@ -2,10 +2,8 @@ import { RLP } from '@ethereumjs/rlp' import { type VerkleNodeInterface, type VerkleNodeOptions, type VerkleNodeType } from './types.js' -import type { Point } from '../types.js' - export abstract class BaseVerkleNode implements VerkleNodeInterface { - public commitment: Point + public commitment: Uint8Array public depth: number constructor(options: VerkleNodeOptions[T]) { @@ -13,7 +11,7 @@ export abstract class BaseVerkleNode implements Verkle this.depth = options.depth } - abstract commit(): Point + abstract commit(): Uint8Array // Hash returns the field representation of the commitment. hash(): Uint8Array { diff --git a/packages/verkle/src/node/internalNode.ts b/packages/verkle/src/node/internalNode.ts index 937174412..06869e117 100644 --- a/packages/verkle/src/node/internalNode.ts +++ b/packages/verkle/src/node/internalNode.ts @@ -6,13 +6,12 @@ import { BaseVerkleNode } from './baseVerkleNode.js' import { LeafNode } from './leafNode.js' import { NODE_WIDTH, VerkleNodeType } from './types.js' -import type { Point } from '../types.js' import type { VerkleNode, VerkleNodeOptions } from './types.js' export class InternalNode extends BaseVerkleNode { // Array of references to children nodes public children: Array - public copyOnWrite: Record + public copyOnWrite: Record public type = VerkleNodeType.Internal /* TODO: options.children is not actually used here */ @@ -22,7 +21,7 @@ export class InternalNode extends BaseVerkleNode { this.copyOnWrite = options.copyOnWrite ?? {} } - commit(): Point { + commit(): Uint8Array { throw new Error('Not implemented') } @@ -46,7 +45,7 @@ export class InternalNode extends BaseVerkleNode { } // TODO: Generate Point from rawNode value - const commitment = rawNode[rawNode.length - 1] as unknown as Point + const commitment = rawNode[rawNode.length - 1] return new InternalNode({ commitment, depth }) } diff --git a/packages/verkle/src/node/leafNode.ts b/packages/verkle/src/node/leafNode.ts index dd11308d8..330fbf17c 100644 --- a/packages/verkle/src/node/leafNode.ts +++ b/packages/verkle/src/node/leafNode.ts @@ -38,14 +38,14 @@ export class LeafNode extends BaseVerkleNode { const stem = rawNode[1] // TODO: Convert the rawNode commitments to points - const commitment = rawNode[2] as unknown as Point + const commitment = rawNode[2] const c1 = rawNode[3] as unknown as Point const c2 = rawNode[4] as unknown as Point const values = rawNode.slice(5, rawNode.length) return new LeafNode({ depth, stem, values, c1, c2, commitment }) } - commit(): Point { + commit(): Uint8Array { throw new Error('Not implemented') } @@ -72,7 +72,7 @@ export class LeafNode extends BaseVerkleNode { return [ new Uint8Array([VerkleNodeType.Leaf]), this.stem, - this.commitment.bytes(), + this.commitment, this.c1.bytes(), this.c2.bytes(), ...this.values, diff --git a/packages/verkle/src/node/types.ts b/packages/verkle/src/node/types.ts index ab956271f..4070d1e7a 100644 --- a/packages/verkle/src/node/types.ts +++ b/packages/verkle/src/node/types.ts @@ -15,14 +15,14 @@ export interface TypedVerkleNode { export type VerkleNode = TypedVerkleNode[VerkleNodeType] export interface VerkleNodeInterface { - commit(): Point + commit(): Uint8Array hash(): any serialize(): Uint8Array } interface BaseVerkleNodeOptions { // Value of the commitment - commitment: Point + commitment: Uint8Array depth: number } @@ -32,7 +32,7 @@ interface VerkleInternalNodeOptions extends BaseVerkleNodeOptions { // Values of the child commitments before the tree is modified by inserts. // This is useful because the delta of the child commitments can be used to efficiently update the node's commitment - copyOnWrite?: Record + copyOnWrite?: Record } interface VerkleLeafNodeOptions extends BaseVerkleNodeOptions { stem: Uint8Array diff --git a/packages/verkle/src/types.ts b/packages/verkle/src/types.ts index 596b5ad0e..63e7f18f8 100644 --- a/packages/verkle/src/types.ts +++ b/packages/verkle/src/types.ts @@ -3,6 +3,7 @@ import { utf8ToBytes } from '@ethereumjs/util' import type { VerkleNode } from './node/index.js' import type { WalkController } from './util/walkController.js' import type { DB } from '@ethereumjs/util' +import type { VerkleCrypto as VerkleFFI } from 'verkle-cryptography-wasm' // Field representation of a commitment export interface Fr {} @@ -61,6 +62,10 @@ export interface Point { export type Proof = Uint8Array[] export interface VerkleTreeOpts { + /** + * An instantiated Verkle Cryptography interface + */ + verkleCrypto: any /** * A database instance. */ @@ -116,3 +121,5 @@ export type FoundNodeFunction = ( ) => void export const ROOT_DB_KEY = utf8ToBytes('__root__') + +export type VerkleCrypto = VerkleFFI diff --git a/packages/verkle/src/util/crypto.ts b/packages/verkle/src/util/crypto.ts index ca5aa03b6..b64bfec9c 100644 --- a/packages/verkle/src/util/crypto.ts +++ b/packages/verkle/src/util/crypto.ts @@ -1,46 +1,27 @@ import { type Address, bigIntToBytes, - bytesToHex, concatBytes, int32ToBytes, setLengthLeft, setLengthRight, } from '@ethereumjs/util' -import { pedersen_hash, verify_update } from 'rust-verkle-wasm' -import type { Point } from '../types.js' - -export function pedersenHash(input: Uint8Array): Uint8Array { - const pedersenHash = pedersen_hash(input) - - if (pedersenHash === null) { - throw new Error( - `pedersenHash: Wrong pedersenHash input: ${bytesToHex( - input - )}. This might happen if length is not correct.` - ) - } - - return pedersenHash -} - -export function verifyUpdate( - root: Uint8Array, - proof: Uint8Array, - keyValues: Map -): Uint8Array { - return verify_update(root, proof, keyValues) -} +import type { VerkleCrypto } from 'verkle-cryptography-wasm' /** * @dev Returns the 31-bytes verkle tree stem for a given address and tree index. * @dev Assumes that the verkle node width = 256 + * @param ffi The verkle ffi object from verkle-crypotography-wasm. * @param address The address to generate the tree key for. * @param treeIndex The index of the tree to generate the key for. Defaults to 0. * @return The 31-bytes verkle tree stem as a Uint8Array. */ -export function getStem(address: Address, treeIndex: number | bigint = 0): Uint8Array { +export function getStem( + ffi: VerkleCrypto, + address: Address, + treeIndex: number | bigint = 0 +): Uint8Array { const address32 = setLengthLeft(address.toBytes(), 32) let treeIndexBytes: Uint8Array @@ -50,8 +31,7 @@ export function getStem(address: Address, treeIndex: number | bigint = 0): Uint8 treeIndexBytes = setLengthRight(bigIntToBytes(BigInt(treeIndex), true).slice(0, 32), 32) } - const input = concatBytes(address32, treeIndexBytes) - const treeStem = pedersenHash(input).slice(0, 31) + const treeStem = ffi.getTreeKey(address32, treeIndexBytes, 0).slice(0, 31) return treeStem } @@ -69,13 +49,4 @@ export function getKey(stem: Uint8Array, subIndex: Uint8Array): Uint8Array { return treeKey } -export function verifyProof( - root: Uint8Array, - proof: Uint8Array, - keyValues: Map -): Uint8Array { - return verify_update(root, proof, keyValues) -} - -// TODO: Replace this by the actual value of Point().Identity() from the Go code. -export const POINT_IDENTITY = new Uint8Array(32).fill(0) as unknown as Point +export const POINT_IDENTITY = new Uint8Array(0) diff --git a/packages/verkle/src/verkleTree.ts b/packages/verkle/src/verkleTree.ts index b756262f6..261865903 100644 --- a/packages/verkle/src/verkleTree.ts +++ b/packages/verkle/src/verkleTree.ts @@ -1,5 +1,6 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ import { KeyEncoding, Lock, ValueEncoding, equalsBytes, zeros } from '@ethereumjs/util' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' import { CheckpointDB } from './db/checkpoint.js' import { InternalNode } from './node/internalNode.js' @@ -30,6 +31,7 @@ export class VerkleTree { protected readonly _opts: VerkleTreeOptsWithDefaults = { useRootPersistence: false, cacheSize: 0, + verkleCrypto: undefined, } /** The root for an empty tree */ @@ -41,6 +43,7 @@ export class VerkleTree { protected _lock = new Lock() protected _root: Uint8Array + protected verkleCrypto: any /** * Creates a new verkle tree. * @param opts Options for instantiating the verkle tree @@ -61,6 +64,12 @@ export class VerkleTree { if (opts?.root) { this.root(opts.root) } + + if (opts === undefined || opts?.verkleCrypto === undefined) { + throw new Error('instantiated verkle cryptography option required for verkle tries') + } + + this.verkleCrypto = opts?.verkleCrypto } static async create(opts?: VerkleTreeOpts) { @@ -80,6 +89,13 @@ export class VerkleTree { } } + if (opts === undefined) { + opts = { + verkleCrypto: loadVerkleCrypto, + } + } + opts.verkleCrypto = await loadVerkleCrypto() + return new VerkleTree(opts) } @@ -425,6 +441,7 @@ export class VerkleTree { db: this._db.db.shallowCopy(), root: this.root(), cacheSize: 0, + verkleCrypto: this.verkleCrypto, }) if (includeCheckpoints && this.hasCheckpoints()) { tree._db.setCheckpoints(this._db.checkpoints) diff --git a/packages/verkle/test/crypto.spec.ts b/packages/verkle/test/crypto.spec.ts index b1448edac..604fd82d2 100644 --- a/packages/verkle/test/crypto.spec.ts +++ b/packages/verkle/test/crypto.spec.ts @@ -1,20 +1,28 @@ import { Address, bytesToHex } from '@ethereumjs/util' -import { assert, describe, it } from 'vitest' +import { loadVerkleCrypto } from 'verkle-cryptography-wasm' +import { assert, beforeAll, describe, it } from 'vitest' import { getStem } from '../src/index.js' +import type { VerkleCrypto } from '../src/index.js' + describe('Verkle cryptographic helpers', () => { - it('getStem(): returns the expected stems', async () => { + let verkle: VerkleCrypto + beforeAll(async () => { + verkle = await loadVerkleCrypto() + }) + + it('getStem(): returns the expected stems', () => { // Empty address assert.equal( - bytesToHex(getStem(Address.fromString('0x0000000000000000000000000000000000000000'))), - '0xbf101a6e1c8e83c11bd203a582c7981b91097ec55cbd344ce09005c1f26d19' + bytesToHex(getStem(verkle, Address.fromString('0x0000000000000000000000000000000000000000'))), + '0x1a100684fd68185060405f3f160e4bb6e034194336b547bdae323f888d5332' ) // Non-empty address assert.equal( - bytesToHex(getStem(Address.fromString('0x71562b71999873DB5b286dF957af199Ec94617f7'))), - '0x274cde18dd9dbb04caf16ad5ee969c19fe6ca764d5688b5e1d419f4ac6cd16' + bytesToHex(getStem(verkle, Address.fromString('0x71562b71999873DB5b286dF957af199Ec94617f7'))), + '0x1540dfad7755b40be0768c6aa0a5096fbf0215e0e8cf354dd928a178346466' ) }) }) diff --git a/packages/vm/CHANGELOG.md b/packages/vm/CHANGELOG.md index 6007f4912..6877c0d6a 100644 --- a/packages/vm/CHANGELOG.md +++ b/packages/vm/CHANGELOG.md @@ -6,6 +6,67 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 8.0.0 - 2024-03-05 + +### New EVM.create() Async Static Constructor / Mandatory VM.create() Constructor + +This is an in-between breaking release on both the EVM and VM packages due to a problematic top level await() discovery in the underlying `rustbn-wasm` library (see issue [#10](https://github.com/ethereumjs/rustbn-wasm/issues/10)) generally affecting the compatiblity of our libraries. + +The `EVM` direct constructor initialization with `new EVM()` now has been deprecated and replaced by an async static `create()` constructor, as it is already done in various other libraries in the EthereumJS monorepo, see PRs [#3304](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3304/) and [#3315](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3315). If you pass in a custom `EVM` along your `VM` initialization you **need to update your EVM initialization**. + +An EVM is now initialized like the following: + +```ts +import { hexToBytes } from '@ethereumjs/util' +import { EVM } from '@ethereumjs/evm' + +const evm = await EVM.create() +const res = await evm.runCode({ code: hexToBytes('0x6001') }) +``` + +For the `VM` there has been an async `create()` constructor before already and the main constructor was labelled as `deprecated`. While this main constructor was still working before, along with these releases **the main VM constructor is now "fully out of order" and VM initialization solely work with the async `create()` constructor**. + +Beyond solving this specific problem this generally allows for a cleaner and async-complete initialization of underlying libraries and is more future proof towards eventual upcoming async initialization additions. + +### Full 4844 Browser Readiness + +#### WASM KZG + +Shortly following the "Dencun Hardfork Support" release round from last month, this is now the first round of releases where the EthereumJS libraries are now fully browser compatible regarding the new 4844 functionality, see PRs [#3294](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3294) and [#3296](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3296)! 🎉 + +Our WASM wizard @acolytec3 has spent the last two weeks and created a WASM build of the [c-kzg](https://github.com/benjaminion/c-kzg) library which we have released under the `kzg-wasm` name on npm (and you can also use independently for other projects). See the newly created [GitHub repository](https://github.com/ethereumjs/kzg-wasm) for some library-specific documentation. + +This WASM KZG library can now be used for KZG initialization (replacing the old recommended `c-kzg` initialization), see the respective [README section](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/tx/README.md#kzg-initialization) from the tx library for usage instructions (which is also accurate for the other using upstream libraries like block or EVM). + +Note that `kzg-wasm` needs to be added manually to your own dependencies and the KZG initialization code needs to be adopted like the following (which you will likely want to do in most cases, so if you deal with post Dencun EVM bytecode and/or 4844 blob txs in any way): + +```typescript +import { loadKZG } from 'kzg-wasm' +import { Chain, Common, Hardfork } from '@ethereumjs/common' + +const kzg = await loadKZG() + +// Instantiate `common` +const common = new Common({ + chain: Chain.Mainnet, + hardfork: Hardfork.Cancun, + customCrypto: { kzg }, +}) +``` + +Manual addition is necessary because we did not want to bundle our libraries with WASM code by default, since some projects are then prevented from using our libraries. + +Note that passing in the KZG setup file is not necessary anymore, since this is now defaulting to the setup file from the official [KZG ceremony](https://ceremony.ethereum.org/) (which is now bundled with the KZG library). + +#### Trie Node.js Import Bug + +Since this fits well also to be placed here relatively prominently for awareness: we had a relatively nasty bug in the `@ethereumjs/trie` library with a `Node.js` web stream import also affecting browser compatibility, see PR [#3280](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3280). This bug has been fixed along with these releases and this library now references the updated trie library version. + +### Other Changes + +- Support for Preimage generation (verkle-related, experimental), new `reportPreimages` `VM.runTx()` option, PR [#3143](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3143) and [#3298](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3298) +- Early support for [EIP-2935](https://eips.ethereum.org/EIPS/eip-2935) - "Save historical block hashes in state" (Verkle related, likely subject to change), PRs [#3268](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3268) and [#3327](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3327) + ## 7.2.1 - 2024-02-08 - Hotfix release moving the `@ethereumjs/verkle` dependency for `@ethereumjs/statemanager` from a peer dependency to the main dependencis (note that this decision might be temporary) diff --git a/packages/vm/README.md b/packages/vm/README.md index a6cb81553..814a0422c 100644 --- a/packages/vm/README.md +++ b/packages/vm/README.md @@ -26,7 +26,7 @@ To obtain the latest version, simply require the project using `npm`: npm install @ethereumjs/vm ``` -**Note:** If you want to work with `EIP-4844` related functionality, you will have additional manual installation steps for the **KZG setup**, see related section below. +**Note:** Starting with the Dencun hardfork `EIP-4844` related functionality will become an integrated part of the EVM functionality with the activation of the point evaluation precompile. It is therefore strongly recommended to _always_ run the EVM with a KZG library installed and initialized, see [KZG Setup](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/tx/README.md#kzg-setup) for instructions. ## Usage @@ -60,7 +60,9 @@ const main = async () => { main() ``` -Note that there is an additional API method `VM.runBlock()` which allows to run the whole block and execute all included transactions along. +Additionally to the `VM.runTx()` method there is an API method `VM.runBlock()` which allows to run the whole block and execute all included transactions along. + +Note: with the switch from v7 to v8 the old direct `new VM()` constructor usage has been fully deprecated and a `VM` can now solely be instantiated with the async static `VM.create()` constructor. This also goes for the underlying `EVM` if you use a custom `EVM`. ### Building a Block @@ -312,9 +314,9 @@ main() For a list with supported EIPs see the [@ethereumjs/evm](https://github.com/ethereumjs/ethereumjs-monorepo/tree/master/packages/evm) documentation. -### EIP-4844 Shard Blob Transactions Support (experimental) +### EIP-4844 Shard Blob Transactions Support -This library supports an experimental version of the blob transaction type introduced with [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844) as being specified in the [01d3209](https://github.com/ethereum/EIPs/commit/01d320998d1d53d95f347b5f43feaf606f230703) EIP version from February 8, 2023 and deployed along `eip4844-devnet-4` (January 2023) starting with `v1.3.0`. +This library supports the blob transaction type introduced with [EIP-4844](https://eips.ethereum.org/EIPS/eip-4844). #### Initialization diff --git a/packages/vm/benchmarks/util.ts b/packages/vm/benchmarks/util.ts index ec301a63c..de5f41f94 100644 --- a/packages/vm/benchmarks/util.ts +++ b/packages/vm/benchmarks/util.ts @@ -1,4 +1,13 @@ -import { Account, Address, BIGINT_0, equalsBytes, toBytes } from '@ethereumjs/util' +import { + Account, + Address, + BIGINT_0, + PrefixedHexString, + equalsBytes, + hexToBytes, + isHexPrefixed, + toBytes, +} from '@ethereumjs/util' import { Common } from '@ethereumjs/common' import { Block } from '@ethereumjs/block' import { DefaultStateManager } from '@ethereumjs/statemanager' @@ -14,9 +23,9 @@ export interface BenchmarksType { } interface StateTestPreAccount { - balance: string - code: string - nonce: string + balance: PrefixedHexString + code: PrefixedHexString + nonce: PrefixedHexString storage: { [k: string]: string } } @@ -29,18 +38,24 @@ export async function getPreState( const state = new DefaultStateManager() await state.checkpoint() for (const k in pre) { - const address = new Address(toBytes(k)) + const address = new Address(hexToBytes(isHexPrefixed(k) ? k : `0x${k}`)) const { nonce, balance, code, storage } = pre[k] const account = new Account(BigInt(nonce), BigInt(balance)) await state.putAccount(address, account) await state.putContractCode(address, toBytes(code)) - for (const sk in storage) { - const sv = storage[sk] - const valueBytes = toBytes(sv) + for (const storageKey in storage) { + const storageValue = storage[storageKey] + const storageValueBytes = hexToBytes( + isHexPrefixed(storageValue) ? storageValue : `0x${storageValue}` + ) // verify if this value buffer is not a zero buffer. if so, we should not write it... - const zeroBytesEquivalent = new Uint8Array(valueBytes.length) - if (!equalsBytes(zeroBytesEquivalent, valueBytes)) { - await state.putContractStorage(address, toBytes(sk), toBytes(sv)) + const zeroBytesEquivalent = new Uint8Array(storageValueBytes.length) + if (!equalsBytes(zeroBytesEquivalent, storageValueBytes)) { + await state.putContractStorage( + address, + hexToBytes(isHexPrefixed(storageKey) ? storageKey : `0x${storageKey}`), + storageValueBytes + ) } } } diff --git a/packages/vm/docs/README.md b/packages/vm/docs/README.md index f6be66776..457d77a24 100644 --- a/packages/vm/docs/README.md +++ b/packages/vm/docs/README.md @@ -17,6 +17,7 @@ - [AfterBlockEvent](interfaces/AfterBlockEvent.md) - [AfterTxEvent](interfaces/AfterTxEvent.md) +- [ApplyBlockResult](interfaces/ApplyBlockResult.md) - [BaseTxReceipt](interfaces/BaseTxReceipt.md) - [BuildBlockOpts](interfaces/BuildBlockOpts.md) - [BuilderOpts](interfaces/BuilderOpts.md) @@ -124,4 +125,4 @@ Returns the encoded tx receipt. #### Defined in -[vm/src/runBlock.ts:592](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/runBlock.ts#L592) +[vm/src/runBlock.ts:689](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/runBlock.ts#L689) diff --git a/packages/vm/docs/classes/BlockBuilder.md b/packages/vm/docs/classes/BlockBuilder.md index b9de5da93..a5f41a6d0 100644 --- a/packages/vm/docs/classes/BlockBuilder.md +++ b/packages/vm/docs/classes/BlockBuilder.md @@ -44,7 +44,7 @@ #### Defined in -[vm/src/buildBlock.ts:75](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L75) +[vm/src/buildBlock.ts:76](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L76) ## Properties @@ -56,7 +56,7 @@ The cumulative blob gas used by the blobs in a block #### Defined in -[vm/src/buildBlock.ts:51](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L51) +[vm/src/buildBlock.ts:52](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L52) ___ @@ -68,7 +68,7 @@ The cumulative gas used by the transactions added to the block. #### Defined in -[vm/src/buildBlock.ts:47](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L47) +[vm/src/buildBlock.ts:48](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L48) ## Accessors @@ -82,7 +82,7 @@ The cumulative gas used by the transactions added to the block. #### Defined in -[vm/src/buildBlock.ts:71](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L71) +[vm/src/buildBlock.ts:72](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L72) ___ @@ -96,7 +96,7 @@ ___ #### Defined in -[vm/src/buildBlock.ts:67](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L67) +[vm/src/buildBlock.ts:68](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L68) ## Methods @@ -123,7 +123,7 @@ the remaining gas in the block. #### Defined in -[vm/src/buildBlock.ts:202](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L202) +[vm/src/buildBlock.ts:203](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L203) ___ @@ -153,7 +153,7 @@ as the signer will be awarded the txs amount spent on gas as they are added. #### Defined in -[vm/src/buildBlock.ts:292](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L292) +[vm/src/buildBlock.ts:293](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L293) ___ @@ -167,7 +167,7 @@ ___ #### Defined in -[vm/src/buildBlock.ts:127](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L127) +[vm/src/buildBlock.ts:128](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L128) ___ @@ -181,7 +181,7 @@ ___ #### Defined in -[vm/src/buildBlock.ts:356](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L356) +[vm/src/buildBlock.ts:357](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L357) ___ @@ -197,7 +197,7 @@ Calculates and returns the logs bloom for the block. #### Defined in -[vm/src/buildBlock.ts:141](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L141) +[vm/src/buildBlock.ts:142](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L142) ___ @@ -213,7 +213,7 @@ Calculates and returns the receiptTrie for the block. #### Defined in -[vm/src/buildBlock.ts:153](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L153) +[vm/src/buildBlock.ts:154](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L154) ___ @@ -229,7 +229,7 @@ Reverts the checkpoint on the StateManager to reset the state from any transacti #### Defined in -[vm/src/buildBlock.ts:273](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L273) +[vm/src/buildBlock.ts:274](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L274) ___ @@ -245,4 +245,4 @@ Calculates and returns the transactionsTrie for the block. #### Defined in -[vm/src/buildBlock.ts:134](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L134) +[vm/src/buildBlock.ts:135](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L135) diff --git a/packages/vm/docs/classes/VM.md b/packages/vm/docs/classes/VM.md index 35bac65e4..75a7725c3 100644 --- a/packages/vm/docs/classes/VM.md +++ b/packages/vm/docs/classes/VM.md @@ -21,7 +21,6 @@ This class is an AsyncEventEmitter, please consult the README to learn how to us - [buildBlock](VM.md#buildblock) - [errorStr](VM.md#errorstr) -- [init](VM.md#init) - [runBlock](VM.md#runblock) - [runTx](VM.md#runtx) - [shallowCopy](VM.md#shallowcopy) @@ -113,7 +112,7 @@ An instance of [BlockBuilder](BlockBuilder.md) with methods: #### Defined in -[vm/src/vm.ts:235](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L235) +[vm/src/vm.ts:222](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L222) ___ @@ -129,28 +128,7 @@ Return a compact error string representation of the object #### Defined in -[vm/src/vm.ts:277](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L277) - -___ - -### init - -▸ **init**(`__namedParameters?`): `Promise`<`void`\> - -#### Parameters - -| Name | Type | -| :------ | :------ | -| `__namedParameters` | `Object` | -| `__namedParameters.genesisState?` | `GenesisState` | - -#### Returns - -`Promise`<`void`\> - -#### Defined in - -[vm/src/vm.ts:159](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L159) +[vm/src/vm.ts:264](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L264) ___ @@ -176,7 +154,7 @@ invalid. If an error is thrown from an event handler, the state may or may not b #### Defined in -[vm/src/vm.ts:204](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L204) +[vm/src/vm.ts:191](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L191) ___ @@ -202,7 +180,7 @@ reverted. #### Defined in -[vm/src/vm.ts:217](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L217) +[vm/src/vm.ts:204](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L204) ___ @@ -232,7 +210,7 @@ the `downlevelCaches` option to `false`. #### Defined in -[vm/src/vm.ts:252](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L252) +[vm/src/vm.ts:239](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/vm.ts#L239) ___ diff --git a/packages/vm/docs/enums/BuildStatus.md b/packages/vm/docs/enums/BuildStatus.md index bf6821718..0dbc4cacb 100644 --- a/packages/vm/docs/enums/BuildStatus.md +++ b/packages/vm/docs/enums/BuildStatus.md @@ -18,7 +18,7 @@ #### Defined in -[vm/src/buildBlock.ts:35](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L35) +[vm/src/buildBlock.ts:36](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L36) ___ @@ -28,7 +28,7 @@ ___ #### Defined in -[vm/src/buildBlock.ts:36](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L36) +[vm/src/buildBlock.ts:37](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L37) ___ @@ -38,4 +38,4 @@ ___ #### Defined in -[vm/src/buildBlock.ts:34](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L34) +[vm/src/buildBlock.ts:35](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/buildBlock.ts#L35) diff --git a/packages/vm/docs/interfaces/AfterBlockEvent.md b/packages/vm/docs/interfaces/AfterBlockEvent.md index 33d933f8d..3ac5f6475 100644 --- a/packages/vm/docs/interfaces/AfterBlockEvent.md +++ b/packages/vm/docs/interfaces/AfterBlockEvent.md @@ -17,6 +17,7 @@ Result of runBlock - [block](AfterBlockEvent.md#block) - [gasUsed](AfterBlockEvent.md#gasused) - [logsBloom](AfterBlockEvent.md#logsbloom) +- [preimages](AfterBlockEvent.md#preimages) - [receipts](AfterBlockEvent.md#receipts) - [receiptsRoot](AfterBlockEvent.md#receiptsroot) - [results](AfterBlockEvent.md#results) @@ -30,7 +31,7 @@ Result of runBlock #### Defined in -[vm/src/types.ts:311](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L311) +[vm/src/types.ts:331](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L331) ___ @@ -46,7 +47,7 @@ The gas used after executing the block #### Defined in -[vm/src/types.ts:298](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L298) +[vm/src/types.ts:296](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L296) ___ @@ -62,7 +63,23 @@ The bloom filter of the LOGs (events) after executing the block #### Defined in -[vm/src/types.ts:302](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L302) +[vm/src/types.ts:326](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L326) + +___ + +### preimages + +â€ĸ `Optional` **preimages**: `Map`<`string`, `Uint8Array`\> + +Preimages mapping of the touched accounts from the block (see reportPreimages option) + +#### Inherited from + +[RunBlockResult](RunBlockResult.md).[preimages](RunBlockResult.md#preimages) + +#### Defined in + +[vm/src/types.ts:312](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L312) ___ @@ -78,7 +95,7 @@ Receipts generated for transactions in the block #### Defined in -[vm/src/types.ts:286](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L286) +[vm/src/types.ts:304](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L304) ___ @@ -94,7 +111,7 @@ The receipt root after executing the block #### Defined in -[vm/src/types.ts:306](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L306) +[vm/src/types.ts:300](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L300) ___ @@ -110,7 +127,7 @@ Results of executing the transactions in the block #### Defined in -[vm/src/types.ts:290](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L290) +[vm/src/types.ts:308](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L308) ___ @@ -126,4 +143,4 @@ The stateRoot after executing the block #### Defined in -[vm/src/types.ts:294](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L294) +[vm/src/types.ts:322](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L322) diff --git a/packages/vm/docs/interfaces/AfterTxEvent.md b/packages/vm/docs/interfaces/AfterTxEvent.md index 8461ba3a8..30f529356 100644 --- a/packages/vm/docs/interfaces/AfterTxEvent.md +++ b/packages/vm/docs/interfaces/AfterTxEvent.md @@ -22,6 +22,7 @@ Execution result of a transaction - [execResult](AfterTxEvent.md#execresult) - [gasRefund](AfterTxEvent.md#gasrefund) - [minerValue](AfterTxEvent.md#minervalue) +- [preimages](AfterTxEvent.md#preimages) - [receipt](AfterTxEvent.md#receipt) - [totalGasSpent](AfterTxEvent.md#totalgasspent) - [transaction](AfterTxEvent.md#transaction) @@ -40,7 +41,7 @@ EIP-2930 access list generated for the tx (see `reportAccessList` option) #### Defined in -[vm/src/types.ts:400](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L400) +[vm/src/types.ts:427](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L427) ___ @@ -56,7 +57,7 @@ The amount of ether used by this transaction #### Defined in -[vm/src/types.ts:378](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L378) +[vm/src/types.ts:405](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L405) ___ @@ -72,7 +73,7 @@ This is the blob gas units times the fee per blob gas for 4844 transactions #### Defined in -[vm/src/types.ts:410](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L410) +[vm/src/types.ts:442](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L442) ___ @@ -88,7 +89,7 @@ Bloom filter resulted from transaction #### Defined in -[vm/src/types.ts:373](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L373) +[vm/src/types.ts:400](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L400) ___ @@ -104,7 +105,7 @@ Address of created account during transaction, if any #### Defined in -evm/dist/cjs/types.d.ts:245 +evm/dist/cjs/types.d.ts:248 ___ @@ -120,7 +121,7 @@ Contains the results from running the code, if any, as described in runCode #### Defined in -evm/dist/cjs/types.d.ts:249 +evm/dist/cjs/types.d.ts:252 ___ @@ -136,7 +137,7 @@ The amount of gas as that was refunded during the transaction (i.e. `gasUsed = t #### Defined in -[vm/src/types.ts:395](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L395) +[vm/src/types.ts:422](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L422) ___ @@ -152,7 +153,23 @@ The value that accrues to the miner by this transaction #### Defined in -[vm/src/types.ts:405](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L405) +[vm/src/types.ts:437](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L437) + +___ + +### preimages + +â€ĸ `Optional` **preimages**: `Map`<`string`, `Uint8Array`\> + +Preimages mapping of the touched accounts from the tx (see `reportPreimages` option) + +#### Inherited from + +[RunTxResult](RunTxResult.md).[preimages](RunTxResult.md#preimages) + +#### Defined in + +[vm/src/types.ts:432](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L432) ___ @@ -168,7 +185,7 @@ The tx receipt #### Defined in -[vm/src/types.ts:383](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L383) +[vm/src/types.ts:410](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L410) ___ @@ -186,7 +203,7 @@ which consists of calldata cost, intrinsic cost and optionally the access list c #### Defined in -[vm/src/types.ts:390](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L390) +[vm/src/types.ts:417](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L417) ___ @@ -198,4 +215,4 @@ The transaction which just got finished #### Defined in -[vm/src/types.ts:417](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L417) +[vm/src/types.ts:449](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L449) diff --git a/packages/vm/docs/interfaces/ApplyBlockResult.md b/packages/vm/docs/interfaces/ApplyBlockResult.md new file mode 100644 index 000000000..5e31ef993 --- /dev/null +++ b/packages/vm/docs/interfaces/ApplyBlockResult.md @@ -0,0 +1,88 @@ +[@ethereumjs/vm](../README.md) / ApplyBlockResult + +# Interface: ApplyBlockResult + +Result of applyBlock + +## Table of contents + +### Properties + +- [bloom](ApplyBlockResult.md#bloom) +- [gasUsed](ApplyBlockResult.md#gasused) +- [preimages](ApplyBlockResult.md#preimages) +- [receipts](ApplyBlockResult.md#receipts) +- [receiptsRoot](ApplyBlockResult.md#receiptsroot) +- [results](ApplyBlockResult.md#results) + +## Properties + +### bloom + +â€ĸ **bloom**: `Bloom` + +The Bloom filter + +#### Defined in + +[vm/src/types.ts:292](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L292) + +___ + +### gasUsed + +â€ĸ **gasUsed**: `bigint` + +The gas used after executing the block + +#### Defined in + +[vm/src/types.ts:296](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L296) + +___ + +### preimages + +â€ĸ `Optional` **preimages**: `Map`<`string`, `Uint8Array`\> + +Preimages mapping of the touched accounts from the block (see reportPreimages option) + +#### Defined in + +[vm/src/types.ts:312](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L312) + +___ + +### receipts + +â€ĸ **receipts**: [`TxReceipt`](../README.md#txreceipt)[] + +Receipts generated for transactions in the block + +#### Defined in + +[vm/src/types.ts:304](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L304) + +___ + +### receiptsRoot + +â€ĸ **receiptsRoot**: `Uint8Array` + +The receipt root after executing the block + +#### Defined in + +[vm/src/types.ts:300](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L300) + +___ + +### results + +â€ĸ **results**: [`RunTxResult`](RunTxResult.md)[] + +Results of executing the transactions in the block + +#### Defined in + +[vm/src/types.ts:308](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L308) diff --git a/packages/vm/docs/interfaces/RunBlockOpts.md b/packages/vm/docs/interfaces/RunBlockOpts.md index bf4b9f679..0c8ac173b 100644 --- a/packages/vm/docs/interfaces/RunBlockOpts.md +++ b/packages/vm/docs/interfaces/RunBlockOpts.md @@ -11,6 +11,7 @@ Options for running a block. - [block](RunBlockOpts.md#block) - [clearCache](RunBlockOpts.md#clearcache) - [generate](RunBlockOpts.md#generate) +- [reportPreimages](RunBlockOpts.md#reportpreimages) - [root](RunBlockOpts.md#root) - [setHardfork](RunBlockOpts.md#sethardfork) - [skipBalance](RunBlockOpts.md#skipbalance) @@ -64,6 +65,19 @@ Defaults to `false`. ___ +### reportPreimages + +â€ĸ `Optional` **reportPreimages**: `boolean` + +If true, adds a hashedKey -> preimages mapping of all touched accounts +to the `RunTxResult` returned. + +#### Defined in + +[vm/src/types.ts:282](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L282) + +___ + ### root â€ĸ `Optional` **root**: `Uint8Array` diff --git a/packages/vm/docs/interfaces/RunBlockResult.md b/packages/vm/docs/interfaces/RunBlockResult.md index 718242b70..80896213e 100644 --- a/packages/vm/docs/interfaces/RunBlockResult.md +++ b/packages/vm/docs/interfaces/RunBlockResult.md @@ -6,9 +6,11 @@ Result of runBlock ## Hierarchy -- **`RunBlockResult`** +- `Omit`<[`ApplyBlockResult`](ApplyBlockResult.md), ``"bloom"``\> - â†ŗ [`AfterBlockEvent`](AfterBlockEvent.md) + â†ŗ **`RunBlockResult`** + + â†ŗâ†ŗ [`AfterBlockEvent`](AfterBlockEvent.md) ## Table of contents @@ -16,6 +18,7 @@ Result of runBlock - [gasUsed](RunBlockResult.md#gasused) - [logsBloom](RunBlockResult.md#logsbloom) +- [preimages](RunBlockResult.md#preimages) - [receipts](RunBlockResult.md#receipts) - [receiptsRoot](RunBlockResult.md#receiptsroot) - [results](RunBlockResult.md#results) @@ -29,9 +32,13 @@ Result of runBlock The gas used after executing the block +#### Inherited from + +Omit.gasUsed + #### Defined in -[vm/src/types.ts:298](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L298) +[vm/src/types.ts:296](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L296) ___ @@ -43,7 +50,23 @@ The bloom filter of the LOGs (events) after executing the block #### Defined in -[vm/src/types.ts:302](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L302) +[vm/src/types.ts:326](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L326) + +___ + +### preimages + +â€ĸ `Optional` **preimages**: `Map`<`string`, `Uint8Array`\> + +Preimages mapping of the touched accounts from the block (see reportPreimages option) + +#### Inherited from + +Omit.preimages + +#### Defined in + +[vm/src/types.ts:312](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L312) ___ @@ -53,9 +76,13 @@ ___ Receipts generated for transactions in the block +#### Inherited from + +Omit.receipts + #### Defined in -[vm/src/types.ts:286](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L286) +[vm/src/types.ts:304](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L304) ___ @@ -65,9 +92,13 @@ ___ The receipt root after executing the block +#### Inherited from + +Omit.receiptsRoot + #### Defined in -[vm/src/types.ts:306](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L306) +[vm/src/types.ts:300](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L300) ___ @@ -77,9 +108,13 @@ ___ Results of executing the transactions in the block +#### Inherited from + +Omit.results + #### Defined in -[vm/src/types.ts:290](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L290) +[vm/src/types.ts:308](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L308) ___ @@ -91,4 +126,4 @@ The stateRoot after executing the block #### Defined in -[vm/src/types.ts:294](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L294) +[vm/src/types.ts:322](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L322) diff --git a/packages/vm/docs/interfaces/RunTxOpts.md b/packages/vm/docs/interfaces/RunTxOpts.md index ce4ec7e7a..9c9f4b3ed 100644 --- a/packages/vm/docs/interfaces/RunTxOpts.md +++ b/packages/vm/docs/interfaces/RunTxOpts.md @@ -11,6 +11,7 @@ Options for the `runTx` method. - [block](RunTxOpts.md#block) - [blockGasUsed](RunTxOpts.md#blockgasused) - [reportAccessList](RunTxOpts.md#reportaccesslist) +- [reportPreimages](RunTxOpts.md#reportpreimages) - [skipBalance](RunTxOpts.md#skipbalance) - [skipBlockGasLimitValidation](RunTxOpts.md#skipblockgaslimitvalidation) - [skipHardForkValidation](RunTxOpts.md#skiphardforkvalidation) @@ -28,7 +29,7 @@ If omitted, a default blank block will be used. #### Defined in -[vm/src/types.ts:322](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L322) +[vm/src/types.ts:342](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L342) ___ @@ -40,7 +41,7 @@ To obtain an accurate tx receipt input the block gas used up until this tx. #### Defined in -[vm/src/types.ts:363](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L363) +[vm/src/types.ts:390](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L390) ___ @@ -59,7 +60,20 @@ StateManager.generateAccessList must be implemented. #### Defined in -[vm/src/types.ts:358](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L358) +[vm/src/types.ts:379](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L379) + +___ + +### reportPreimages + +â€ĸ `Optional` **reportPreimages**: `boolean` + +If true, adds a hashedKey -> preimages mapping of all touched accounts +to the `RunTxResult` returned. + +#### Defined in + +[vm/src/types.ts:385](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L385) ___ @@ -71,7 +85,7 @@ Skip balance checks if true. Adds transaction cost to balance to ensure executio #### Defined in -[vm/src/types.ts:334](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L334) +[vm/src/types.ts:355](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L355) ___ @@ -84,7 +98,7 @@ against the block's gas limit. #### Defined in -[vm/src/types.ts:340](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L340) +[vm/src/types.ts:361](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L361) ___ @@ -97,7 +111,7 @@ and tx #### Defined in -[vm/src/types.ts:346](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L346) +[vm/src/types.ts:367](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L367) ___ @@ -109,7 +123,7 @@ If true, skips the nonce check #### Defined in -[vm/src/types.ts:330](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L330) +[vm/src/types.ts:350](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L350) ___ @@ -121,4 +135,4 @@ An `@ethereumjs/tx` to run #### Defined in -[vm/src/types.ts:326](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L326) +[vm/src/types.ts:346](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L346) diff --git a/packages/vm/docs/interfaces/RunTxResult.md b/packages/vm/docs/interfaces/RunTxResult.md index 03ae20a10..aa6bdc146 100644 --- a/packages/vm/docs/interfaces/RunTxResult.md +++ b/packages/vm/docs/interfaces/RunTxResult.md @@ -24,6 +24,7 @@ Execution result of a transaction - [execResult](RunTxResult.md#execresult) - [gasRefund](RunTxResult.md#gasrefund) - [minerValue](RunTxResult.md#minervalue) +- [preimages](RunTxResult.md#preimages) - [receipt](RunTxResult.md#receipt) - [totalGasSpent](RunTxResult.md#totalgasspent) @@ -37,7 +38,7 @@ EIP-2930 access list generated for the tx (see `reportAccessList` option) #### Defined in -[vm/src/types.ts:400](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L400) +[vm/src/types.ts:427](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L427) ___ @@ -49,7 +50,7 @@ The amount of ether used by this transaction #### Defined in -[vm/src/types.ts:378](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L378) +[vm/src/types.ts:405](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L405) ___ @@ -61,7 +62,7 @@ This is the blob gas units times the fee per blob gas for 4844 transactions #### Defined in -[vm/src/types.ts:410](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L410) +[vm/src/types.ts:442](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L442) ___ @@ -73,7 +74,7 @@ Bloom filter resulted from transaction #### Defined in -[vm/src/types.ts:373](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L373) +[vm/src/types.ts:400](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L400) ___ @@ -89,7 +90,7 @@ EVMResult.createdAddress #### Defined in -evm/dist/cjs/types.d.ts:245 +evm/dist/cjs/types.d.ts:248 ___ @@ -105,7 +106,7 @@ EVMResult.execResult #### Defined in -evm/dist/cjs/types.d.ts:249 +evm/dist/cjs/types.d.ts:252 ___ @@ -117,7 +118,7 @@ The amount of gas as that was refunded during the transaction (i.e. `gasUsed = t #### Defined in -[vm/src/types.ts:395](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L395) +[vm/src/types.ts:422](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L422) ___ @@ -129,7 +130,19 @@ The value that accrues to the miner by this transaction #### Defined in -[vm/src/types.ts:405](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L405) +[vm/src/types.ts:437](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L437) + +___ + +### preimages + +â€ĸ `Optional` **preimages**: `Map`<`string`, `Uint8Array`\> + +Preimages mapping of the touched accounts from the tx (see `reportPreimages` option) + +#### Defined in + +[vm/src/types.ts:432](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L432) ___ @@ -141,7 +154,7 @@ The tx receipt #### Defined in -[vm/src/types.ts:383](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L383) +[vm/src/types.ts:410](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L410) ___ @@ -155,4 +168,4 @@ which consists of calldata cost, intrinsic cost and optionally the access list c #### Defined in -[vm/src/types.ts:390](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L390) +[vm/src/types.ts:417](https://github.com/ethereumjs/ethereumjs-monorepo/blob/master/packages/vm/src/types.ts#L417) diff --git a/packages/vm/package.json b/packages/vm/package.json index 63a63201d..29322c186 100644 --- a/packages/vm/package.json +++ b/packages/vm/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/vm", - "version": "7.2.1", + "version": "8.0.0", "description": "An Ethereum VM implementation", "keywords": [ "ethereum", @@ -50,7 +50,7 @@ "profiling": "0x ./benchmarks/run.js profiling", "test": "echo \"[INFO] Generic test cmd not used. See package.json for more specific test run cmds.\"", "test:API": "npx vitest run ./test/api/", - "test:browser": "npx vitest run ./test/api/**/*.spec.ts --browser.name=webkit --browser.provider=playwright --browser.headless", + "test:browser": "npx vitest run --config=./vitest.browser.config.mts", "test:blockchain": "npm run tester -- --blockchain", "test:blockchain:allForks": "echo 'Chainstart Homestead dao TangerineWhistle SpuriousDragon Byzantium Constantinople Petersburg Istanbul MuirGlacier Berlin London ByzantiumToConstantinopleFixAt5 EIP158ToByzantiumAt5 FrontierToHomesteadAt5 HomesteadToDaoAt5 HomesteadToEIP150At5 BerlinToLondonAt5' | xargs -n1 | xargs -I v1 npm run tester -- --blockchain --fork=v1 --verify-test-amount-alltests", "test:blockchain:transitionForks": "echo 'ByzantiumToConstantinopleFixAt5 EIP158ToByzantiumAt5 FrontierToHomesteadAt5 HomesteadToDaoAt5 HomesteadToEIP150At5 BerlinToLondonAt5' | xargs -n1 | xargs -I v1 npm run tester -- --blockchain --fork=v1 --verify-test-amount-alltests", @@ -63,18 +63,18 @@ "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/block": "^5.1.1", - "@ethereumjs/blockchain": "^7.1.0", - "@ethereumjs/common": "^4.2.0", - "@ethereumjs/evm": "^2.2.1", + "@ethereumjs/block": "^5.2.0", + "@ethereumjs/blockchain": "^7.2.0", + "@ethereumjs/common": "^4.3.0", + "@ethereumjs/evm": "^3.0.0", "@ethereumjs/rlp": "^5.0.2", - "@ethereumjs/statemanager": "^2.2.2", - "@ethereumjs/trie": "^6.1.1", - "@ethereumjs/tx": "^5.2.1", - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/statemanager": "^2.3.0", + "@ethereumjs/trie": "^6.2.0", + "@ethereumjs/tx": "^5.3.0", + "@ethereumjs/util": "^9.0.3", "debug": "^4.3.3", "ethereum-cryptography": "^2.1.3", - "rustbn-wasm": "^0.4.0" + "mcl-wasm": "^1.4.0" }, "devDependencies": { "@ethersproject/abi": "^5.0.12", diff --git a/packages/vm/src/runBlock.ts b/packages/vm/src/runBlock.ts index 9415cf475..1bbfde963 100644 --- a/packages/vm/src/runBlock.ts +++ b/packages/vm/src/runBlock.ts @@ -1,7 +1,7 @@ import { Block } from '@ethereumjs/block' import { ConsensusType, Hardfork } from '@ethereumjs/common' import { RLP } from '@ethereumjs/rlp' -import { StatelessVerkleStateManager } from '@ethereumjs/statemanager' +import { StatelessVerkleStateManager, getTreeIndexesForStorageSlot } from '@ethereumjs/statemanager' import { Trie } from '@ethereumjs/trie' import { TransactionType } from '@ethereumjs/tx' import { @@ -132,7 +132,12 @@ export async function runBlock(this: VM, opts: RunBlockOpts): Promise { } stateAccesses = (this.stateManager as StatelessVerkleStateManager).accessWitness } - let txAccesses = stateAccesses?.shallowCopy() + const txAccesses = stateAccesses?.shallowCopy() const { tx, block } = opts @@ -325,29 +323,8 @@ async function _runTx(this: VM, opts: RunTxOpts): Promise { throw new Error(msg) } - let upfrontAwGas = BIGINT_0 - if (this.common.isActivatedEIP(6800)) { - upfrontAwGas += txAccesses!.touchTxOriginAndComputeGas(caller) - const sendsValue = tx.value !== BIGINT_0 - if (tx.to !== undefined) { - upfrontAwGas += txAccesses!.touchTxExistingAndComputeGas(tx.to, { sendsValue }) - debug(`Sender upfront awGas requirement for non contract creation tx is ${upfrontAwGas}`) - } else { - const contractTo = new Address(generateAddress(caller.bytes, bigIntToBytes(nonce))) - upfrontAwGas += txAccesses!.touchAndChargeContractCreateInit(contractTo, { sendsValue }) - debug( - `Sender upfront awGas requirement is contract creation at=${short( - contractTo.bytes - )} is ${upfrontAwGas}` - ) - } - - // reset txAccesses to remove the caches so that access gas can be correctly consumed inside the evm run - txAccesses = stateAccesses?.shallowCopy() - } - // Check balance against upfront tx cost - const upFrontCost = tx.getUpfrontCost(block.header.baseFeePerGas) + upfrontAwGas + const upFrontCost = tx.getUpfrontCost(block.header.baseFeePerGas) if (balance < upFrontCost) { if (opts.skipBalance === true && fromAccount.balance < upFrontCost) { if (tx.supports(Capability.EIP1559FeeMarket) === false) { @@ -613,7 +590,7 @@ async function _runTx(this: VM, opts: RunTxOpts): Promise { if (this.common.isActivatedEIP(6800)) { // use this utility to build access but the computed gas is not charged and hence free - ;(state as StatelessVerkleStateManager).accessWitness!.touchTxExistingAndComputeGas(miner, { + ;(state as StatelessVerkleStateManager).accessWitness!.touchTxTargetAndComputeGas(miner, { sendsValue: true, }) } @@ -663,14 +640,12 @@ async function _runTx(this: VM, opts: RunTxOpts): Promise { // Convert the Map to the desired type const accessList: AccessList = [] for (const [address, set] of this.evm.journal.accessList!) { - const addressPrefixed = '0x' + address const item: AccessListItem = { - address: addressPrefixed, + address: `0x${address}`, storageKeys: [], } for (const slot of set) { - const slotPrefixed = '0x' + slot - item.storageKeys.push(slotPrefixed) + item.storageKeys.push(`0x${slot}`) } accessList.push(item) } diff --git a/packages/vm/src/types.ts b/packages/vm/src/types.ts index cc8dcb244..85dec8ab4 100644 --- a/packages/vm/src/types.ts +++ b/packages/vm/src/types.ts @@ -94,7 +94,7 @@ export interface VMOpts { * * - `chain`: all chains supported by `Common` or a custom chain * - `hardfork`: `mainnet` hardforks up to the `Paris` hardfork - * - `eips`: `1559` (usage e.g. `eips: [ 1559, ]`) + * - `eips`: `2537` (usage e.g. `eips: [ 2537, ]`) * * Note: check the associated `@ethereumjs/evm` instance options * documentation for supported EIPs. @@ -153,8 +153,6 @@ export interface VMOpts { evm?: EVMInterface profilerOpts?: VMProfilerOpts - - bn128?: any } /** diff --git a/packages/vm/src/vm.ts b/packages/vm/src/vm.ts index c60a2a5b8..0d8e9b17e 100644 --- a/packages/vm/src/vm.ts +++ b/packages/vm/src/vm.ts @@ -3,7 +3,6 @@ import { Chain, Common } from '@ethereumjs/common' import { EVM, getActivePrecompiles } from '@ethereumjs/evm' import { DefaultStateManager } from '@ethereumjs/statemanager' import { Account, Address, AsyncEventEmitter, unprefixedHexToBytes } from '@ethereumjs/util' -import { initRustBN } from 'rustbn-wasm' import { buildBlock } from './buildBlock.js' import { runBlock } from './runBlock.js' @@ -23,7 +22,7 @@ import type { BlockchainInterface } from '@ethereumjs/blockchain' import type { EVMStateManagerInterface } from '@ethereumjs/common' import type { EVMInterface } from '@ethereumjs/evm' import type { EVMPerformanceLogOutput } from '@ethereumjs/evm/dist/cjs/logger.js' -import type { BigIntLike, GenesisState } from '@ethereumjs/util' +import type { BigIntLike } from '@ethereumjs/util' /** * Execution engine which can be used to run a blockchain, individual @@ -78,47 +77,29 @@ export class VM { * @param opts VM engine constructor options */ static async create(opts: VMOpts = {}): Promise { - if (opts.bn128 === undefined) opts.bn128 = await initRustBN() - const vm = new this(opts) - - const genesisStateOpts = - opts.stateManager === undefined && opts.genesisState === undefined - ? { genesisState: {} } - : undefined - await vm.init({ ...genesisStateOpts, ...opts }) - return vm - } + // Save if a `StateManager` was passed (for activatePrecompiles) + const didPassStateManager = opts.stateManager !== undefined - /** - * Instantiates a new {@link VM} Object. - * - * @deprecated The direct usage of this constructor is discouraged since - * non-finalized async initialization might lead to side effects. Please - * use the async {@link VM.create} constructor instead (same API). - * @param opts - */ - protected constructor(opts: VMOpts = {}) { - this.events = new AsyncEventEmitter() - - this._opts = opts + // Add common, SM, blockchain, EVM here + if (opts.common === undefined) { + opts.common = new Common({ chain: Chain.Mainnet }) + } - if (opts.common) { - this.common = opts.common - } else { - const DEFAULT_CHAIN = Chain.Mainnet - this.common = new Common({ chain: DEFAULT_CHAIN }) + if (opts.stateManager === undefined) { + opts.stateManager = new DefaultStateManager({ common: opts.common }) } - if (opts.stateManager) { - this.stateManager = opts.stateManager - } else { - this.stateManager = new DefaultStateManager({ common: this.common }) + if (opts.blockchain === undefined) { + opts.blockchain = await Blockchain.create({ common: opts.common }) } - this.blockchain = opts.blockchain ?? new (Blockchain as any)({ common: this.common }) + const genesisState = opts.genesisState ?? {} + if (opts.genesisState !== undefined) { + await opts.stateManager.generateCanonicalGenesis(genesisState) + } - if (this._opts.profilerOpts !== undefined) { - const profilerOpts = this._opts.profilerOpts + if (opts.profilerOpts !== undefined) { + const profilerOpts = opts.profilerOpts if (profilerOpts.reportAfterBlock === true && profilerOpts.reportAfterTx === true) { throw new Error( 'Cannot have `reportProfilerAfterBlock` and `reportProfilerAfterTx` set to `true` at the same time' @@ -126,59 +107,30 @@ export class VM { } } - // TODO tests - if (opts.evm) { - this.evm = opts.evm - } else { + if (opts.evm === undefined) { let enableProfiler = false if ( - this._opts.profilerOpts?.reportAfterBlock === true || - this._opts.profilerOpts?.reportAfterTx === true + opts.profilerOpts?.reportAfterBlock === true || + opts.profilerOpts?.reportAfterTx === true ) { enableProfiler = true } - this.evm = new EVM({ - common: this.common, - stateManager: this.stateManager, - blockchain: this.blockchain, + opts.evm = await EVM.create({ + common: opts.common, + stateManager: opts.stateManager, + blockchain: opts.blockchain, profiler: { enabled: enableProfiler, }, - bn128: opts.bn128, }) } - this._setHardfork = opts.setHardfork ?? false - - this._emit = async (topic: string, data: any): Promise => { - return new Promise((resolve) => this.events.emit(topic as keyof VMEvents, data, resolve)) - } - - // Skip DEBUG calls unless 'ethjs' included in environmental DEBUG variables - // Additional window check is to prevent vite browser bundling (and potentially other) to break - this.DEBUG = - typeof window === 'undefined' ? process?.env?.DEBUG?.includes('ethjs') ?? false : false - } - - async init({ genesisState }: { genesisState?: GenesisState } = {}): Promise { - if (this._isInitialized) return - - if (genesisState !== undefined) { - await this.stateManager.generateCanonicalGenesis(genesisState) - } else if (this._opts.stateManager === undefined) { - throw Error('genesisState state required to set genesis for stateManager') - } - - if (typeof (this.blockchain)._init === 'function') { - await (this.blockchain as any)._init({ genesisState }) - } - - if (this._opts.activatePrecompiles === true && typeof this._opts.stateManager === 'undefined') { - await this.evm.journal.checkpoint() + if (opts.activatePrecompiles === true && !didPassStateManager) { + await opts.evm.journal.checkpoint() // put 1 wei in each of the precompiles in order to make the accounts non-empty and thus not have them deduct `callNewAccount` gas. - for (const [addressStr] of getActivePrecompiles(this.common)) { + for (const [addressStr] of getActivePrecompiles(opts.common)) { const address = new Address(unprefixedHexToBytes(addressStr)) - let account = await this.stateManager.getAccount(address) + let account = await opts.evm.stateManager.getAccount(address) // Only do this if it is not overridden in genesis // Note: in the case that custom genesis has storage fields, this is preserved if (account === undefined) { @@ -187,12 +139,43 @@ export class VM { balance: 1, storageRoot: account.storageRoot, }) - await this.stateManager.putAccount(address, newAccount) + await opts.evm.stateManager.putAccount(address, newAccount) } } - await this.evm.journal.commit() + await opts.evm.journal.commit() } - this._isInitialized = true + + return new VM(opts) + } + + /** + * Instantiates a new {@link VM} Object. + * + * @deprecated The direct usage of this constructor is discouraged since + * non-finalized async initialization might lead to side effects. Please + * use the async {@link VM.create} constructor instead (same API). + * @param opts + */ + protected constructor(opts: VMOpts = {}) { + this.common = opts.common! + this.stateManager = opts.stateManager! + this.blockchain = opts.blockchain! + this.evm = opts.evm! + + this.events = new AsyncEventEmitter() + + this._opts = opts + + this._setHardfork = opts.setHardfork ?? false + + this._emit = async (topic: string, data: any): Promise => { + return new Promise((resolve) => this.events.emit(topic as keyof VMEvents, data, resolve)) + } + + // Skip DEBUG calls unless 'ethjs' included in environmental DEBUG variables + // Additional window check is to prevent vite browser bundling (and potentially other) to break + this.DEBUG = + typeof window === 'undefined' ? process?.env?.DEBUG?.includes('ethjs') ?? false : false } /** @@ -308,7 +291,7 @@ export class VM { // Order of columns to report (see `EVMPerformanceLogOutput` type) - const colOrder = [ + const colOrder: (keyof EVMPerformanceLogOutput)[] = [ 'tag', 'calls', 'avgTimePerCall', @@ -352,11 +335,9 @@ export class VM { let ins = 0 colLength[ins] = Math.max(colLength[ins] ?? 0, strLen(colNames[ins])) for (const key of colOrder) { - // @ts-ignore if (entry[key] !== undefined) { // If entry is available, max out the current column length (this will be the longest string of this column) - //@ts-ignore - colLength[ins] = Math.max(colLength[ins] ?? 0, strLen(entry[key])) + colLength[ins] = Math.max(colLength[ins] ?? 0, strLen(entry[key]!)) ins++ // In this switch statement update the total calls / time / gas used switch (key) { @@ -425,10 +406,8 @@ export class VM { let str = '' let i = 0 for (const key of colOrder) { - //@ts-ignore if (entry[key] !== undefined) { - //@ts-ignore - str += '|' + padStr(entry[key], colLength[i]) + str += '|' + padStr(entry[key]!, colLength[i]) i++ } } diff --git a/packages/vm/test/api/EIPs/eip-2935-historical-block-hashes.spec.ts b/packages/vm/test/api/EIPs/eip-2935-historical-block-hashes.spec.ts index 43cdcf284..b59369559 100644 --- a/packages/vm/test/api/EIPs/eip-2935-historical-block-hashes.spec.ts +++ b/packages/vm/test/api/EIPs/eip-2935-historical-block-hashes.spec.ts @@ -112,7 +112,11 @@ describe('EIP 2935: historical block hashes', () => { const blocksActivation = 256 // This ensures that block 0 - 255 all get stored into the hash contract // More than blocks activation to build, so we can ensure that we can also retrieve block 0 or block 1 hash at block 300 const blocksToBuild = 300 + const commonGetHistoryServeWindow = eip2935ActiveAtCommon(0) + commonGetHistoryServeWindow.setEIPs([2935]) const common = eip2935ActiveAtCommon(blocksActivation) + const historyServeWindow = commonGetHistoryServeWindow.param('vm', 'historyServeWindow') + const blockchain = await Blockchain.create({ common, validateBlocks: false, @@ -146,7 +150,7 @@ describe('EIP 2935: historical block hashes', () => { const block = await vm.blockchain.getBlock(i) const storage = await vm.stateManager.getContractStorage( historyAddress, - setLengthLeft(bigIntToBytes(BigInt(i)), 32) + setLengthLeft(bigIntToBytes(BigInt(i) % historyServeWindow), 32) ) const ret = await vm.evm.runCall({ // Code: RETURN the BLOCKHASH of block i @@ -155,11 +159,10 @@ describe('EIP 2935: historical block hashes', () => { data: hexToBytes('0x61' + i.toString(16).padStart(4, '0') + '4060205260406000F3'), block: parentBlock, }) - if (i <= blocksToBuild - 1) { + if (i <= blocksToBuild - 1 && i >= blocksToBuild - Number(historyServeWindow)) { assert.ok(equalsBytes(setLengthLeft(storage, 32), block.hash())) assert.ok(equalsBytes(ret.execResult.returnValue, setLengthLeft(block.hash(), 64))) } else { - assert.ok(equalsBytes(setLengthLeft(storage, 32), zeros(32))) assert.ok(equalsBytes(ret.execResult.returnValue, zeros(64))) } } diff --git a/packages/vm/test/api/EIPs/eip-3074-authcall.spec.ts b/packages/vm/test/api/EIPs/eip-3074-authcall.spec.ts index 7de392e57..3f9cff610 100644 --- a/packages/vm/test/api/EIPs/eip-3074-authcall.spec.ts +++ b/packages/vm/test/api/EIPs/eip-3074-authcall.spec.ts @@ -5,6 +5,8 @@ import { LegacyTransaction } from '@ethereumjs/tx' import { Account, Address, + BIGINT_0, + BIGINT_1, bigIntToBytes, bytesToBigInt, concatBytes, @@ -65,11 +67,23 @@ const STORECALLER = hexToBytes('0x5A60015533600055600035600255366000600037366000 * @param privateKey - The private key of the account to sign * @returns The signed message */ -function signMessage(commitUnpadded: Uint8Array, address: Address, privateKey: Uint8Array) { +function signMessage( + commitUnpadded: Uint8Array, + address: Address, + privateKey: Uint8Array, + nonce: bigint = BIGINT_0 +) { const commit = setLengthLeft(commitUnpadded, 32) const paddedInvokerAddress = setLengthLeft(address.bytes, 32) const chainId = setLengthLeft(bigIntToBytes(common.chainId()), 32) - const message = concatBytes(hexToBytes('0x03'), chainId, paddedInvokerAddress, commit) + const noncePadded = setLengthLeft(bigIntToBytes(nonce), 32) + const message = concatBytes( + hexToBytes('0x04'), + chainId, + noncePadded, + paddedInvokerAddress, + commit + ) const msgHash = keccak256(message) return ecsign(msgHash, privateKey) } @@ -90,20 +104,28 @@ function getAuthCode( const commit = setLengthLeft(commitUnpadded, 32) let v: Uint8Array if (signature.v === BigInt(27)) { - v = setLengthLeft(hexToBytes('0x00'), 32) + v = hexToBytes('0x00') } else if (signature.v === BigInt(28)) { - v = setLengthLeft(hexToBytes('0x01'), 32) + v = hexToBytes('0x01') } else { - v = setLengthLeft(toBytes(signature.v), 32) + v = toBytes(signature.v) + if (v.length > 1) { + throw new Error('v too long') + } + if (v.length === 0) { + v = hexToBytes('0x00') + } } const PUSH32 = hexToBytes('0x7F') + const PUSH1 = hexToBytes('0x60') const AUTH = hexToBytes('0xF6') const MSTORE = hexToBytes('0x52') + const MSTORE8 = hexToBytes('0x53') const mslot0 = zeros(32) - const mslot1 = concatBytes(zeros(31), hexToBytes('0x20')) - const mslot2 = concatBytes(zeros(31), hexToBytes('0x40')) - const mslot3 = concatBytes(zeros(31), hexToBytes('0x60')) + const mslot1 = concatBytes(zeros(31), hexToBytes('0x01')) + const mslot2 = concatBytes(zeros(31), hexToBytes('0x21')) + const mslot3 = concatBytes(zeros(31), hexToBytes('0x41')) const addressBuffer = setLengthLeft(address.bytes, 32) // This bytecode setups the stack to be used for AUTH return concatBytes( @@ -117,11 +139,11 @@ function getAuthCode( PUSH32, mslot1, MSTORE, - PUSH32, + PUSH1, v, PUSH32, mslot0, - MSTORE, + MSTORE8, PUSH32, commit, PUSH32, @@ -141,7 +163,6 @@ type AuthcallData = { gasLimit?: bigint address: Address value?: bigint - valueExt?: bigint argsOffset?: bigint argsLength?: bigint retOffset?: bigint @@ -172,7 +193,6 @@ function getAuthCallCode(data: AuthcallData) { const gasLimitBuffer = setLengthLeft(bigIntToBytes(data.gasLimit ?? BigInt(0)), 32) const addressBuffer = setLengthLeft(data.address.bytes, 32) const valueBuffer = setLengthLeft(bigIntToBytes(data.value ?? BigInt(0)), 32) - const valueExtBuffer = setLengthLeft(bigIntToBytes(data.valueExt ?? BigInt(0)), 32) const argsOffsetBuffer = setLengthLeft(bigIntToBytes(data.argsOffset ?? BigInt(0)), 32) const argsLengthBuffer = setLengthLeft(bigIntToBytes(data.argsLength ?? BigInt(0)), 32) const retOffsetBuffer = setLengthLeft(bigIntToBytes(data.retOffset ?? BigInt(0)), 32) @@ -184,7 +204,6 @@ function getAuthCallCode(data: AuthcallData) { retOffsetBuffer, argsLengthBuffer, argsOffsetBuffer, - valueExtBuffer, valueBuffer, addressBuffer, gasLimitBuffer, @@ -286,7 +305,7 @@ describe('EIP-3074 AUTH', () => { assert.deepEqual(buf, zeros(32), 'auth puts 0') }) - it('Should throw if signature s > N_DIV_2', async () => { + it('Should set AUTH to unauthorized if signature s > N_DIV_2', async () => { const vm = await VM.create({ common }) const message = hexToBytes('0x01') const signature = flipSignature(signMessage(message, contractAddress, privateKey)) @@ -305,18 +324,40 @@ describe('EIP-3074 AUTH', () => { await vm.stateManager.putAccount(callerAddress, account!) const result = await vm.runTx({ tx, block, skipHardForkValidation: true }) - assert.equal( - result.execResult.exceptionError?.error, - EVMErrorMessage.AUTH_INVALID_S, - 'threw correct error' - ) + const buf = result.execResult.returnValue + assert.deepEqual(buf, zeros(32), 'auth puts 0') + }) + + it('Should set AUTH to unautorized if signatature y > 1', async () => { + const vm = await VM.create({ common }) + const message = hexToBytes('0x01') + const signature = flipSignature(signMessage(message, contractAddress, privateKey)) + signature.v = 2 + const code = concatBytes(getAuthCode(message, signature, authAddress), RETURNTOP) + + await vm.stateManager.putContractCode(contractAddress, code) + const tx = LegacyTransaction.fromTxData({ + to: contractAddress, + gasLimit: 1000000, + gasPrice: 10, + }).sign(callerPrivateKey) + + await vm.stateManager.putAccount(callerAddress, new Account()) + const account = await vm.stateManager.getAccount(callerAddress) + account!.balance = BigInt(10000000) + await vm.stateManager.putAccount(callerAddress, account!) + + const result = await vm.runTx({ tx, block, skipHardForkValidation: true }) + const buf = result.execResult.returnValue + assert.deepEqual(buf, zeros(32), 'auth puts 0') }) it('Should be able to call AUTH multiple times', async () => { const vm = await VM.create({ common }) const message = hexToBytes('0x01') const signature = signMessage(message, contractAddress, privateKey) - const signature2 = signMessage(message, contractAddress, callerPrivateKey) + // This test also tests that the nonce is being read from the account + const signature2 = signMessage(message, contractAddress, callerPrivateKey, BIGINT_1) const code = concatBytes( getAuthCode(message, signature, authAddress), getAuthCode(message, signature2, callerAddress), @@ -551,6 +592,8 @@ describe('EIP-3074 AUTHCALL', () => { RETURNTOP ) const vm = await setupVM(code) + const account = new Account(BIGINT_0, BIGINT_1) + await vm.stateManager.putAccount(authAddress, account) let gas: bigint let gasAfterCall: bigint @@ -594,6 +637,8 @@ describe('EIP-3074 AUTHCALL', () => { RETURNTOP ) const vm = await setupVM(code) + const authAccount = new Account(BIGINT_0, BIGINT_1) + await vm.stateManager.putAccount(authAddress, authAccount) let gas: bigint vm.evm.events!.on('step', (e: InterpreterStep) => { @@ -636,7 +681,35 @@ describe('EIP-3074 AUTHCALL', () => { assert.equal(contractAccount!.balance, 2n, 'contract balance ok') const contractStorageAccount = await vm.stateManager.getAccount(contractStorageAddress) - assert.equal(contractStorageAccount!.balance, 1n, 'storage balance ok') + assert.equal(contractStorageAccount!.balance, 2n, 'storage balance ok') + }) + + it('Should throw if authorized account does not have enough balance', async () => { + const message = hexToBytes('0x01') + const signature = signMessage(message, contractAddress, privateKey) + const code = concatBytes( + getAuthCode(message, signature, authAddress), + getAuthCallCode({ + address: contractStorageAddress, + value: 1n, + }), + RETURNTOP + ) + const vm = await setupVM(code) + + const value = 3n + const gasPrice = 10n + + const tx = LegacyTransaction.fromTxData({ + to: contractAddress, + gasLimit: PREBALANCE / gasPrice - value * gasPrice, + gasPrice, + value, + }).sign(callerPrivateKey) + + const result = await vm.runTx({ tx, block, skipHardForkValidation: true }) + + assert.ok(result.execResult.exceptionError?.error === EVMErrorMessage.OUT_OF_GAS) }) it('Should throw if AUTH not set', async () => { @@ -727,34 +800,6 @@ describe('EIP-3074 AUTHCALL', () => { ) }) - it('Should throw if valueExt is nonzero', async () => { - const message = hexToBytes('0x01') - const signature = signMessage(message, contractAddress, privateKey) - const code = concatBytes( - getAuthCode(message, signature, authAddress), - getAuthCallCode({ - address: contractStorageAddress, - valueExt: 1n, - }), - RETURNTOP - ) - const vm = await setupVM(code) - - const tx = LegacyTransaction.fromTxData({ - to: contractAddress, - gasLimit: 1000000, - gasPrice: 10, - }).sign(callerPrivateKey) - - const result = await vm.runTx({ tx, block, skipHardForkValidation: true }) - assert.equal(result.amountSpent, tx.gasLimit * tx.gasPrice, 'spent all gas') - assert.equal( - result.execResult.exceptionError?.error, - EVMErrorMessage.AUTHCALL_NONZERO_VALUEEXT, - 'correct error type' - ) - }) - it('Should forward the right amount of gas', async () => { const message = hexToBytes('0x01') const signature = signMessage(message, contractAddress, privateKey) diff --git a/packages/vm/test/api/EIPs/eip-4844-blobs.spec.ts b/packages/vm/test/api/EIPs/eip-4844-blobs.spec.ts index bac39aa40..930fb191f 100644 --- a/packages/vm/test/api/EIPs/eip-4844-blobs.spec.ts +++ b/packages/vm/test/api/EIPs/eip-4844-blobs.spec.ts @@ -10,11 +10,10 @@ import { commitmentsToVersionedHashes, getBlobs, hexToBytes, - initKZG, privateToAddress, zeros, } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import * as genesisJSON from '../../../../client/test/testdata/geth-genesis/eip4844.json' @@ -26,16 +25,8 @@ const sender = bytesToHex(privateToAddress(pk)) describe('EIP4844 tests', () => { it('should build a block correctly with blobs', async () => { - let kzg - { - try { - //initKZG(kzg, __dirname + '/../../client/src/trustedSetups/official.txt') - kzg = await createKZG() - initKZG(kzg) - } catch { - // no-op - } - } + const kzg = await loadKZG() + const common = Common.fromGethGenesis(genesisJSON, { chain: 'eip4844', hardfork: Hardfork.Cancun, @@ -71,9 +62,9 @@ describe('EIP4844 tests', () => { // Set up tx const blobs = getBlobs('hello world') - const commitments = blobsToCommitments(blobs) + const commitments = blobsToCommitments(kzg, blobs) const blobVersionedHashes = commitmentsToVersionedHashes(commitments) - const proofs = blobsToProofs(blobs, commitments) + const proofs = blobsToProofs(kzg, blobs, commitments) const unsignedTx = BlobEIP4844Transaction.fromTxData( { blobVersionedHashes, diff --git a/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts b/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts index 90bedaf37..de9722e3f 100644 --- a/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts +++ b/packages/vm/test/api/EIPs/eip-6800-verkle.spec.ts @@ -2,25 +2,30 @@ import { Block } from '@ethereumjs/block' import { Common, Hardfork } from '@ethereumjs/common' import { EVM } from '@ethereumjs/evm' import { StatelessVerkleStateManager } from '@ethereumjs/statemanager' +import { TransactionFactory } from '@ethereumjs/tx' +import { hexToBytes } from '@ethereumjs/util' import { describe, it } from 'vitest' import * as verkleBlockJSON from '../../../../statemanager/test/testdata/verkleKaustinenBlock.json' import { VM } from '../../../src' const customChainParams = { name: 'custom', chainId: 69420, networkId: 678 } -const common = Common.custom(customChainParams, { hardfork: Hardfork.Cancun, eips: [6800] }) -const block = Block.fromBlockData(verkleBlockJSON, { common }) +const common = Common.custom(customChainParams, { hardfork: Hardfork.Cancun, eips: [4895, 6800] }) +const decodedTxs = verkleBlockJSON.transactions.map((tx) => + TransactionFactory.fromSerializedData(hexToBytes(tx)) +) +const block = Block.fromBlockData({ ...verkleBlockJSON, transactions: decodedTxs }, { common }) describe('EIP 6800 tests', () => { it('successfully run transactions statelessly using the block witness', async () => { - const verkleStateManager = new StatelessVerkleStateManager({ common }) + const verkleStateManager = await StatelessVerkleStateManager.create({ common }) const evm = await EVM.create({ common, stateManager: verkleStateManager }) const vm = await VM.create({ common, evm, stateManager: verkleStateManager, }) - verkleStateManager.initVerkleExecutionWitness(block.executionWitness) + verkleStateManager.initVerkleExecutionWitness(block.header.number, block.executionWitness) //await vm.runBlock({ block }) diff --git a/packages/vm/test/api/index.spec.ts b/packages/vm/test/api/index.spec.ts index fe48682ea..9d47ea764 100644 --- a/packages/vm/test/api/index.spec.ts +++ b/packages/vm/test/api/index.spec.ts @@ -118,7 +118,7 @@ describe('VM -> common (chain, HFs, EIPs)', () => { const isBrowser = new Function('try {return this===window;}catch(e){ return false;}') if (isBrowser() === false) { - const common = new Common({ chain: Chain.Mainnet }) + const common = new Common({ chain: Chain.Mainnet, eips: [2537] }) try { await VM.create({ common }) assert.ok(true, 'did not throw') diff --git a/packages/vm/test/api/runBlock.spec.ts b/packages/vm/test/api/runBlock.spec.ts index 5988f3d87..5202707d0 100644 --- a/packages/vm/test/api/runBlock.spec.ts +++ b/packages/vm/test/api/runBlock.spec.ts @@ -13,6 +13,7 @@ import { assert, describe, it } from 'vitest' import { VM } from '../../src/vm' import { getDAOCommon, setupPreConditions } from '../util' +import * as testData from './testdata/blockchain.json' import * as testnet from './testdata/testnet.json' import { createAccount, setBalance, setupVM } from './utils' @@ -22,9 +23,9 @@ import type { PreByzantiumTxReceipt, RunBlockOpts, } from '../../src/types' +import type { DefaultStateManager } from '@ethereumjs/statemanager' import type { TypedTransaction } from '@ethereumjs/tx' -const testData = require('./testdata/blockchain.json') const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.Berlin }) describe('runBlock() -> successful API parameter usage', async () => { async function simpleRun(vm: VM) { @@ -35,20 +36,17 @@ describe('runBlock() -> successful API parameter usage', async () => { const blockRlp = toBytes(testData.blocks[0].rlp) const block = Block.fromRLPSerializedBlock(blockRlp, { common }) - //@ts-ignore await setupPreConditions(vm.stateManager, testData) assert.deepEqual( - //@ts-ignore - vm.stateManager._trie.root(), + (vm.stateManager as DefaultStateManager)['_trie'].root(), genesis.header.stateRoot, 'genesis state root should match calculated state root' ) const res = await vm.runBlock({ block, - // @ts-ignore - root: vm.stateManager._trie.root(), + root: (vm.stateManager as DefaultStateManager)['_trie'].root(), skipBlockValidation: true, skipHardForkValidation: true, }) @@ -61,9 +59,8 @@ describe('runBlock() -> successful API parameter usage', async () => { } async function uncleRun(vm: VM) { - const testData = require('./testdata/uncleData.json') + const testData = await import('./testdata/uncleData.json') - //@ts-ignore await setupPreConditions(vm.stateManager, testData) const common = new Common({ chain: Chain.Mainnet, hardfork: Hardfork.London }) @@ -71,8 +68,7 @@ describe('runBlock() -> successful API parameter usage', async () => { const block1 = Block.fromRLPSerializedBlock(block1Rlp, { common }) await vm.runBlock({ block: block1, - // @ts-ignore - root: vm.stateManager._trie.root(), + root: (vm.stateManager as DefaultStateManager)['_trie'].root(), skipBlockValidation: true, skipHardForkValidation: true, }) @@ -81,8 +77,8 @@ describe('runBlock() -> successful API parameter usage', async () => { const block2 = Block.fromRLPSerializedBlock(block2Rlp, { common }) await vm.runBlock({ block: block2, - // @ts-ignore - root: vm.stateManager._trie.root(), + + root: (vm.stateManager as DefaultStateManager)['_trie'].root(), skipBlockValidation: true, skipHardForkValidation: true, }) @@ -91,8 +87,8 @@ describe('runBlock() -> successful API parameter usage', async () => { const block3 = Block.fromRLPSerializedBlock(block3Rlp, { common }) await vm.runBlock({ block: block3, - // @ts-ignore - root: vm.stateManager._trie.root(), + + root: (vm.stateManager as DefaultStateManager)['_trie'].root(), skipBlockValidation: true, skipHardForkValidation: true, }) @@ -215,7 +211,6 @@ describe('runBlock() -> API parameter usage/data errors', async () => { const block = Block.fromBlockData({ header: { - ...testData.blocks[0].header, gasLimit: hexToBytes('0x8000000000000000'), }, }) @@ -291,7 +286,7 @@ describe('runBlock() -> runtime behavior', async () => { // edit extra data of this block to "dao-hard-fork" block1[0][12] = utf8ToBytes('dao-hard-fork') const block = Block.fromValuesArray(block1, { common }) - // @ts-ignore + await setupPreConditions(vm.stateManager, testData) // fill two original DAO child-contracts with funds and the recovery account with funds in order to verify that the balance gets summed correctly @@ -428,7 +423,6 @@ async function runWithHf(hardfork: string) { const blockRlp = toBytes(testData.blocks[0].rlp) const block = Block.fromRLPSerializedBlock(blockRlp, { common }) - // @ts-ignore await setupPreConditions(vm.stateManager, testData) const res = await vm.runBlock({ @@ -465,15 +459,14 @@ describe('runBlock() -> tx types', async () => { const blockRlp = toBytes(testData.blocks[0].rlp) const block = Block.fromRLPSerializedBlock(blockRlp, { common, freeze: false }) - //@ts-ignore overwrite transactions + //@e transactions block.transactions = transactions if (transactions.some((t) => t.supports(Capability.EIP1559FeeMarket))) { - // @ts-ignore overwrite read-only property + // @e read-only property block.header.baseFeePerGas = BigInt(7) } - //@ts-ignore await setupPreConditions(vm.stateManager, testData) const res = await vm.runBlock({ diff --git a/packages/vm/test/api/runTx.spec.ts b/packages/vm/test/api/runTx.spec.ts index 2b664cef1..0aba1b32a 100644 --- a/packages/vm/test/api/runTx.spec.ts +++ b/packages/vm/test/api/runTx.spec.ts @@ -16,10 +16,9 @@ import { bytesToHex, equalsBytes, hexToBytes, - initKZG, zeros, } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import { assert, describe, it } from 'vitest' import { VM } from '../../src/vm' @@ -880,10 +879,9 @@ it('Validate SELFDESTRUCT does not charge new account gas when calling CALLER an describe('EIP 4844 transaction tests', () => { it('should work', async () => { - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() - const genesisJson = require('../../../block/test/testdata/4844-hardfork.json') + const genesisJson = await import('../../../block/test/testdata/4844-hardfork.json') const common = Common.fromGethGenesis(genesisJson, { chain: 'customChain', hardfork: Hardfork.Cancun, diff --git a/packages/vm/test/api/state/accountExists.spec.ts b/packages/vm/test/api/state/accountExists.spec.ts index 7077e0337..042dba70a 100644 --- a/packages/vm/test/api/state/accountExists.spec.ts +++ b/packages/vm/test/api/state/accountExists.spec.ts @@ -4,6 +4,8 @@ import { assert, describe, it } from 'vitest' import { VM } from '../../../src/vm' +import type { DefaultStateManager } from '@ethereumjs/statemanager' + describe('correctly apply new account gas fee on pre-Spurious Dragon hardforks', () => { it('should work', async () => { // This transaction https://etherscan.io/tx/0x26ea8719eeca5737f8ca872bca1ac53cea9bf6e11462dd83317c2e66a4e43d7b produced an error @@ -68,9 +70,11 @@ describe('do not apply new account gas fee for empty account in DB on pre-Spurio // add empty account to DB const emptyAddress = new Address(hexToBytes('0xf48a1bdc65d9ccb4b569ffd4bffff415b90783d6')) await vm.stateManager.putAccount(emptyAddress, new Account()) - const emptyAccount = await vm.stateManager.getAccount(emptyAddress) - //@ts-ignore - await vm.stateManager._trie.put(toBytes(emptyAddress), emptyAccount.serialize()) + const emptyAccount = (await vm.stateManager.getAccount(emptyAddress)) as Account + await (vm.stateManager as DefaultStateManager)['_trie'].put( + toBytes(emptyAddress), + emptyAccount.serialize() + ) await vm.stateManager.putContractCode(contractAddress, hexToBytes(code)) // setup the contract code await vm.stateManager.putContractStorage( contractAddress, diff --git a/packages/vm/test/api/tester/tester.config.spec.ts b/packages/vm/test/api/tester/tester.config.spec.ts index db0b49536..fe478b233 100644 --- a/packages/vm/test/api/tester/tester.config.spec.ts +++ b/packages/vm/test/api/tester/tester.config.spec.ts @@ -23,10 +23,10 @@ describe('bloom', () => { assert.ok(common.isActivatedEIP(3607)) }) it('should be able to activate hardforks with EIPs enabled', () => { - let common = getCommon('byzantium+1153') - assert.ok(common.isActivatedEIP(1153)) - common = getCommon('byzantium+1153+2929') - assert.ok(common.isActivatedEIP(1153)) + let common = getCommon('byzantium+2537') + assert.ok(common.isActivatedEIP(2537)) + common = getCommon('byzantium+2537+2929') + assert.ok(common.isActivatedEIP(2537)) assert.ok(common.isActivatedEIP(2929)) }) it('should be able to activate transition forks', () => { diff --git a/packages/vm/test/api/utils.ts b/packages/vm/test/api/utils.ts index d4b9c37e3..82f6c3026 100644 --- a/packages/vm/test/api/utils.ts +++ b/packages/vm/test/api/utils.ts @@ -101,9 +101,9 @@ export function getTransaction( txParams['maxPriorityFeePerGas'] = BigInt(10) txParams['maxFeePerBlobGas'] = BigInt(100) txParams['blobs'] = getBlobs('hello world') - txParams['kzgCommitments'] = blobsToCommitments(txParams['blobs']) + txParams['kzgCommitments'] = blobsToCommitments(common.customCrypto!.kzg!, txParams['blobs']) txParams['kzgProofs'] = txParams['blobs'].map((blob: Uint8Array, ctx: number) => - common.customCrypto?.kzg?.computeBlobKzgProof( + common.customCrypto!.kzg!.computeBlobKzgProof( blob, txParams['kzgCommitments'][ctx] as Uint8Array ) diff --git a/packages/vm/test/tester/config.ts b/packages/vm/test/tester/config.ts index 87346c2aa..120f5b43a 100644 --- a/packages/vm/test/tester/config.ts +++ b/packages/vm/test/tester/config.ts @@ -199,7 +199,7 @@ export function getTestDirs(network: string, testType: string) { } /** * Setups the common with networks - * @param network Network target (this can include EIPs, such as Byzantium+1559+2929) + * @param network Network target (this can include EIPs, such as Byzantium+2537+2929) * @param ttd If set: total terminal difficulty to switch to merge * @returns */ diff --git a/packages/vm/test/tester/index.ts b/packages/vm/test/tester/index.ts index d9a36a926..a879902ec 100755 --- a/packages/vm/test/tester/index.ts +++ b/packages/vm/test/tester/index.ts @@ -1,5 +1,4 @@ -import { initKZG } from '@ethereumjs/util' -import { createKZG } from 'kzg-wasm' +import { loadKZG } from 'kzg-wasm' import * as minimist from 'minimist' import * as path from 'path' import * as process from 'process' @@ -103,8 +102,7 @@ async function runTests() { /** * Run-time configuration */ - const kzg = await createKZG() - initKZG(kzg) + const kzg = await loadKZG() const bn128 = await initRustBN() const runnerArgs: { forkConfigVM: string diff --git a/packages/vm/test/tester/runners/BlockchainTestsRunner.ts b/packages/vm/test/tester/runners/BlockchainTestsRunner.ts index b45b38aa0..e468a728a 100644 --- a/packages/vm/test/tester/runners/BlockchainTestsRunner.ts +++ b/packages/vm/test/tester/runners/BlockchainTestsRunner.ts @@ -92,7 +92,6 @@ export async function runBlockchainTest(options: any, testData: any, t: tape.Tes profilerOpts: { reportAfterBlock: options.profile, }, - bn128: options.bn128, }) // set up pre-state diff --git a/packages/vm/test/tester/runners/GeneralStateTestsRunner.ts b/packages/vm/test/tester/runners/GeneralStateTestsRunner.ts index d54a12acd..551054e4e 100644 --- a/packages/vm/test/tester/runners/GeneralStateTestsRunner.ts +++ b/packages/vm/test/tester/runners/GeneralStateTestsRunner.ts @@ -84,7 +84,6 @@ async function runTestCase(options: any, testData: any, t: tape.Test) { common, blockchain, profilerOpts: { reportAfterTx: options.profile }, - bn128: options.bn128, }) await setupPreConditions(vm.stateManager, testData) @@ -95,6 +94,8 @@ async function runTestCase(options: any, testData: any, t: tape.Test) { try { tx = makeTx(testData.transaction, { common }) } catch (e: any) { + console.log('error: ', e) + console.log('testData.transaction: ', testData.transaction) execInfo = 'tx instantiation exception' } diff --git a/packages/vm/vitest.browser.config.mts b/packages/vm/vitest.browser.config.mts new file mode 100644 index 000000000..1eb257b2f --- /dev/null +++ b/packages/vm/vitest.browser.config.mts @@ -0,0 +1,18 @@ + +import { configDefaults, defineConfig, mergeConfig } from 'vitest/config' +import baseConfig from '../../config/vitest.browser.config.mts' + +export default mergeConfig( + baseConfig, + defineConfig({ + test: { + exclude: [ + ...configDefaults.exclude, + // path.resolve is not a function + 'test/tester/config.spec.ts', + // Cannot read properties of undefined (reading 'pedersen_hash') + 'test/api/EIPs/eip-6800-verkle.spec.ts' + ], + }, + }) +) \ No newline at end of file diff --git a/packages/wallet/CHANGELOG.md b/packages/wallet/CHANGELOG.md index 2d23a08d3..43e273a62 100644 --- a/packages/wallet/CHANGELOG.md +++ b/packages/wallet/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) (modification: no type change headlines) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 2.0.3 - 2024-03-05 + +Maintenance release with downstream dependency updates, see PR [#3297](https://github.com/ethereumjs/ethereumjs-monorepo/pull/3297) + ## 2.0.2 - 2024-02-08 ### Self-Contained (and Working 🙂) README Examples diff --git a/packages/wallet/package.json b/packages/wallet/package.json index d4fb1ae37..8805e0d39 100644 --- a/packages/wallet/package.json +++ b/packages/wallet/package.json @@ -1,6 +1,6 @@ { "name": "@ethereumjs/wallet", - "version": "2.0.2", + "version": "2.0.3", "description": "Utilities for handling Ethereum keys", "keywords": [ "ethereum", @@ -42,12 +42,12 @@ "lint:fix": "../../config/cli/lint-fix.sh", "prepublishOnly": "../../config/cli/prepublish.sh", "test": "npm run test:node && npm run test:browser", - "test:browser": "vitest run --config=vitest.config.browser.ts --browser.name=webkit --browser.provider=playwright --browser.headless", + "test:browser": "npx vitest run --config=../../config/vitest.browser.config.mts", "test:node": "vitest run", "tsc": "../../config/cli/ts-compile.sh" }, "dependencies": { - "@ethereumjs/util": "^9.0.2", + "@ethereumjs/util": "^9.0.3", "@scure/base": "^1.1.5", "ethereum-cryptography": "^2.1.3", "js-md5": "^0.8.3", diff --git a/packages/wallet/test/index.spec.ts b/packages/wallet/test/index.spec.ts index b68ca129e..96bb85a64 100644 --- a/packages/wallet/test/index.spec.ts +++ b/packages/wallet/test/index.spec.ts @@ -271,59 +271,57 @@ describe('Wallet tests', () => { assert.deepEqual(JSON.parse(w), JSON.parse(encFixtureWallet)) // ethers doesn't support encrypting with PBKDF2 } - }, 30000) + }, 180000) - it('.toV3(): should work with Scrypt', () => { + it('.toV3(): should work with Scrypt', async () => { const wStaticJSON = '{"version":3,"id":"7e59dc02-8d42-409d-b29a-a8a0f862cc81","address":"b14ab53e38da1c172f877dbc6d65e4a1b0474c3c","crypto":{"ciphertext":"c52682025b1e5d5c06b816791921dbf439afe7a053abb9fac19f38a57499652c","cipherparams":{"iv":"cecacd85e9cb89788b5aab2f93361233"},"cipher":"aes-128-ctr","kdf":"scrypt","kdfparams":{"dklen":32,"salt":"dc9e4a98886738bd8aae134a1f89aaa5a502c3fbd10e336136d4d5fe47448ad6","n":262144,"r":8,"p":1},"mac":"27b98c8676dc6619d077453b38db645a4c7c17a3e686ee5adaf53c11ac1b890e"}}' const wStatic = JSON.parse(wStaticJSON) const wRandom = Wallet.generate() const wEthers = new ethersWallet(wRandom.getPrivateKeyString()) for (const perm of permutations) { - it(`vector ${JSON.stringify(perm)}`, async () => { - const { salt, iv, uuid } = perm - const ethersOpts = makeEthersOptions({ salt, iv, uuid }) - - const encFixtureWallet = await fixtureWallet.toV3String(pw, { - kdf: 'scrypt', - uuid, - salt, - iv, - n, - r, - p, - }) + const { salt, iv, uuid } = perm + const ethersOpts = makeEthersOptions({ salt, iv, uuid }) - const encFixtureEthersWallet = encryptKeystoreJsonSync(fixtureEthersWallet, pw, { - scrypt: { N: n, r, p }, - salt: ethersOpts.salt, - iv: ethersOpts.iv, - uuid: ethersOpts.uuid, - }).toLowerCase() - - const encRandomWallet = await wRandom.toV3String(pw, { - kdf: 'scrypt', - uuid, - salt, - iv, - n, - r, - p, - }) + const encFixtureWallet = await fixtureWallet.toV3String(pw, { + kdf: 'scrypt', + uuid, + salt, + iv, + n, + r, + p, + }) - const encEthersWallet = encryptKeystoreJsonSync(wEthers, pw, { - scrypt: { N: n, r, p }, - salt: ethersOpts.salt, - iv: ethersOpts.iv, - uuid: ethersOpts.uuid, - }).toLowerCase() + const encFixtureEthersWallet = encryptKeystoreJsonSync(fixtureEthersWallet, pw, { + scrypt: { N: n, r, p }, + salt: ethersOpts.salt, + iv: ethersOpts.iv, + uuid: ethersOpts.uuid, + }).toLowerCase() - assert.deepEqual(wStatic, JSON.parse(encFixtureWallet)) - assert.deepEqual(wStatic, JSON.parse(encFixtureEthersWallet)) - assert.deepEqual(JSON.parse(encRandomWallet), JSON.parse(encEthersWallet)) + const encRandomWallet = await wRandom.toV3String(pw, { + kdf: 'scrypt', + uuid, + salt, + iv, + n, + r, + p, }) + + const encEthersWallet = encryptKeystoreJsonSync(wEthers, pw, { + scrypt: { N: n, r, p }, + salt: ethersOpts.salt, + iv: ethersOpts.iv, + uuid: ethersOpts.uuid, + }).toLowerCase() + + assert.deepEqual(wStatic, JSON.parse(encFixtureWallet)) + assert.deepEqual(wStatic, JSON.parse(encFixtureEthersWallet)) + assert.deepEqual(JSON.parse(encRandomWallet), JSON.parse(encEthersWallet)) } - }, 30000) + }, 180000) it('.toV3(): without providing options', async () => { const wallet = await fixtureWallet.toV3('testtest') diff --git a/settings.json b/settings.json deleted file mode 100644 index c65f02cd5..000000000 --- a/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "editor.codeActionsOnSave": { - "source.fixAll.eslint": "explicit" - }, - "eslint.format.enable": true, - "eslint.workingDirectories": [{ "pattern": "./packages/*" }] -} diff --git a/static.yml b/static.yml deleted file mode 100644 index a6628603d..000000000 --- a/static.yml +++ /dev/null @@ -1,43 +0,0 @@ -# Simple workflow for deploying static content to GitHub Pages -name: Deploy static content to Pages - -on: - # Runs on pushes targeting the default branch - push: - branches: ['master'] - - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: - -# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages -permissions: - contents: read - pages: write - id-token: write - -# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. -# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. -concurrency: - group: 'pages' - cancel-in-progress: false - -jobs: - # Single deploy job since we're just deploying - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup Pages - uses: actions/configure-pages@v5 - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - # Upload entire repository - path: '.' - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/testTZbBr5/customChain.json b/testTZbBr5/customChain.json new file mode 100644 index 000000000..ca5141aab --- /dev/null +++ b/testTZbBr5/customChain.json @@ -0,0 +1,44 @@ +{ + "name": "customChain", + "chainId": 11155111, + "networkId": 11155111, + "defaultHardfork": "shanghai", + "consensus": { + "type": "pow", + "algorithm": "ethash", + "ethash": {} + }, + "comment": "PoW test network to replace Ropsten", + "url": "https://github.com/ethereum/go-ethereum/pull/23730", + "genesis": { + "timestamp": "0x6159af19", + "gasLimit": 30000000, + "difficulty": 131072, + "nonce": "0x0000000000000000", + "extraData": "0x5365706f6c69612c20417468656e732c204174746963612c2047726565636521" + }, + "hardforks": [ + { + "name": "chainstart", + "block": 0, + "forkHash": "0xfe3366e7" + }, + { + "name": "homestead", + "block": 0, + "forkHash": "0xfe3366e7" + } + ], + "bootstrapNodes": [ + { + "ip": "18.168.182.86", + "port": 30303, + "id": "9246d00bc8fd1742e5ad2428b80fc4dc45d786283e05ef6edbd9002cbc335d40998444732fbe921cb88e1d2c73d1b1de53bae6a2237996e9bfe14f871baf7066", + "location": "", + "comment": "geth" + } + ], + "dnsNetworks": [ + "enrtree://AKA3AM6LPBYEUDMVNU3BSVQJ5AD45Y7YPOHJLEF6W26QOE4VTUDPE@all.sepolia.ethdisco.net" + ] +} diff --git a/testTZbBr5/customChain/.f812457e42518de1108a98ceba360bc2e1856af2-audit.json b/testTZbBr5/customChain/.f812457e42518de1108a98ceba360bc2e1856af2-audit.json new file mode 100644 index 000000000..d4a004615 --- /dev/null +++ b/testTZbBr5/customChain/.f812457e42518de1108a98ceba360bc2e1856af2-audit.json @@ -0,0 +1,15 @@ +{ + "keep": { + "days": false, + "amount": 5 + }, + "auditLog": "testTZbBr5/customChain/.f812457e42518de1108a98ceba360bc2e1856af2-audit.json", + "files": [ + { + "date": 1717231907296, + "name": "testTZbBr5/customChain/ethereumjs.2024-06-01.log", + "hash": "cd766c29d063d8540d671f717d0d8a59ad7af14a0e591fdde94f5d3a0662d255" + } + ], + "hashType": "sha256" +} diff --git a/testTZbBr5/customChain/chain/CURRENT b/testTZbBr5/customChain/chain/CURRENT new file mode 100644 index 000000000..1a8485221 --- /dev/null +++ b/testTZbBr5/customChain/chain/CURRENT @@ -0,0 +1 @@ +MANIFEST-000002 diff --git a/testTZbBr5/customChain/chain/LOCK b/testTZbBr5/customChain/chain/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/testTZbBr5/customChain/chain/LOG b/testTZbBr5/customChain/chain/LOG new file mode 100644 index 000000000..7b10761e6 --- /dev/null +++ b/testTZbBr5/customChain/chain/LOG @@ -0,0 +1 @@ +2024/06/01-15:51:48.225850 7fb4627fc640 Delete type=3 #1 diff --git a/testTZbBr5/customChain/chain/MANIFEST-000002 b/testTZbBr5/customChain/chain/MANIFEST-000002 new file mode 100644 index 0000000000000000000000000000000000000000..bbbc585686bcbcc33686059c69d80b7b4e1291cd GIT binary patch literal 50 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE F7y#sj5K{mE literal 0 HcmV?d00001 diff --git a/testTZbBr5/customChain/config/CURRENT b/testTZbBr5/customChain/config/CURRENT new file mode 100644 index 000000000..1a8485221 --- /dev/null +++ b/testTZbBr5/customChain/config/CURRENT @@ -0,0 +1 @@ +MANIFEST-000002 diff --git a/testTZbBr5/customChain/config/LOCK b/testTZbBr5/customChain/config/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/testTZbBr5/customChain/config/LOG b/testTZbBr5/customChain/config/LOG new file mode 100644 index 000000000..939aa041d --- /dev/null +++ b/testTZbBr5/customChain/config/LOG @@ -0,0 +1 @@ +2024/06/01-15:51:47.040865 7fb4617fa640 Delete type=3 #1 diff --git a/testTZbBr5/customChain/config/MANIFEST-000002 b/testTZbBr5/customChain/config/MANIFEST-000002 new file mode 100644 index 0000000000000000000000000000000000000000..bbbc585686bcbcc33686059c69d80b7b4e1291cd GIT binary patch literal 50 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE F7y#sj5K{mE literal 0 HcmV?d00001 diff --git a/testTZbBr5/customChain/meta/CURRENT b/testTZbBr5/customChain/meta/CURRENT new file mode 100644 index 000000000..1a8485221 --- /dev/null +++ b/testTZbBr5/customChain/meta/CURRENT @@ -0,0 +1 @@ +MANIFEST-000002 diff --git a/testTZbBr5/customChain/meta/LOCK b/testTZbBr5/customChain/meta/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/testTZbBr5/customChain/meta/LOG b/testTZbBr5/customChain/meta/LOG new file mode 100644 index 000000000..5891808ee --- /dev/null +++ b/testTZbBr5/customChain/meta/LOG @@ -0,0 +1 @@ +2024/06/01-15:51:48.241516 7fb4617fa640 Delete type=3 #1 diff --git a/testTZbBr5/customChain/meta/MANIFEST-000002 b/testTZbBr5/customChain/meta/MANIFEST-000002 new file mode 100644 index 0000000000000000000000000000000000000000..bbbc585686bcbcc33686059c69d80b7b4e1291cd GIT binary patch literal 50 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE F7y#sj5K{mE literal 0 HcmV?d00001 diff --git a/testTZbBr5/customChain/state/CURRENT b/testTZbBr5/customChain/state/CURRENT new file mode 100644 index 000000000..1a8485221 --- /dev/null +++ b/testTZbBr5/customChain/state/CURRENT @@ -0,0 +1 @@ +MANIFEST-000002 diff --git a/testTZbBr5/customChain/state/LOCK b/testTZbBr5/customChain/state/LOCK new file mode 100644 index 000000000..e69de29bb diff --git a/testTZbBr5/customChain/state/LOG b/testTZbBr5/customChain/state/LOG new file mode 100644 index 000000000..e227d711a --- /dev/null +++ b/testTZbBr5/customChain/state/LOG @@ -0,0 +1 @@ +2024/06/01-15:51:48.218582 7fb461ffb640 Delete type=3 #1 diff --git a/testTZbBr5/customChain/state/MANIFEST-000002 b/testTZbBr5/customChain/state/MANIFEST-000002 new file mode 100644 index 0000000000000000000000000000000000000000..bbbc585686bcbcc33686059c69d80b7b4e1291cd GIT binary patch literal 50 zcmWIhx#Ncn10$nUPHI_dPD+xVQ)NkNd1i5{bAE0?Vo_pAe$kRS-TOEg7@3$k8JJmE F7y#sj5K{mE literal 0 HcmV?d00001 diff --git a/testTZbBr5/customGenesis.json b/testTZbBr5/customGenesis.json new file mode 100644 index 000000000..5052d62dd --- /dev/null +++ b/testTZbBr5/customGenesis.json @@ -0,0 +1,17 @@ +{ + "0xa2A6d93439144FFE4D27c9E088dCD8b783946263": "0xD3C21BCECCEDA1000000", + "0xBc11295936Aa79d594139de1B2e12629414F3BDB": "0xD3C21BCECCEDA1000000", + "0x7cF5b79bfe291A67AB02b393E456cCc4c266F753": "0xD3C21BCECCEDA1000000", + "0xaaec86394441f915bce3e6ab399977e9906f3b69": "0xD3C21BCECCEDA1000000", + "0xF47CaE1CF79ca6758Bfc787dbD21E6bdBe7112B8": "0xD3C21BCECCEDA1000000", + "0xd7eDDB78ED295B3C9629240E8924fb8D8874ddD8": "0xD3C21BCECCEDA1000000", + "0x8b7F0977Bb4f0fBE7076FA22bC24acA043583F5e": "0xD3C21BCECCEDA1000000", + "0xe2e2659028143784d557bcec6ff3a0721048880a": "0xD3C21BCECCEDA1000000", + "0xd9a5179f091d85051d3c982785efd1455cec8699": "0xD3C21BCECCEDA1000000", + "0xbeef32ca5b9a198d27B4e02F4c70439fE60356Cf": "0xD3C21BCECCEDA1000000", + "0x0000006916a87b82333f4245046623b23794c65c": "0x84595161401484A000000", + "0xb21c33de1fab3fa15499c62b59fe0cc3250020d1": "0x52B7D2DCC80CD2E4000000", + "0x10F5d45854e038071485AC9e402308cF80D2d2fE": "0x52B7D2DCC80CD2E4000000", + "0xd7d76c58b3a519e9fA6Cc4D22dC017259BC49F1E": "0x52B7D2DCC80CD2E4000000", + "0x799D329e5f583419167cD722962485926E338F4a": "0xDE0B6B3A7640000" +} diff --git a/vitest.workspace.js b/vitest.workspace.js new file mode 100644 index 000000000..b0f73caa1 --- /dev/null +++ b/vitest.workspace.js @@ -0,0 +1,19 @@ +import { defineWorkspace } from 'vitest/config' + +export default defineWorkspace([ + './packages/trie/vitest.config.browser.ts', + './packages/wallet/vitest.config.browser.ts', + './packages/vm/vitest.browser.config.mts', + './packages/rlp/vitest.config.browser.ts', + './packages/rlp/vitest.browser.config.mts', + './packages/util/vitest.config.browser.ts', + './packages/verkle/vitest.config.browser.ts', + './packages/statemanager/vitest.config.browser.ts', + './packages/statemanager/vitest.browser.config.mts', + './packages/tx/vitest.config.browser.ts', + './packages/tx/vitest.browser.config.mts', + './packages/evm/vitest.config.browser.ts', + './packages/client/vitest.config.unit.ts', + './packages/block/vitest.config.browser.ts', + './config/vitest.browser.config.mts', +])