From 9ea523fad8d6a6e939344e7f08d89db4550ee2d6 Mon Sep 17 00:00:00 2001 From: Jernej Kos Date: Thu, 12 Mar 2026 10:55:14 +0100 Subject: [PATCH] runtime-sdk/modules/evm: Migrate engine to evm v1.1.0 --- Cargo.lock | 1041 ++++++++++++----- contract-sdk/specs/access/oas173/Cargo.lock | 192 +-- contract-sdk/specs/token/oas20/Cargo.lock | 192 +-- .../rofl-oracle-sgx/rust-toolchain.toml | 2 +- .../rofl-oracle-tdx-raw/rust-toolchain.toml | 2 +- runtime-sdk-macros/src/evm_derive.rs | 131 ++- runtime-sdk/modules/evm/Cargo.toml | 17 +- runtime-sdk/modules/evm/fuzz/precompile.rs | 2 +- .../evm/fuzz/precompile_contract_dispatch.rs | 127 -- .../precompile_contract_dispatch_corpus.rs | 45 - .../modules/evm/fuzz/precompile_corpus.rs | 14 - runtime-sdk/modules/evm/src/backend.rs | 543 --------- runtime-sdk/modules/evm/src/engine/backend.rs | 520 ++++++++ runtime-sdk/modules/evm/src/engine/invoker.rs | 167 +++ runtime-sdk/modules/evm/src/engine/mod.rs | 7 + runtime-sdk/modules/evm/src/engine/state.rs | 206 ++++ runtime-sdk/modules/evm/src/lib.rs | 260 ++-- .../evm/src/precompile/confidential.rs | 446 ++++--- .../modules/evm/src/precompile/contract.rs | 19 +- .../modules/evm/src/precompile/erc20.rs | 232 ++-- runtime-sdk/modules/evm/src/precompile/gas.rs | 113 +- runtime-sdk/modules/evm/src/precompile/mod.rs | 227 ++-- .../modules/evm/src/precompile/sha2.rs | 26 +- .../evm/src/precompile/standard/bn128.rs | 257 ---- .../evm/src/precompile/standard/mod.rs | 10 - .../evm/src/precompile/standard/modexp.rs | 306 ----- .../evm/src/precompile/standard/simple.rs | 231 ---- .../modules/evm/src/precompile/subcall.rs | 121 +- .../evm/src/precompile/testdata/bn256Add.json | 114 -- .../src/precompile/testdata/bn256Pairing.json | 100 -- .../precompile/testdata/bn256ScalarMul.json | 135 --- .../src/precompile/testdata/common_bnadd.json | 52 - .../src/precompile/testdata/common_bnmul.json | 52 - .../precompile/testdata/common_bnpair.json | 202 ---- .../precompile/testdata/modexp_eip2565.json | 121 -- .../modules/evm/src/precompile/testing.rs | 204 +--- runtime-sdk/modules/evm/src/test.rs | 191 ++- runtime-sdk/src/modules/core/mod.rs | 112 +- tests/contracts/bench/Cargo.lock | 4 +- tests/contracts/hello/Cargo.lock | 192 +-- .../e2e/evm/contracts/use_gas/evm_use_gas.hex | 2 +- .../e2e/evm/contracts/use_gas/evm_use_gas.sol | 2 +- tests/e2e/evm/delegation.go | 5 +- tests/e2e/evm/tests.go | 3 + tests/runtimes/benchmarking/src/lib.rs | 2 - tests/runtimes/simple-evm/src/lib.rs | 6 +- 46 files changed, 3099 insertions(+), 3856 deletions(-) delete mode 100644 runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch.rs delete mode 100644 runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch_corpus.rs delete mode 100644 runtime-sdk/modules/evm/src/backend.rs create mode 100644 runtime-sdk/modules/evm/src/engine/backend.rs create mode 100644 runtime-sdk/modules/evm/src/engine/invoker.rs create mode 100644 runtime-sdk/modules/evm/src/engine/mod.rs create mode 100644 runtime-sdk/modules/evm/src/engine/state.rs delete mode 100644 runtime-sdk/modules/evm/src/precompile/standard/bn128.rs delete mode 100644 runtime-sdk/modules/evm/src/precompile/standard/mod.rs delete mode 100644 runtime-sdk/modules/evm/src/precompile/standard/modexp.rs delete mode 100644 runtime-sdk/modules/evm/src/precompile/standard/simple.rs delete mode 100644 runtime-sdk/modules/evm/src/precompile/testdata/bn256Add.json delete mode 100644 runtime-sdk/modules/evm/src/precompile/testdata/bn256Pairing.json delete mode 100644 runtime-sdk/modules/evm/src/precompile/testdata/bn256ScalarMul.json delete mode 100644 runtime-sdk/modules/evm/src/precompile/testdata/common_bnadd.json delete mode 100644 runtime-sdk/modules/evm/src/precompile/testdata/common_bnmul.json delete mode 100644 runtime-sdk/modules/evm/src/precompile/testdata/common_bnpair.json delete mode 100644 runtime-sdk/modules/evm/src/precompile/testdata/modexp_eip2565.json diff --git a/Cargo.lock b/Cargo.lock index 744cd66a1d1..3480716ec67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -43,6 +43,18 @@ dependencies = [ "subtle", ] +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if 1.0.4", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -73,6 +85,16 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy-rlp" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc90b1e703d3c03f4ff7f48e82dd0bc1c8211ab7d079cd836a06fcfeb06651cb" +dependencies = [ + "arrayvec", + "bytes", +] + [[package]] name = "android_system_properties" version = "0.1.5" @@ -90,9 +112,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstyle" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" [[package]] name = "anyhow" @@ -111,13 +133,262 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" dependencies = [ "rustversion", ] +[[package]] +name = "ark-bls12-381" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df4dcc01ff89867cd86b0da835f23c3f02738353aaee7dde7495af71363b8d5" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "arraydeque" version = "0.5.1" @@ -288,6 +559,16 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "aurora-engine-modexp" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "518bc5745a6264b5fd7b09dffb9667e400ee9e2bbe18555fac75e1fe9afa0df9" +dependencies = [ + "hex", + "num", +] + [[package]] name = "auto_impl" version = "1.3.0" @@ -551,7 +832,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 2.1.1", + "rustc-hash 2.1.2", "shlex", "syn 2.0.117", ] @@ -684,9 +965,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.56" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "jobserver", @@ -827,18 +1108,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" +checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.60" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f" dependencies = [ "anstyle", "clap_lex", @@ -846,15 +1127,15 @@ dependencies = [ [[package]] name = "clap_lex" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -1192,7 +1473,7 @@ dependencies = [ "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", - "rustc_version", + "rustc_version 0.4.1", "subtle", "zeroize", ] @@ -1243,12 +1524,12 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -1281,11 +1562,10 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", @@ -1317,11 +1597,11 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ - "darling_core 0.21.3", + "darling_core 0.23.0", "quote", "syn 2.0.117", ] @@ -1413,6 +1693,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive_arbitrary" version = "1.4.2" @@ -1628,6 +1919,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "either" version = "1.15.0" @@ -1664,6 +1967,26 @@ dependencies = [ "cfg-if 1.0.4", ] +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "env_logger" version = "0.10.2" @@ -1677,12 +2000,6 @@ dependencies = [ "termcolor", ] -[[package]] -name = "environmental" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48c92028aaa870e83d51c64e5d4e0b6981b360c522198c23959f219a4e1b15b" - [[package]] name = "equivalent" version = "1.0.2" @@ -1727,12 +2044,11 @@ dependencies = [ [[package]] name = "ethaddr" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecbcc1770d1b2e3fb83915c80c47a10efbe1964544a40e0211fe40274f8363c8" +checksum = "ad480c47d516931d0c87a305dc7a829cd0d2f53365b4fc9c1800a0172774f668" dependencies = [ "serde", - "sha3", ] [[package]] @@ -1752,30 +2068,11 @@ dependencies = [ [[package]] name = "ethdigest" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cadad23be1ff9cf970f84a87e8e9666c19b4a4393c1acf89a1790d727ae11cc" -dependencies = [ - "serde", - "sha3", -] - -[[package]] -name = "ethereum" -version = "0.14.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a89fb87a9e103f71b903b80b670200b54cc67a07578f070681f1fffb7396fb7" +checksum = "a30680d337002fac15ff9ebf2090ed1988b6567436b6a44e8f8b6f4ba8aee717" dependencies = [ - "bytes", - "ethereum-types", - "hash-db 0.15.2", - "hash256-std-hasher", - "parity-scale-codec", - "rlp", - "scale-info", "serde", - "sha3", - "triehash", ] [[package]] @@ -1786,7 +2083,7 @@ checksum = "2e04d24d20b8ff2235cffbf242d5092de3aa45f77c5270ddbfadd2778ca13fea" dependencies = [ "bytes", "ethereum-types", - "hash-db 0.16.0", + "hash-db", "hash256-std-hasher", "parity-scale-codec", "rlp", @@ -1823,9 +2120,9 @@ dependencies = [ [[package]] name = "ethprim" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d5d08a4d724b4d10c7f5db832f45298c7418629acf0b17cc265f3f35a00bd79" +checksum = "7b3d4336d673b30413c34deaf1ce22144519a50d1f533c1fcf8676818008e64f" dependencies = [ "ethaddr", "ethdigest", @@ -1834,56 +2131,51 @@ dependencies = [ [[package]] name = "evm" -version = "0.39.1" -source = "git+https://github.com/oasisprotocol/evm?tag=v0.39.1-oasis#13a30bfc1a10074f3f1676988aeb6ada76c65553" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa0f46cdbfb77f652f0612a86205c6d30e3598572eb01f08eefd4e3c400ffc7e" dependencies = [ - "auto_impl", - "environmental", - "ethereum 0.14.0", - "evm-core", - "evm-gasometer", - "evm-runtime", - "log", - "parity-scale-codec", - "primitive-types", - "rlp", - "scale-info", - "serde", + "evm-interpreter", "sha3", ] [[package]] -name = "evm-core" -version = "0.39.0" -source = "git+https://github.com/oasisprotocol/evm?tag=v0.39.1-oasis#13a30bfc1a10074f3f1676988aeb6ada76c65553" +name = "evm-interpreter" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "311d686511ca31affdf74d45116626fec65d01d82dcc2e28e42eac036a8fbe2f" dependencies = [ + "auto_impl", "parity-scale-codec", + "paste", "primitive-types", + "rlp", + "ruint", "scale-info", "serde", + "sha3", ] [[package]] -name = "evm-gasometer" -version = "0.39.0" -source = "git+https://github.com/oasisprotocol/evm?tag=v0.39.1-oasis#13a30bfc1a10074f3f1676988aeb6ada76c65553" -dependencies = [ - "environmental", - "evm-core", - "evm-runtime", - "primitive-types", -] - -[[package]] -name = "evm-runtime" -version = "0.39.0" -source = "git+https://github.com/oasisprotocol/evm?tag=v0.39.1-oasis#13a30bfc1a10074f3f1676988aeb6ada76c65553" +name = "evm-precompile" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee72a0e8b0c87dc7132c36f9b5e82dfa6a35f3e281d84c0ab718e7923254db08" dependencies = [ - "auto_impl", - "environmental", - "evm-core", + "ark-bls12-381", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "aurora-engine-modexp", + "evm", + "hex-literal", + "k256", + "num", "primitive-types", + "ripemd", + "sha2 0.10.9", "sha3", + "substrate-bn", ] [[package]] @@ -1905,9 +2197,31 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" + +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] [[package]] name = "ff" @@ -2287,7 +2601,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.13.0", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -2325,12 +2639,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "hash-db" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d23bd4e7b5eda0d0f3a307e8b381fdc8ba9000f26fbe912250c0a4cc3956364a" - [[package]] name = "hash-db" version = "0.16.0" @@ -2380,6 +2688,12 @@ dependencies = [ "foldhash 0.2.0", ] +[[package]] +name = "hashbrown" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" + [[package]] name = "hashlink" version = "0.10.0" @@ -2564,15 +2878,15 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.59" +version = "0.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724607fd5cc535fceca960d7f684a1735c4e96c26b4e43986fe8ce798c2550e" +checksum = "4d6510a410acedd7a7683b3a45dafdc5ccf3c72d6addaa373497005964fc4e23" dependencies = [ "arbitrary", "lazy_static", "memmap2", - "rustc_version", - "semver", + "rustc_version 0.4.1", + "semver 1.0.28", ] [[package]] @@ -2649,9 +2963,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" -version = "1.8.1" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ "atomic-waker", "bytes", @@ -2664,7 +2978,6 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "pin-utils", "smallvec", "tokio", "want", @@ -2721,7 +3034,7 @@ dependencies = [ "libc", "percent-encoding", "pin-project-lite", - "socket2 0.6.3", + "socket2", "tokio", "tower-service", "tracing", @@ -2753,12 +3066,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -2766,9 +3080,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -2779,9 +3093,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -2793,15 +3107,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -2813,15 +3127,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -2927,12 +3241,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", "serde", "serde_core", ] @@ -3016,14 +3330,15 @@ dependencies = [ [[package]] name = "ipconfig" -version = "0.3.2" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" +checksum = "4d40460c0ce33d6ce4b0630ad68ff63d6661961c48b6dba35e5a4d81cfb48222" dependencies = [ - "socket2 0.5.10", + "socket2", "widestring", - "windows-sys 0.48.0", - "winreg", + "windows-registry", + "windows-result", + "windows-sys 0.61.2", ] [[package]] @@ -3043,9 +3358,9 @@ checksum = "cf370abdafd54d13e54a620e8c3e1145f28e46cc9d704bc6d94414559df41763" [[package]] name = "iri-string" -version = "0.7.10" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ "memchr", "serde", @@ -3100,9 +3415,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jni" @@ -3113,7 +3428,7 @@ dependencies = [ "cesu8", "cfg-if 1.0.4", "combine", - "jni-sys 0.3.0", + "jni-sys 0.3.1", "log", "thiserror 1.0.69", "walkdir", @@ -3145,16 +3460,19 @@ checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" dependencies = [ "proc-macro2", "quote", - "rustc_version", + "rustc_version 0.4.1", "simd_cesu8", "syn 2.0.117", ] [[package]] name = "jni-sys" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] [[package]] name = "jni-sys" @@ -3187,10 +3505,12 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ + "cfg-if 1.0.4", + "futures-util", "once_cell", "wasm-bindgen", ] @@ -3277,9 +3597,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libloading" @@ -3317,9 +3637,9 @@ checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -3398,7 +3718,7 @@ dependencies = [ "mbedtls-platform-support", "mbedtls-sys-auto", "rs-libc", - "rustc_version", + "rustc_version 0.4.1", "serde", "serde_derive", "yasna 0.2.2", @@ -3498,9 +3818,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi 0.11.1+wasi-snapshot-preview1", @@ -3527,9 +3847,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.14" +version = "0.12.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85f8024e1c8e71c778968af91d43700ce1d11b219d127d79fb2934153b82b42b" +checksum = "957228ad12042ee839f93c8f257b62b4c0ab5eaae1d4fa60de53b27c9d7c5046" dependencies = [ "crossbeam-channel", "crossbeam-epoch", @@ -3768,9 +4088,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -3877,7 +4197,7 @@ dependencies = [ "oasis-contract-sdk-types", "oasis-runtime-sdk", "rand_core 0.6.4", - "rand_xorshift", + "rand_xorshift 0.3.0", "thiserror 1.0.69", "wee_alloc", ] @@ -4099,15 +4419,16 @@ dependencies = [ [[package]] name = "oasis-runtime-sdk-evm" -version = "0.6.0" +version = "0.7.0" dependencies = [ "anyhow", "base64 0.22.1", "blake3", "criterion", "ethabi", - "ethereum 0.15.0", + "ethereum", "evm", + "evm-precompile", "fixed-hash", "hex", "hmac", @@ -4237,9 +4558,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" dependencies = [ "critical-section", "portable-atomic", @@ -4485,6 +4806,16 @@ version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +[[package]] +name = "pest" +version = "2.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0848c601009d37dfa3430c4666e147e49cdcf1b92ecd3e63657d8a5f19da662" +dependencies = [ + "memchr", + "ucd-trie", +] + [[package]] name = "pin-project" version = "1.1.11" @@ -4511,12 +4842,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - [[package]] name = "pkcs1" version = "0.7.5" @@ -4603,9 +4928,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -4696,7 +5021,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.4+spec-1.1.0", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -4743,6 +5068,21 @@ dependencies = [ "yansi", ] +[[package]] +name = "proptest" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" +dependencies = [ + "bitflags 2.11.0", + "num-traits", + "rand 0.9.2", + "rand_chacha 0.9.0", + "rand_xorshift 0.4.0", + "regex-syntax", + "unarray", +] + [[package]] name = "prost" version = "0.13.5" @@ -4925,6 +5265,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_xorshift" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" +dependencies = [ + "rand_core 0.9.5", +] + [[package]] name = "rayon" version = "1.11.0" @@ -5140,7 +5489,7 @@ dependencies = [ "http", "hyper", "hyper-util", - "indexmap 2.13.0", + "indexmap 2.14.0", "libc", "memchr", "multer", @@ -5179,7 +5528,7 @@ source = "git+https://github.com/rwf2/Rocket?rev=28891e8072136f4641a33fb8c3f2aaf dependencies = [ "devise", "glob", - "indexmap 2.13.0", + "indexmap 2.14.0", "proc-macro2", "quote", "rocket_http", @@ -5195,7 +5544,7 @@ source = "git+https://github.com/rwf2/Rocket?rev=28891e8072136f4641a33fb8c3f2aaf dependencies = [ "cookie", "either", - "indexmap 2.13.0", + "indexmap 2.14.0", "memchr", "pear", "percent-encoding", @@ -5390,6 +5739,40 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ruint" +version = "1.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +dependencies = [ + "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "ark-ff 0.5.0", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", + "proptest", + "rand 0.8.5", + "rand 0.9.2", + "rlp", + "ruint-macro", + "serde_core", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + [[package]] name = "rustables" version = "0.8.7" @@ -5428,9 +5811,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" +checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" [[package]] name = "rustc-hex" @@ -5438,13 +5821,22 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver", + "semver 1.0.28", ] [[package]] @@ -5630,9 +6022,9 @@ checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] name = "s2n-codec" -version = "0.76.0" +version = "0.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f50a47bba1ff6cd526c0018481a13289307aade3fe4798ecb45306e67e726b5" +checksum = "d07631cbc3e459992aff1dc0e80ebc36477096b385f8812f9fd0c1921b9e8a05" dependencies = [ "byteorder", "bytes", @@ -5641,9 +6033,9 @@ dependencies = [ [[package]] name = "s2n-quic" -version = "1.76.0" +version = "1.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac8d7c1941118cb9922b0ba8720793d5df6fbcaf5f989c523b0d7ca9cd14326" +checksum = "648930dfc27a088346ff375368932afe354acb50eac483ff5cb3670d4f73a125" dependencies = [ "bytes", "cfg-if 1.0.4", @@ -5665,9 +6057,9 @@ dependencies = [ [[package]] name = "s2n-quic-core" -version = "0.76.0" +version = "0.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1c1acca904f1681a854c0db3969407f3b335dcceeed1c2291c860f198f77283" +checksum = "7a721bf0aa5081236def820023fd740a28f8984f01fe7a41b99d7882ddb60ac9" dependencies = [ "atomic-waker", "byteorder", @@ -5687,9 +6079,9 @@ dependencies = [ [[package]] name = "s2n-quic-crypto" -version = "0.76.0" +version = "0.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc143a289765b48bfe7f2986497ed445b4f98ab45e8d787e24054a84b78109ff" +checksum = "a4abf50bd79169d73bb316c9bb76e1702e4d80343cd2739322424cb930c4d171" dependencies = [ "aws-lc-rs", "cfg-if 1.0.4", @@ -5713,24 +6105,24 @@ dependencies = [ [[package]] name = "s2n-quic-platform" -version = "0.76.0" +version = "0.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca931fd1c528f4eaaf8af8b75ef66ff8d8540d719d00fd03ebb9cb1e546cf62" +checksum = "012f2a45252218f287ae7a5a46702fe154cba95f562ebd77e09211b9765a12b9" dependencies = [ "cfg-if 1.0.4", "futures", "lazy_static", "libc", "s2n-quic-core", - "socket2 0.6.3", + "socket2", "tokio", ] [[package]] name = "s2n-quic-rustls" -version = "0.76.0" +version = "0.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b791196ac1a1363e920f160a27155c5ea1c9b979366d549619fdb57dba775b2c" +checksum = "881cd30478a0f6817ef980b9d038203aba2ed280ed87bfbb95ad4309d07db717" dependencies = [ "bytes", "rustls", @@ -5742,9 +6134,9 @@ dependencies = [ [[package]] name = "s2n-quic-transport" -version = "0.76.0" +version = "0.77.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dcf1512601877051e089976f59e074ec5d2ff38a1ab01cdc219e00afe821c4b" +checksum = "94b2324ea380a371c384fcb3bd0216cd1020d45c81d36c01741592bb044e3e09" dependencies = [ "bytes", "futures-channel", @@ -5912,9 +6304,27 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] [[package]] name = "serde" @@ -6024,15 +6434,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.17.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.0", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", @@ -6043,11 +6453,11 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.17.0" +version = "3.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" dependencies = [ - "darling 0.21.3", + "darling 0.23.0", "proc-macro2", "quote", "syn 2.0.117", @@ -6144,9 +6554,9 @@ dependencies = [ [[package]] name = "simd-adler32" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" +checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "simd_cesu8" @@ -6154,7 +6564,7 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33" dependencies = [ - "rustc_version", + "rustc_version 0.4.1", "simdutf8", ] @@ -6279,21 +6689,11 @@ dependencies = [ "chacha20poly1305", "curve25519-dalek", "rand_core 0.6.4", - "rustc_version", + "rustc_version 0.4.1", "sha2 0.10.9", "subtle", ] -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - [[package]] name = "socket2" version = "0.6.3" @@ -6629,7 +7029,7 @@ dependencies = [ "peg", "pin-project", "rand 0.8.5", - "semver", + "semver 1.0.28", "serde", "serde_bytes", "serde_json", @@ -6823,9 +7223,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -6843,9 +7243,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -6858,9 +7258,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.50.0" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", @@ -6868,7 +7268,7 @@ dependencies = [ "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2 0.6.3", + "socket2", "tokio-macros", "windows-sys 0.61.2", ] @@ -6885,9 +7285,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -6999,9 +7399,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -7012,7 +7412,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "toml_datetime 0.6.11", "winnow 0.5.40", ] @@ -7023,7 +7423,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.13.0", + "indexmap 2.14.0", "serde", "serde_spanned", "toml_datetime 0.6.11", @@ -7033,23 +7433,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 1.0.0+spec-1.1.0", + "indexmap 2.14.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] @@ -7150,9 +7550,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.22" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ "matchers", "nu-ansi-term", @@ -7173,17 +7573,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4ed310ef5ab98f5fa467900ed906cb9232dd5376597e00fd4cba2a449d06c0b" dependencies = [ - "hash-db 0.16.0", -] - -[[package]] -name = "triehash" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1631b201eb031b563d2e85ca18ec8092508e262a3196ce9bd10a67ec87b9f5c" -dependencies = [ - "hash-db 0.15.2", - "rlp", + "hash-db", ] [[package]] @@ -7207,6 +7597,12 @@ dependencies = [ "serde", ] +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uint" version = "0.9.5" @@ -7219,6 +7615,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + [[package]] name = "uncased" version = "0.9.10" @@ -7252,9 +7654,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "unicode-width" @@ -7337,9 +7739,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" dependencies = [ "getrandom 0.4.2", "js-sys", @@ -7366,9 +7768,9 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "vsock" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b82aeb12ad864eb8cd26a6c21175d0bdc66d398584ee6c93c76964c3bcfc78ff" +checksum = "6ba782755fc073877e567c2253c0be48e4aa9a254c232d36d3985dfae0bd5205" dependencies = [ "libc", "nix 0.31.2", @@ -7453,9 +7855,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if 1.0.4", "once_cell", @@ -7466,23 +7868,19 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.64" +version = "0.4.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" +checksum = "03623de6905b7206edd0a75f69f747f134b7f0a2323392d664448bf2d3c5d87e" dependencies = [ - "cfg-if 1.0.4", - "futures-util", "js-sys", - "once_cell", "wasm-bindgen", - "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7490,9 +7888,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -7503,9 +7901,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -7531,12 +7929,12 @@ dependencies = [ [[package]] name = "wasm-encoder" -version = "0.245.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +checksum = "61fb705ce81adde29d2a8e99d87995e39a6e927358c91398f374474746070ef7" dependencies = [ "leb128fmt", - "wasmparser 0.245.1", + "wasmparser 0.246.2", ] [[package]] @@ -7546,7 +7944,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" dependencies = [ "anyhow", - "indexmap 2.13.0", + "indexmap 2.14.0", "wasm-encoder 0.244.0", "wasmparser 0.244.0", ] @@ -7600,7 +7998,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3189cc8a91f547390e2f043ca3b3e3fe0892f7d581767fd4e4b7f3dc3fe8e561" dependencies = [ "bitflags 2.11.0", - "indexmap 2.13.0", + "indexmap 2.14.0", ] [[package]] @@ -7611,19 +8009,19 @@ checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ "bitflags 2.11.0", "hashbrown 0.15.5", - "indexmap 2.13.0", - "semver", + "indexmap 2.14.0", + "semver 1.0.28", ] [[package]] name = "wasmparser" -version = "0.245.1" +version = "0.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +checksum = "71cde4757396defafd25417cfb36aa3161027d06d865b0c24baaae229aac005d" dependencies = [ "bitflags 2.11.0", - "indexmap 2.13.0", - "semver", + "indexmap 2.14.0", + "semver 1.0.28", ] [[package]] @@ -7639,31 +8037,31 @@ dependencies = [ [[package]] name = "wast" -version = "245.0.1" +version = "246.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cf1149285569120b8ce39db8b465e8a2b55c34cbb586bd977e43e2bc7300bf" +checksum = "fe3fe8e3bf88ad96d031b4181ddbd64634b17cb0d06dfc3de589ef43591a9a62" dependencies = [ "bumpalo", "leb128fmt", "memchr", "unicode-width", - "wasm-encoder 0.245.1", + "wasm-encoder 0.246.2", ] [[package]] name = "wat" -version = "1.245.1" +version = "1.246.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd48d1679b6858988cb96b154dda0ec5bbb09275b71db46057be37332d5477be" +checksum = "4bd7fda1199b94fff395c2d19a153f05dbe7807630316fa9673367666fd2ad8c" dependencies = [ "wast", ] [[package]] name = "web-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" +checksum = "cd70027e39b12f0849461e08ffc50b9cd7688d942c1c8e3c7b22273236b4dd0a" dependencies = [ "js-sys", "wasm-bindgen", @@ -7798,6 +8196,17 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + [[package]] name = "windows-result" version = "0.4.1" @@ -7825,15 +8234,6 @@ dependencies = [ "windows-targets 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -8058,13 +8458,12 @@ dependencies = [ ] [[package]] -name = "winreg" -version = "0.50.0" +name = "winnow" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ - "cfg-if 1.0.4", - "windows-sys 0.48.0", + "memchr", ] [[package]] @@ -8095,7 +8494,7 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck 0.5.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "prettyplease", "syn 2.0.117", "wasm-metadata", @@ -8126,7 +8525,7 @@ checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags 2.11.0", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", "serde", "serde_derive", @@ -8145,9 +8544,9 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.13.0", + "indexmap 2.14.0", "log", - "semver", + "semver 1.0.28", "serde", "serde_derive", "serde_json", @@ -8157,9 +8556,9 @@ dependencies = [ [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "wyz" @@ -8286,9 +8685,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -8297,9 +8696,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -8309,18 +8708,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -8329,18 +8728,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -8370,9 +8769,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -8381,9 +8780,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -8392,9 +8791,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/contract-sdk/specs/access/oas173/Cargo.lock b/contract-sdk/specs/access/oas173/Cargo.lock index 58ec43f16a5..e62ffd9999a 100644 --- a/contract-sdk/specs/access/oas173/Cargo.lock +++ b/contract-sdk/specs/access/oas173/Cargo.lock @@ -78,9 +78,9 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" dependencies = [ "rustversion", ] @@ -283,9 +283,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "shlex", @@ -373,9 +373,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -1046,9 +1046,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "hex" @@ -1085,9 +1085,9 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.59" +version = "0.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724607fd5cc535fceca960d7f684a1735c4e96c26b4e43986fe8ce798c2550e" +checksum = "4d6510a410acedd7a7683b3a45dafdc5ccf3c72d6addaa373497005964fc4e23" dependencies = [ "arbitrary", "lazy_static", @@ -1122,12 +1122,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1135,9 +1136,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1148,9 +1149,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1162,15 +1163,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1182,15 +1183,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1241,12 +1242,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", ] [[package]] @@ -1278,15 +1279,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ "once_cell", "wasm-bindgen", @@ -1332,9 +1333,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libloading" @@ -1360,9 +1361,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1486,9 +1487,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -1544,9 +1545,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -1842,9 +1843,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opaque-debug" @@ -2025,9 +2026,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2082,7 +2083,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.4+spec-1.1.0", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -2359,9 +2360,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -2897,9 +2898,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -2907,9 +2908,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.50.0" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", @@ -2924,9 +2925,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -2967,9 +2968,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -3001,23 +3002,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", - "toml_datetime 1.0.0+spec-1.1.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] @@ -3084,9 +3085,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" [[package]] name = "version_check" @@ -3112,9 +3113,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if 1.0.4", "once_cell", @@ -3125,9 +3126,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3135,9 +3136,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -3148,9 +3149,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -3369,11 +3370,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] + [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "x25519-dalek" @@ -3425,9 +3435,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3436,9 +3446,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -3448,18 +3458,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -3468,18 +3478,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -3509,9 +3519,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -3520,9 +3530,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -3531,9 +3541,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/contract-sdk/specs/token/oas20/Cargo.lock b/contract-sdk/specs/token/oas20/Cargo.lock index f418102db34..80b2f4ab74e 100644 --- a/contract-sdk/specs/token/oas20/Cargo.lock +++ b/contract-sdk/specs/token/oas20/Cargo.lock @@ -78,9 +78,9 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" dependencies = [ "rustversion", ] @@ -283,9 +283,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "shlex", @@ -373,9 +373,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -1046,9 +1046,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "hex" @@ -1085,9 +1085,9 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.59" +version = "0.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724607fd5cc535fceca960d7f684a1735c4e96c26b4e43986fe8ce798c2550e" +checksum = "4d6510a410acedd7a7683b3a45dafdc5ccf3c72d6addaa373497005964fc4e23" dependencies = [ "arbitrary", "lazy_static", @@ -1122,12 +1122,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1135,9 +1136,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1148,9 +1149,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1162,15 +1163,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1182,15 +1183,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1241,12 +1242,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", ] [[package]] @@ -1278,15 +1279,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ "once_cell", "wasm-bindgen", @@ -1332,9 +1333,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libloading" @@ -1360,9 +1361,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1486,9 +1487,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -1544,9 +1545,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -1843,9 +1844,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opaque-debug" @@ -2026,9 +2027,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2083,7 +2084,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.4+spec-1.1.0", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -2360,9 +2361,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -2898,9 +2899,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -2908,9 +2909,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.50.0" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", @@ -2925,9 +2926,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -2968,9 +2969,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -3002,23 +3003,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", - "toml_datetime 1.0.0+spec-1.1.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] @@ -3085,9 +3086,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" [[package]] name = "version_check" @@ -3113,9 +3114,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if 1.0.4", "once_cell", @@ -3126,9 +3127,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3136,9 +3137,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -3149,9 +3150,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -3370,11 +3371,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] + [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "x25519-dalek" @@ -3426,9 +3436,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3437,9 +3447,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -3449,18 +3459,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -3469,18 +3479,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -3510,9 +3520,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -3521,9 +3531,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -3532,9 +3542,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/examples/runtime-sdk/rofl-oracle-sgx/rust-toolchain.toml b/examples/runtime-sdk/rofl-oracle-sgx/rust-toolchain.toml index 238a4dc90de..7b53c4043af 100644 --- a/examples/runtime-sdk/rofl-oracle-sgx/rust-toolchain.toml +++ b/examples/runtime-sdk/rofl-oracle-sgx/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "nightly-2025-05-09" +channel = "nightly-2026-02-11" components = ["rustfmt", "clippy"] targets = ["x86_64-fortanix-unknown-sgx", "x86_64-unknown-linux-musl"] profile = "minimal" diff --git a/examples/runtime-sdk/rofl-oracle-tdx-raw/rust-toolchain.toml b/examples/runtime-sdk/rofl-oracle-tdx-raw/rust-toolchain.toml index bda58fa0d0a..42302566bbc 100644 --- a/examples/runtime-sdk/rofl-oracle-tdx-raw/rust-toolchain.toml +++ b/examples/runtime-sdk/rofl-oracle-tdx-raw/rust-toolchain.toml @@ -1,4 +1,4 @@ [toolchain] -channel = "nightly-2025-05-09" +channel = "nightly-2026-02-11" components = ["rustfmt", "clippy"] profile = "minimal" diff --git a/runtime-sdk-macros/src/evm_derive.rs b/runtime-sdk-macros/src/evm_derive.rs index 7dbfac33da9..1e7ae84b4fa 100644 --- a/runtime-sdk-macros/src/evm_derive.rs +++ b/runtime-sdk-macros/src/evm_derive.rs @@ -100,7 +100,7 @@ fn get_method(f: &ImplItemFn) -> Option<(Signature, EvmMethod, TokenStream)> { }, } } - if signature.convert && signature.args.len() != f.sig.inputs.len() - 1 { + if signature.convert && signature.args.len() != f.sig.inputs.len() - 2 { signature .name .span() @@ -136,9 +136,7 @@ fn generate_method_call(attr: &EvmMethod, sig: &Signature) -> Option Option return Some(Err(::evm::executor::stack::PrecompileFailure::Error { - exit_status: ::evm::ExitError::Other("invalid argument".into()), - })), + let decoded_args: #decode_type = match ::solabi::decode(&input[#SELECTOR_LENGTH..]) { + Err(e) => return Err(::evm::interpreter::ExitError::Exception(::evm::interpreter::ExitException::Other("invalid argument".into())).into()), Ok(tokens) => tokens, }; #(#arg_decls)* - Some(Self::#method_name(handle, #(#call_args),*)) + Self::#method_name(gasometer, handler, #(#call_args),*) } }) } @@ -213,15 +209,27 @@ pub fn derive_evm_contract(input: ItemImpl) -> TokenStream { } else { let method_name = sig.name.clone(); quote! { - &[#keccak] => Some(Self::#method_name(handle, #SELECTOR_LENGTH)), + &[#keccak] => Self::#method_name(gasometer, handler, #SELECTOR_LENGTH), } } }) .collect(); - let impl_generics = &input.generics; + let (impl_generics, _, _) = input.generics.split_for_impl(); + + // Add custom G and H type parameters for use in the PrecompileSet impl. + let mut extended_generics = input.generics.clone(); + extended_generics.params.push( + syn::parse_quote!(G: AsRef<::evm::interpreter::runtime::RuntimeState> + ::evm::GasMutState), + ); + extended_generics + .params + .push(syn::parse_quote!(H: ::evm::interpreter::runtime::RuntimeBackend)); + let (impl_generics_gh, _, _) = extended_generics.split_for_impl(); + let self_ty = input.self_ty.clone(); let evm_crate = evm_crate_path(); + quote! { #input @@ -231,62 +239,48 @@ pub fn derive_evm_contract(input: ItemImpl) -> TokenStream { Self::#address_fn() } - fn dispatch_call( - handle: &mut impl ::evm::executor::stack::PrecompileHandle, - ) -> Option> { - if handle.context().address != handle.code_address() { - return Some(Err(::evm::executor::stack::PrecompileFailure::Error { - exit_status: ::evm::ExitError::Other("invalid call".into()), - })); - } - let selector = match handle.input().get(..#SELECTOR_LENGTH) { + fn dispatch_call( + input: &[u8], + gasometer: &mut G, + handler: &mut H, + ) -> #evm_crate::precompile::PrecompileResult + where + G: AsRef<::evm::interpreter::runtime::RuntimeState> + ::evm::GasMutState, + H: ::evm::interpreter::runtime::RuntimeBackend, + { + let selector = match input.get(..#SELECTOR_LENGTH) { Some(slice) => slice, - None => return Some(Err(::evm::executor::stack::PrecompileFailure::Revert { - exit_status: ::evm::ExitRevert::Reverted, - output: vec![], - })), + None => return Err(::evm::interpreter::ExitError::Reverted.into()), }; match selector { #(#method_arms)* - _ => Some(Err(::evm::executor::stack::PrecompileFailure::Revert { - exit_status: ::evm::ExitRevert::Reverted, - output: vec![], - })), + _ => Err(::evm::interpreter::ExitError::Reverted.into()), } } } #[automatically_derived] - impl #impl_generics ::evm::executor::stack::PrecompileSet for #self_ty { - fn execute(&self, handle: &mut impl ::evm::executor::stack::PrecompileHandle) -> Option> { - match self.is_precompile(handle.code_address(), handle.remaining_gas()) { - ::evm::executor::stack::IsPrecompileResult::Answer { - is_precompile: true, - extra_cost, - } => { - if let Err(e) = handle.record_cost(extra_cost) { - return Some(Err(e.into())); - } - } - ::evm::executor::stack::IsPrecompileResult::OutOfGas => { - return Some(Err(::evm::ExitError::OutOfGas.into())); - } - _ => { - return None; - } + impl #impl_generics_gh ::evm::standard::PrecompileSet for #self_ty { + fn execute( + &self, + code_address: H160, + input: &[u8], + gasometer: &mut G, + handler: &mut H, + ) -> Option<(::evm::interpreter::ExitResult, Vec)> { + if code_address != Self::address() { + return None; } - ::dispatch_call(handle) - } + let result = ::dispatch_call( + input, + gasometer, + handler, + ); - fn is_precompile( - &self, - address: ::primitive_types::H160, - _remaining_gas: u64, - ) -> ::evm::executor::stack::IsPrecompileResult { - ::evm::executor::stack::IsPrecompileResult::Answer { - is_precompile: Self::address() == address, - extra_cost: 0, + match result { + Ok(success) => Some((success.status.into(), success.output)), + Err(err) => Some((err.error.into(), err.output)), } } } @@ -372,14 +366,26 @@ pub fn derive_evm_event(input: DeriveInput) -> TokenStream { #[automatically_derived] #[allow(clippy::cloned_ref_to_slice_refs)] impl #evm_crate::precompile::contract::EvmEvent for #event_ty { - fn emit(&self, handle: &mut impl ::evm::executor::stack::PrecompileHandle) -> Result<(), ::evm::ExitError> { + fn emit( + &self, + handler: &mut H, + ) -> Result<(), #evm_crate::precompile::PrecompileError> + where + C: #evm_crate::precompile::contract::StaticContract, + H: ::evm::interpreter::runtime::RuntimeBackend, + { let address = C::address(); let topics = vec![ ::primitive_types::H256::from_slice(&[#(#signature_tokens ,)*]), #(#topics ,)* ]; let data = #data_tokens; - handle.log(address, topics, data) + handler.log(::evm::interpreter::runtime::Log { + address, + topics, + data, + })?; + Ok(()) } } } @@ -405,6 +411,8 @@ pub fn derive_evm_error(input: DeriveInput) -> TokenStream { Err(e) => return e.write_errors(), }; + let evm_crate = evm_crate_path(); + let mut variant_encoders: Vec = Vec::new(); for variant in error.data.as_ref().take_enum().unwrap().iter() { let ident = &variant.ident; @@ -458,21 +466,20 @@ pub fn derive_evm_error(input: DeriveInput) -> TokenStream { let mut output = Vec::new(); output.extend(&[#(#hash_bytes,)*]); #encode_expr - ::evm::executor::stack::PrecompileFailure::Revert { - exit_status: ::evm::ExitRevert::Reverted, + #evm_crate::precompile::PrecompileError::new( + ::evm::interpreter::ExitError::Reverted, output, - } + ) } }); } - let evm_crate = evm_crate_path(); let error_ty = &error.ident; quote! { #[automatically_derived] impl #evm_crate::precompile::contract::EvmError for #error_ty { - fn encode(&self) -> ::evm::executor::stack::PrecompileFailure { + fn encode(&self) -> #evm_crate::precompile::PrecompileError { match self { #(#variant_encoders)* } diff --git a/runtime-sdk/modules/evm/Cargo.toml b/runtime-sdk/modules/evm/Cargo.toml index 1e7cf89096b..5ef768c5069 100644 --- a/runtime-sdk/modules/evm/Cargo.toml +++ b/runtime-sdk/modules/evm/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "oasis-runtime-sdk-evm" description = "EVM module for the Oasis Runtime SDK." -version = "0.6.0" +version = "0.7.0" authors = ["Oasis Protocol Foundation "] -edition = "2021" +edition = "2024" license = "Apache-2.0" [dependencies] @@ -32,7 +32,8 @@ rand_core = { version = "0.6.4", default-features = false } solabi = "0.3.0" ethabi = { version = "18.0.0", default-features = false, features = ["std"] } ethereum = "0.15" -evm = { git = "https://github.com/oasisprotocol/evm", tag = "v0.39.1-oasis" } +evm = "1.1.1" +evm-precompile = "1.0.1" fixed-hash = "0.8.0" primitive-types = { version = "0.12", default-features = false, features = ["rlp", "num-traits"] } rlp = "0.5.2" @@ -69,13 +70,3 @@ required-features = ["test"] name = "fuzz-precompile-corpus" path = "fuzz/precompile_corpus.rs" required-features = ["test"] - -[[bin]] -name = "fuzz-precompile-contract-dispatch" -path = "fuzz/precompile_contract_dispatch.rs" -required-features = ["test"] - -[[bin]] -name = "fuzz-precompile-contract-dispatch-corpus" -path = "fuzz/precompile_contract_dispatch_corpus.rs" -required-features = ["test"] diff --git a/runtime-sdk/modules/evm/fuzz/precompile.rs b/runtime-sdk/modules/evm/fuzz/precompile.rs index d25aed00f8a..07087afc273 100644 --- a/runtime-sdk/modules/evm/fuzz/precompile.rs +++ b/runtime-sdk/modules/evm/fuzz/precompile.rs @@ -16,7 +16,7 @@ fn main() { address[19] = data[2] % 11; let data = &data[3..]; - call_contract(address.into(), data, 1_000_000); + let _ = call_contract(address.into(), data, 1_000_000); }); } } diff --git a/runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch.rs b/runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch.rs deleted file mode 100644 index a1dd0f82e19..00000000000 --- a/runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch.rs +++ /dev/null @@ -1,127 +0,0 @@ -use honggfuzz::fuzz; - -use evm::{ - executor::stack::{PrecompileFailure, PrecompileHandle, PrecompileOutput}, - Context, ExitError, ExitReason, ExitSucceed, Transfer, -}; -use primitive_types::{H160, H256}; - -use oasis_runtime_sdk_evm::{ - self, // proc-macros need this for name resolution. - precompile::contract::StaticContract, -}; -use oasis_runtime_sdk_macros::{evm_contract_address, evm_method, sdk_derive}; - -// We only need this to provide call data for the dispatcher to munch on. -struct MockPrecompileHandle<'a> { - input: &'a [u8], -} - -impl PrecompileHandle for MockPrecompileHandle<'_> { - fn call( - &mut self, - _to: H160, - _transfer: Option, - _input: Vec, - _gas_limit: Option, - _is_static: bool, - _context: &Context, - ) -> (ExitReason, Vec) { - unimplemented!() - } - - fn record_cost(&mut self, _cost: u64) -> Result<(), ExitError> { - unimplemented!() - } - - fn remaining_gas(&self) -> u64 { - unimplemented!() - } - - fn log(&mut self, _address: H160, _topics: Vec, _data: Vec) -> Result<(), ExitError> { - unimplemented!() - } - - fn code_address(&self) -> H160 { - unimplemented!() - } - - fn input(&self) -> &[u8] { - self.input - } - - fn context(&self) -> &Context { - unimplemented!() - } - - fn is_static(&self) -> bool { - unimplemented!() - } - - fn gas_limit(&self) -> Option { - unimplemented!() - } - - fn record_external_cost( - &mut self, - _ref_time: Option, - _proof_size: Option, - _storage_growth: Option, - ) -> Result<(), ExitError> { - unimplemented!() - } - - fn refund_external_cost(&mut self, _ref_time: Option, _proof_size: Option) { - unimplemented!() - } - - fn used_gas(&self) -> u64 { - unimplemented!() - } -} - -#[derive(Default)] -struct Contract {} - -#[sdk_derive(EvmContract)] -impl Contract { - #[evm_contract_address] - fn address() -> H160 { - H160::zero() - } - - // selector: 222b1407 - #[evm_method(signature = "direct()")] - fn direct( - _handle: &mut impl PrecompileHandle, - _input_offset: usize, - ) -> Result { - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }) - } - - // selector d52bce59 - #[evm_method(signature = "arg(address,uint256)", convert)] - fn arg( - _handle: &mut impl PrecompileHandle, - _address: H160, - _value: u128, - ) -> Result { - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }) - } -} - -fn main() { - loop { - fuzz!(|data: &[u8]| { - let mut precompile_handle = MockPrecompileHandle { input: data }; - - ::dispatch_call(&mut precompile_handle); - }); - } -} diff --git a/runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch_corpus.rs b/runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch_corpus.rs deleted file mode 100644 index 3757fb68d09..00000000000 --- a/runtime-sdk/modules/evm/fuzz/precompile_contract_dispatch_corpus.rs +++ /dev/null @@ -1,45 +0,0 @@ -#![allow(unexpected_cfgs)] -use std::{fs, path}; - -#[cfg(fuzzing)] -use honggfuzz::fuzz; - -use primitive_types::H160; - -fn gen_calldata() -> Box>> { - // Method selectors. - let direct = &[0x22, 0x2b, 0x14, 0x07]; - let arg = &[0xd5, 0x2b, 0xce, 0x59]; - - let mut arg_input = arg.to_vec(); - arg_input.append(&mut solabi::encode(&( - solabi::Address(H160::zero().into()), - solabi::U256::from(42_u128), - ))); - - Box::new(vec![direct.to_vec(), arg_input].into_iter()) -} - -fn main() { - #[cfg(fuzzing)] - println!( - r#"This produces fuzzing data, it's not meant to be fuzzed itself. -Run the regular build of this tool."# - ); - - let output_dir = path::Path::new("hfuzz_workspace/fuzz-precompile-contract-dispatch/input"); - fs::create_dir_all(output_dir).expect("failed to create output directory"); - - for (idx, case) in gen_calldata().enumerate() { - fs::write(output_dir.join(format!("basic_{idx}")), case) - .expect("failed to write input file"); - } - - // In case the file is being compiled by `cargo hfuzz build`, - // pull in the crate so it doesn't die with an unreadable error - // about missing coverage instrumentation symbols. - #[cfg(fuzzing)] - fuzz!(|data: &[u8]| { - std::hint::black_box(data); - }); -} diff --git a/runtime-sdk/modules/evm/fuzz/precompile_corpus.rs b/runtime-sdk/modules/evm/fuzz/precompile_corpus.rs index 4c8a3a8804e..274a40cfb45 100644 --- a/runtime-sdk/modules/evm/fuzz/precompile_corpus.rs +++ b/runtime-sdk/modules/evm/fuzz/precompile_corpus.rs @@ -4,16 +4,6 @@ use std::{fs, path}; #[cfg(fuzzing)] use honggfuzz::fuzz; -use oasis_runtime_sdk_evm::precompile::testing::read_test_cases; - -fn gen_test_vectors(fixture: &str) -> Box>> { - Box::new( - read_test_cases(fixture) - .into_iter() - .map(|case| hex::decode(case.input).unwrap()), - ) -} - fn gen_x25519() -> Box>> { let key = b"this must be the excelentest key"; let nonce = b"complete noncence, and too long."; @@ -72,10 +62,6 @@ Run the regular build of this tool."# ); let precompiles = vec![ - (0, 0, 5, gen_test_vectors("modexp_eip2565")), - (0, 0, 6, gen_test_vectors("bn256Add")), - (0, 0, 7, gen_test_vectors("bn256ScalarMul")), - (0, 0, 8, gen_test_vectors("bn256Pairing")), (1, 0, 1, gen_random_bytes()), (1, 0, 3, gen_x25519()), (1, 0, 4, gen_x25519()), diff --git a/runtime-sdk/modules/evm/src/backend.rs b/runtime-sdk/modules/evm/src/backend.rs deleted file mode 100644 index d356e7ce66b..00000000000 --- a/runtime-sdk/modules/evm/src/backend.rs +++ /dev/null @@ -1,543 +0,0 @@ -use std::{ - collections::{btree_map::Entry, BTreeMap, BTreeSet}, - marker::PhantomData, - mem, -}; - -use evm::{ - backend::{Backend, Basic, Log}, - executor::stack::{Accessed, StackState, StackSubstateMetadata}, - ExitError, Transfer, -}; -use primitive_types::{H160, H256, U256}; - -use oasis_runtime_sdk::{ - context::Context, - core::common::crypto::hash::Hash, - modules::{ - accounts::API as _, - core::{self, API as _}, - }, - state::CurrentState, - subcall, - types::token, - Runtime, -}; - -use crate::{state, types, Config}; - -/// The maximum number of bytes that may be generated by one invocation of -/// [`EVMBackendExt::random_bytes`]. -/// -/// The precompile function also limits the number of bytes returned, but it's here, too, to prevent -/// accidental memory overconsumption. -/// -/// This constant might make a good config param, if anyone asks or this changes frequently. -pub(crate) const RNG_MAX_BYTES: u64 = 1024; - -/// Information required by the evm crate. -#[derive(Clone, Default, PartialEq, Eq)] -pub struct Vicinity { - pub gas_price: U256, - pub origin: H160, -} - -/// Backend for the evm crate that enables the use of our storage. -pub struct OasisBackend<'ctx, C: Context, Cfg: Config> { - vicinity: Vicinity, - ctx: &'ctx C, - _cfg: PhantomData, -} - -impl<'ctx, C: Context, Cfg: Config> OasisBackend<'ctx, C, Cfg> { - pub fn new(ctx: &'ctx C, vicinity: Vicinity) -> Self { - Self { - vicinity, - ctx, - _cfg: PhantomData, - } - } -} - -/// An extension trait implemented for any [`Backend`]. -pub(crate) trait EVMBackendExt { - /// Returns at most `num_bytes` bytes of cryptographically secure random bytes. - /// The optional personalization string may be included to increase domain separation. - fn random_bytes(&self, num_bytes: u64, pers: &[u8]) -> Vec; - - /// Perform a subcall. - fn subcall( - &self, - info: subcall::SubcallInfo, - validator: V, - ) -> Result; -} - -impl EVMBackendExt for &T { - fn random_bytes(&self, num_bytes: u64, pers: &[u8]) -> Vec { - (*self).random_bytes(num_bytes, pers) - } - - fn subcall( - &self, - info: subcall::SubcallInfo, - validator: V, - ) -> Result { - (*self).subcall(info, validator) - } -} - -impl EVMBackendExt for OasisBackend<'_, C, Cfg> { - fn random_bytes(&self, num_bytes: u64, pers: &[u8]) -> Vec { - // Refuse to generate more than 1 KiB in one go. - // EVM memory gas is checked only before and after calls, so we won't - // see the quadratic memory cost until after this call uses its time. - let num_bytes = num_bytes.min(RNG_MAX_BYTES) as usize; - let mut rand_bytes = vec![0u8; num_bytes]; - CurrentState::with(|state| { - let mut rng = state - .rng() - .fork(self.ctx, pers) - .expect("unable to access RNG"); - rand_core::RngCore::try_fill_bytes(&mut rng, &mut rand_bytes) - .expect("RNG is inoperable"); - }); - - rand_bytes - } - - fn subcall( - &self, - info: subcall::SubcallInfo, - validator: V, - ) -> Result { - subcall::call(self.ctx, info, validator) - } -} - -/// Oasis-specific substate implementation for the EVM stack executor. -/// -/// The substate is used to track nested transactional state that can be either be committed or -/// reverted. This is similar to `State` in the SDK. -/// -/// See the `evm` crate for details. -struct OasisStackSubstate<'config> { - metadata: StackSubstateMetadata<'config>, - parent: Option>>, - logs: Vec, - deletes: BTreeSet, - origin_nonce_incremented: bool, -} - -impl<'config> OasisStackSubstate<'config> { - fn new(metadata: StackSubstateMetadata<'config>) -> Self { - Self { - metadata, - parent: None, - logs: Vec::new(), - deletes: BTreeSet::new(), - origin_nonce_incremented: false, - } - } - - fn metadata(&self) -> &StackSubstateMetadata<'config> { - &self.metadata - } - - fn metadata_mut(&mut self) -> &mut StackSubstateMetadata<'config> { - &mut self.metadata - } - - fn enter(&mut self, gas_limit: u64, is_static: bool) { - let mut entering = Self { - metadata: self.metadata.spit_child(gas_limit, is_static), - parent: None, - logs: Vec::new(), - deletes: BTreeSet::new(), - origin_nonce_incremented: false, - }; - mem::swap(&mut entering, self); - - self.parent = Some(Box::new(entering)); - } - - fn exit_commit(&mut self) -> Result<(), ExitError> { - let mut exited = *self.parent.take().expect("Cannot commit on root substate"); - mem::swap(&mut exited, self); - - self.metadata.swallow_commit(exited.metadata)?; - self.logs.append(&mut exited.logs); - self.deletes.append(&mut exited.deletes); - self.origin_nonce_incremented |= exited.origin_nonce_incremented; - - Ok(()) - } - - fn exit_revert(&mut self) -> Result<(), ExitError> { - let mut exited = *self.parent.take().expect("Cannot revert on root substate"); - mem::swap(&mut exited, self); - - self.metadata.swallow_revert(exited.metadata) - } - - fn exit_discard(&mut self) -> Result<(), ExitError> { - let mut exited = *self.parent.take().expect("Cannot discard on root substate"); - mem::swap(&mut exited, self); - - self.metadata.swallow_discard(exited.metadata) - } - - fn recursive_is_cold bool>(&self, f: &F) -> bool { - let local_is_accessed = self.metadata.accessed().as_ref().map(f).unwrap_or(false); - if local_is_accessed { - false - } else { - self.parent - .as_ref() - .map(|p| p.recursive_is_cold(f)) - .unwrap_or(true) - } - } - - fn deleted(&self, address: H160) -> bool { - if self.deletes.contains(&address) { - return true; - } - - if let Some(parent) = self.parent.as_ref() { - return parent.deleted(address); - } - - false - } - - fn log(&mut self, address: H160, topics: Vec, data: Vec) { - self.logs.push(Log { - address, - topics, - data, - }); - } - - fn set_deleted(&mut self, address: H160) { - self.deletes.insert(address); - } -} - -/// Oasis-specific state implementation for the EVM stack executor. -/// -/// The state maintains a hierarchy of nested transactional states (through [`OasisStackSubstate`]) -/// and exposes it through accessors to the EVM stack executor. -/// -/// See the `evm` crate for details. -pub struct OasisStackState<'ctx, 'backend, 'config, C: Context, Cfg: Config> { - backend: &'backend OasisBackend<'ctx, C, Cfg>, - substate: OasisStackSubstate<'config>, - original_storage: BTreeMap<(types::H160, types::H256), types::H256>, -} - -impl<'ctx, 'backend, 'config, C: Context, Cfg: Config> - OasisStackState<'ctx, 'backend, 'config, C, Cfg> -{ - /// Create a new Oasis-specific state for the EVM stack executor. - pub fn new( - metadata: StackSubstateMetadata<'config>, - backend: &'backend OasisBackend<'ctx, C, Cfg>, - ) -> Self { - Self { - backend, - substate: OasisStackSubstate::new(metadata), - original_storage: BTreeMap::new(), - } - } - - /// Applies any final state by emitting SDK events/messages. - /// - /// Note that storage has already been committed to the top-level current store. - pub fn apply(self) -> Result<(), crate::Error> { - // Abort if SELFDESTRUCT was used. - if !self.substate.deletes.is_empty() { - return Err(crate::Error::ExecutionFailed( - "SELFDESTRUCT not supported".to_owned(), - )); - } - - // Emit logs as events. - CurrentState::with(|state| { - for log in self.substate.logs { - state.emit_event(crate::Event::Log { - address: log.address.into(), - topics: log.topics.iter().map(|&topic| topic.into()).collect(), - data: log.data, - }); - } - }); - - Ok(()) - } -} - -impl Backend for OasisStackState<'_, '_, '_, C, Cfg> { - fn gas_price(&self) -> U256 { - self.backend.vicinity.gas_price - } - - fn origin(&self) -> H160 { - self.backend.vicinity.origin - } - - fn block_hash(&self, number: U256) -> H256 { - CurrentState::with_store(|store| { - let block_hashes = state::block_hashes(store); - - if let Some(hash) = block_hashes.get::<_, Hash>(&number.low_u64().to_be_bytes()) { - H256::from_slice(hash.as_ref()) - } else { - H256::default() - } - }) - } - - fn block_number(&self) -> U256 { - self.backend.ctx.runtime_header().round.into() - } - - fn block_coinbase(&self) -> H160 { - // Does not make sense in runtime context. - H160::default() - } - - fn block_timestamp(&self) -> U256 { - self.backend.ctx.runtime_header().timestamp.into() - } - - fn block_difficulty(&self) -> U256 { - // Does not make sense in runtime context. - U256::zero() - } - - fn block_randomness(&self) -> Option { - None - } - - fn block_gas_limit(&self) -> U256 { - ::Core::max_batch_gas().into() - } - - fn block_base_fee_per_gas(&self) -> U256 { - ::Core::min_gas_price(&Cfg::TOKEN_DENOMINATION) - .unwrap_or_default() - .into() - } - - fn chain_id(&self) -> U256 { - Cfg::CHAIN_ID.into() - } - - fn exists(&self, address: H160) -> bool { - let acct = self.basic(address); - - !(acct.nonce == U256::zero() && acct.balance == U256::zero()) - } - - fn basic(&self, address: H160) -> Basic { - // Derive SDK account address from the Ethereum address. - let sdk_address = Cfg::map_address(address); - // Fetch balance and nonce from SDK accounts. Note that these can never fail. - let balance = - ::Accounts::get_balance(sdk_address, Cfg::TOKEN_DENOMINATION) - .unwrap(); - let mut nonce = ::Accounts::get_nonce(sdk_address).unwrap(); - - // If this is the caller's address, the caller nonce has not yet been incremented based on - // the EVM semantics and this is not a simulation context, return the nonce decremented by - // one to cancel out the SDK nonce changes. - if address == self.origin() - && !self.substate.origin_nonce_incremented - && !CurrentState::with_env(|env| env.is_simulation()) - { - nonce = nonce.saturating_sub(1); - } - - Basic { - nonce: nonce.into(), - balance: balance.into(), - } - } - - fn code(&self, address: H160) -> Vec { - CurrentState::with_store(|store| { - let store = state::codes(store); - store.get(address).unwrap_or_default() - }) - } - - fn storage(&self, address: H160, key: H256) -> H256 { - let address: types::H160 = address.into(); - let key: types::H256 = key.into(); - - let res: types::H256 = - state::with_storage::(self.backend.ctx, &address, |store| { - store.get(key).unwrap_or_default() - }); - res.into() - } - - fn original_storage(&self, address: H160, key: H256) -> Option { - Some( - self.original_storage - .get(&(address.into(), key.into())) - .cloned() - .map(Into::into) - .unwrap_or_else(|| self.storage(address, key)), - ) - } -} - -impl<'config, C: Context, Cfg: Config> StackState<'config> - for OasisStackState<'_, '_, 'config, C, Cfg> -{ - fn metadata(&self) -> &StackSubstateMetadata<'config> { - self.substate.metadata() - } - - fn metadata_mut(&mut self) -> &mut StackSubstateMetadata<'config> { - self.substate.metadata_mut() - } - - fn enter(&mut self, gas_limit: u64, is_static: bool) { - self.substate.enter(gas_limit, is_static); - - CurrentState::start_transaction(); - } - - fn exit_commit(&mut self) -> Result<(), ExitError> { - self.substate.exit_commit()?; - - CurrentState::commit_transaction(); - - Ok(()) - } - - fn exit_revert(&mut self) -> Result<(), ExitError> { - self.substate.exit_revert()?; - - CurrentState::rollback_transaction(); - - Ok(()) - } - - fn exit_discard(&mut self) -> Result<(), ExitError> { - self.substate.exit_discard()?; - - CurrentState::rollback_transaction(); - - Ok(()) - } - - fn is_empty(&self, address: H160) -> bool { - self.basic(address).balance == U256::zero() - && self.basic(address).nonce == U256::zero() - && self.code(address).len() == 0 - } - - fn deleted(&self, address: H160) -> bool { - self.substate.deleted(address) - } - - fn is_cold(&self, address: H160) -> bool { - self.substate - .recursive_is_cold(&|a| a.accessed_addresses.contains(&address)) - } - - fn is_storage_cold(&self, address: H160, key: H256) -> bool { - self.substate - .recursive_is_cold(&|a: &Accessed| a.accessed_storage.contains(&(address, key))) - } - - fn inc_nonce(&mut self, address: H160) -> Result<(), ExitError> { - // Do not increment the origin nonce as that has already been handled by the SDK. But do - // record that the nonce should be incremented based on EVM semantics so we can adjust any - // results from the `basic` method. - if address == self.origin() && !CurrentState::with_env(|env| env.is_simulation()) { - self.substate.origin_nonce_incremented = true; - return Ok(()); - } - - let address = Cfg::map_address(address); - ::Accounts::inc_nonce(address); - Ok(()) - } - - fn set_storage(&mut self, address: H160, key: H256, value: H256) { - let address: types::H160 = address.into(); - let key: types::H256 = key.into(); - let value: types::H256 = value.into(); - - // We cache the current value if this is the first time we modify it in the transaction. - if let Entry::Vacant(e) = self.original_storage.entry((address, key)) { - let original = - state::with_storage::(self.backend.ctx, &address, |store| { - store.get(key).unwrap_or_default() - }); - // No need to cache if same value. - if original != value { - e.insert(original); - } - } - - if value == types::H256::default() { - state::with_storage::(self.backend.ctx, &address, |store| { - store.remove(key); - }); - } else { - state::with_storage::(self.backend.ctx, &address, |store| { - store.insert(key, value); - }); - } - } - - fn reset_storage(&mut self, _address: H160) { - // Reset storage is ignored since storage cannot be efficiently reset as this would require - // iterating over all of the storage keys. This is fine as reset_storage is only ever called - // on non-empty storage when doing SELFDESTRUCT, which we don't support. - } - - fn log(&mut self, address: H160, topics: Vec, data: Vec) { - self.substate.log(address, topics, data); - } - - fn set_deleted(&mut self, address: H160) { - // Note that we will abort during apply if SELFDESTRUCT was used. - self.substate.set_deleted(address) - } - - fn set_code(&mut self, address: H160, code: Vec) { - CurrentState::with_store(|store| { - let mut store = state::codes(store); - store.insert(address, code); - }); - } - - fn transfer(&mut self, transfer: Transfer) -> Result<(), ExitError> { - let from = Cfg::map_address(transfer.source); - let to = Cfg::map_address(transfer.target); - let amount = transfer - .value - .try_into() - .map_err(|_| ExitError::OutOfFund)?; - let amount = token::BaseUnits::new(amount, Cfg::TOKEN_DENOMINATION); - - ::Accounts::transfer(from, to, &amount) - .map_err(|_| ExitError::OutOfFund) - } - - fn reset_balance(&mut self, _address: H160) { - // Reset balance is ignored since it exists due to a bug in SELFDESTRUCT, which we - // don't support. - } - - fn touch(&mut self, _address: H160) { - // Do not do anything. - } -} diff --git a/runtime-sdk/modules/evm/src/engine/backend.rs b/runtime-sdk/modules/evm/src/engine/backend.rs new file mode 100644 index 00000000000..669a50ebecf --- /dev/null +++ b/runtime-sdk/modules/evm/src/engine/backend.rs @@ -0,0 +1,520 @@ +use std::{ + collections::{btree_map::Entry, BTreeMap, BTreeSet}, + marker::PhantomData, + mem, +}; + +use primitive_types::{H160, H256, U256}; +use sha3::{Digest as _, Keccak256}; + +use oasis_runtime_sdk::{ + context::Context, + core::common::crypto::hash::Hash, + modules::{accounts::API as _, core::API as _}, + state::CurrentState, + types::token, + Runtime, +}; + +use crate::{state, types, Config, Error}; + +/// Backend for the evm crate that enables the use of our storage. +pub struct OasisBackend<'ctx, C: Context, Cfg: Config> { + caller: H160, + ctx: &'ctx C, + substate: Box, + original_storage: BTreeMap<(types::H160, types::H256), types::H256>, + _cfg: PhantomData, +} + +impl<'ctx, C: Context, Cfg: Config> OasisBackend<'ctx, C, Cfg> { + pub fn new(ctx: &'ctx C, caller: H160) -> Self { + Self { + caller, + ctx, + substate: Box::new(Substate::new()), + original_storage: BTreeMap::new(), + _cfg: PhantomData, + } + } + + pub fn apply(self) -> Result<(), Error> { + // Detect use of SELFDESTRUCT and return an error in this case. + if !self.substate.deletes.is_empty() { + return Err(Error::ExecutionFailed( + "SELFDESTRUCT not supported".to_owned(), + )); + } + + // Emit logs as events. + CurrentState::with(|state| { + for log in self.substate.logs { + state.emit_event(crate::Event::Log { + address: log.address.into(), + topics: log.topics.iter().map(|&topic| topic.into()).collect(), + data: log.data, + }); + } + }); + + Ok(()) + } +} + +impl<'ctx, C: Context, Cfg: Config> evm::backend::RuntimeEnvironment + for OasisBackend<'ctx, C, Cfg> +{ + fn block_hash(&self, number: U256) -> H256 { + CurrentState::with_store(|store| { + let block_hashes = state::block_hashes(store); + + if let Some(hash) = block_hashes.get::<_, Hash>(&number.low_u64().to_be_bytes()) { + H256::from_slice(hash.as_ref()) + } else { + H256::default() + } + }) + } + + fn block_number(&self) -> U256 { + self.ctx.runtime_header().round.into() + } + + fn block_coinbase(&self) -> H160 { + // Does not make sense in runtime context. + H160::default() + } + + fn block_timestamp(&self) -> U256 { + self.ctx.runtime_header().timestamp.into() + } + + fn block_difficulty(&self) -> U256 { + // Does not make sense in runtime context. + U256::zero() + } + + fn block_randomness(&self) -> Option { + // TODO: Could use our VRF. + None + } + + fn block_gas_limit(&self) -> U256 { + ::Core::max_batch_gas().into() + } + + fn block_base_fee_per_gas(&self) -> U256 { + ::Core::min_gas_price(&Cfg::TOKEN_DENOMINATION) + .unwrap_or_default() + .into() + } + + fn blob_base_fee_per_gas(&self) -> U256 { + // Does not make sense in runtime context. + U256::zero() + } + + fn blob_versioned_hash(&self, _index: U256) -> H256 { + // Does not make sense in runtime context. + H256::default() + } + + fn chain_id(&self) -> U256 { + Cfg::CHAIN_ID.into() + } +} + +impl<'ctx, C: Context, Cfg: Config> evm::backend::RuntimeBaseBackend + for OasisBackend<'ctx, C, Cfg> +{ + fn balance(&self, address: H160) -> U256 { + // Derive SDK account address from the Ethereum address. + let sdk_address = Cfg::map_address(address); + // Fetch balance from SDK accounts. Note that this can never fail. + let balance = + ::Accounts::get_balance(sdk_address, Cfg::TOKEN_DENOMINATION) + .unwrap(); + + balance.into() + } + + fn code(&self, address: H160) -> Vec { + CurrentState::with_store(|store| { + let store = state::codes(store); + store.get(address).unwrap_or_default() + }) + } + + fn code_hash(&self, address: H160) -> H256 { + if self.exists(address) { + H256::from_slice(&Keccak256::digest(&self.code(address)[..])) + } else { + H256::default() + } + } + + fn storage(&self, address: H160, index: H256) -> H256 { + let address: types::H160 = address.into(); + let index: types::H256 = index.into(); + + let res: types::H256 = state::with_storage::(self.ctx, &address, |store| { + store.get(index).unwrap_or_default() + }); + res.into() + } + + fn transient_storage(&self, address: H160, index: H256) -> H256 { + // TODO: Is this ok? + self.substate + .known_transient_storage(address, index) + .unwrap_or_default() + } + + fn exists(&self, address: H160) -> bool { + let is_empty = self.balance(address) == U256::zero() + && self.nonce(address) == U256::zero() + && self.code_size(address) == U256::zero(); + !is_empty + } + + fn nonce(&self, address: H160) -> U256 { + // Derive SDK account address from the Ethereum address. + let sdk_address = Cfg::map_address(address); + // Fetch nonce from SDK accounts. Note that this can never fail. + let mut nonce = ::Accounts::get_nonce(sdk_address).unwrap(); + + // If this is the caller's address, the caller nonce has not yet been incremented based on + // the EVM semantics and this is not a simulation context, return the nonce decremented by + // one to cancel out the SDK nonce changes. + if address == self.caller + && !self.substate.origin_nonce_incremented + && !CurrentState::with_env(|env| env.is_simulation()) + { + nonce = nonce.saturating_sub(1); + } + + nonce.into() + } + + fn can_create(&self, address: H160) -> bool { + self.nonce(address) == U256::zero() && self.code_size(address) == U256::zero() + } +} + +impl<'ctx, C: Context, Cfg: Config> evm::backend::RuntimeBackend for OasisBackend<'ctx, C, Cfg> { + fn original_storage(&self, address: H160, index: H256) -> H256 { + if let Some(value) = self.substate.known_original_storage(address, index) { + value + } else { + use evm::backend::RuntimeBaseBackend; + + self.original_storage + .get(&(address.into(), index.into())) + .cloned() + .map(Into::into) + .unwrap_or_else(|| self.storage(address, index)) + } + } + + fn created(&self, address: H160) -> bool { + self.substate.created(address) + } + + fn deleted(&self, address: H160) -> bool { + self.substate.deleted(address) + } + + fn is_cold(&self, address: H160, index: Option) -> bool { + let accessed = self + .substate + .known_accessed((address, index)) + .unwrap_or(false); + !accessed + } + + fn mark_hot(&mut self, address: H160, kind: evm::interpreter::runtime::TouchKind) { + use evm::interpreter::runtime::TouchKind; + + match kind { + TouchKind::Access => { + self.substate.accessed.insert((address, None)); + } + TouchKind::StateChange | TouchKind::Coinbase => { + self.substate.touched.insert(address); + } + } + } + + fn mark_storage_hot(&mut self, address: H160, index: H256) { + self.substate.accessed.insert((address, Some(index))); + } + + fn set_storage( + &mut self, + address: H160, + index: H256, + value: H256, + ) -> Result<(), evm::interpreter::ExitError> { + let address: types::H160 = address.into(); + let index: types::H256 = index.into(); + let value: types::H256 = value.into(); + + // We cache the current value if this is the first time we modify it in the transaction. + // TODO + if let Entry::Vacant(e) = self.original_storage.entry((address, index)) { + let original = state::with_storage::(self.ctx, &address, |store| { + store.get(index).unwrap_or_default() + }); + // No need to cache if same value. + if original != value { + e.insert(original); + } + } + + state::with_storage::(self.ctx, &address, |store| { + if value == types::H256::default() { + store.remove(index); + } else { + store.insert(index, value); + } + }); + + Ok(()) + } + + fn set_transient_storage( + &mut self, + address: H160, + index: H256, + value: H256, + ) -> Result<(), evm::interpreter::ExitError> { + self.substate + .transient_storage + .insert((address, index), value); + Ok(()) + } + + fn log( + &mut self, + log: evm::interpreter::runtime::Log, + ) -> Result<(), evm::interpreter::ExitError> { + self.substate.logs.push(log); + Ok(()) + } + + fn mark_delete_reset(&mut self, address: H160) { + self.substate.deletes.insert(address); + } + + fn mark_create(&mut self, address: H160) { + self.substate.creates.insert(address); + } + + fn reset_storage(&mut self, address: H160) { + self.substate.storage_resets.insert(address); + } + + fn set_code( + &mut self, + address: H160, + code: Vec, + _origin: evm::interpreter::runtime::SetCodeOrigin, + ) -> Result<(), evm::interpreter::ExitError> { + CurrentState::with_store(|store| { + let mut store = state::codes(store); + store.insert(address, code); + }); + Ok(()) + } + + fn deposit(&mut self, _target: H160, _value: U256) { + // NOTE: Direct balance manipulation is not allowed, use `transfer˙ instead. + // + // This is used by the invoker to handle fee refunds (already handled by the SDK) and + // block rewards (ignored). + } + + fn withdrawal( + &mut self, + _source: H160, + _value: U256, + ) -> Result<(), evm::interpreter::ExitError> { + // NOTE: Direct balance manipulation is not allowed, use `transfer˙ instead. + // + // This is used by the invoker to handle fee payments (already handled by the SDK). + Ok(()) + } + + fn transfer( + &mut self, + transfer: evm::interpreter::runtime::Transfer, + ) -> Result<(), evm::interpreter::ExitError> { + let from = Cfg::map_address(transfer.source); + let to = Cfg::map_address(transfer.target); + let amount = transfer + .value + .try_into() + .map_err(|_| evm::interpreter::ExitException::OutOfFund)?; + let amount = token::BaseUnits::new(amount, Cfg::TOKEN_DENOMINATION); + + ::Accounts::transfer(from, to, &amount) + .map_err(|_| evm::interpreter::ExitException::OutOfFund.into()) + } + + fn inc_nonce(&mut self, address: H160) -> Result<(), evm::interpreter::ExitError> { + // Do not increment the origin nonce as that has already been handled by the SDK. But do + // record that the nonce should be incremented based on EVM semantics so we can adjust any + // results from the `nonce` method. + if address == self.caller && !CurrentState::with_env(|env| env.is_simulation()) { + self.substate.origin_nonce_incremented = true; + return Ok(()); + } + + let address = Cfg::map_address(address); + ::Accounts::inc_nonce(address); + Ok(()) + } +} + +impl<'ctx, C: Context, Cfg: Config> evm::backend::TransactionalBackend + for OasisBackend<'ctx, C, Cfg> +{ + fn push_substate(&mut self) { + let mut parent = Box::new(Substate::new()); + mem::swap(&mut parent, &mut self.substate); + self.substate.parent = Some(parent); + + CurrentState::start_transaction(); + } + + fn pop_substate( + &mut self, + strategy: evm::MergeStrategy, + ) -> Result<(), evm::interpreter::ExitError> { + let mut child = self + .substate + .parent + .take() + .ok_or(evm::interpreter::ExitError::Fatal( + evm::interpreter::ExitFatal::UnevenSubstate, + ))?; + mem::swap(&mut child, &mut self.substate); + let child = child; + + match strategy { + evm::MergeStrategy::Commit => { + for log in child.logs { + self.substate.logs.push(log); + } + for address in child.storage_resets { + self.substate.storage_resets.insert(address); + } + for ((address, key), value) in child.transient_storage { + self.substate + .transient_storage + .insert((address, key), value); + } + for address in child.deletes { + self.substate.deletes.insert(address); + } + for address in child.creates { + self.substate.creates.insert(address); + } + for address in child.touched { + self.substate.touched.insert(address); + } + for item in child.accessed { + self.substate.accessed.insert(item); + } + self.substate.origin_nonce_incremented |= child.origin_nonce_incremented; + + CurrentState::commit_transaction(); + } + evm::MergeStrategy::Revert | evm::MergeStrategy::Discard => { + CurrentState::rollback_transaction(); + } + } + + Ok(()) + } +} + +struct Substate { + parent: Option>, + logs: Vec, + storage_resets: BTreeSet, + transient_storage: BTreeMap<(H160, H256), H256>, + deletes: BTreeSet, + creates: BTreeSet, + touched: BTreeSet, + accessed: BTreeSet<(H160, Option)>, + origin_nonce_incremented: bool, +} + +impl Substate { + pub fn new() -> Self { + Self { + parent: None, + logs: Vec::new(), + storage_resets: Default::default(), + transient_storage: Default::default(), + deletes: Default::default(), + creates: Default::default(), + touched: Default::default(), + accessed: Default::default(), + origin_nonce_incremented: false, + } + } + + pub fn known_accessed(&self, item: (H160, Option)) -> Option { + if self.accessed.contains(&item) { + Some(true) + } else if let Some(parent) = self.parent.as_ref() { + parent.known_accessed(item) + } else { + None + } + } + + pub fn known_original_storage(&self, address: H160, _key: H256) -> Option { + if self.deletes.contains(&address) { + None + } else if self.storage_resets.contains(&address) { + Some(H256::default()) + } else if let Some(parent) = self.parent.as_ref() { + parent.known_original_storage(address, _key) + } else { + None + } + } + + pub fn known_transient_storage(&self, address: H160, key: H256) -> Option { + if let Some(value) = self.transient_storage.get(&(address, key)) { + Some(*value) + } else if let Some(parent) = self.parent.as_ref() { + parent.known_transient_storage(address, key) + } else { + None + } + } + + pub fn deleted(&self, address: H160) -> bool { + if self.deletes.contains(&address) { + true + } else if let Some(parent) = self.parent.as_ref() { + parent.deleted(address) + } else { + false + } + } + + pub fn created(&self, address: H160) -> bool { + if self.creates.contains(&address) { + true + } else if let Some(parent) = self.parent.as_ref() { + parent.created(address) + } else { + false + } + } +} diff --git a/runtime-sdk/modules/evm/src/engine/invoker.rs b/runtime-sdk/modules/evm/src/engine/invoker.rs new file mode 100644 index 00000000000..2125e9d44aa --- /dev/null +++ b/runtime-sdk/modules/evm/src/engine/invoker.rs @@ -0,0 +1,167 @@ +//! Capturing EVM invoker wrapper. +//! +//! Provides [`CapturingInvoker`], a wrapper around [`evm::standard::Invoker`] that records the +//! exit return-value buffer and gas consumed at transaction finalization time. Unlike reading the +//! result of [`evm::transact`] directly, the captured data is available **even when +//! [`evm::transact`] returns an [`evm::interpreter::ExitError`]**, because the capture is +//! populated inside [`evm::Invoker::finalize_transact`] before the error is propagated to the +//! caller. + +use std::cell::RefCell; + +use evm::{ + backend::TransactionalBackend, + interpreter::{ + runtime::{RuntimeBackend, RuntimeEnvironment, RuntimeState}, + trap::{CallCreateTrap, CallFeedback, CreateFeedback, TrapConsume}, + uint::U256, + Capture, ExitError, FeedbackInterpreter, Interpreter, + }, + standard::{ + Config, InvokerState, Resolver, SubstackInvoke, TransactArgs, TransactInvoke, TransactValue, + }, + uint::U256Ext, + Invoker as InvokerT, InvokerControl, InvokerExit, +}; + +/// Data extracted from a transaction at finalization time. +#[derive(Debug, Clone)] +pub struct InvokerCapture { + /// The ABI-encoded return / revert data produced by the execution. + /// + /// For successful calls this is the ordinary return value; for reverts it + /// is the revert payload; for other errors it will typically be empty. + pub retval: Vec, + + /// Amount of gas consumed by the transaction before finalization. + pub used_gas: U256, +} + +/// A wrapper around [`evm::standard::Invoker`] that captures the exit value +/// buffer and gas used at finalization time, even when [`evm::transact`] +/// returns an error. +pub struct CapturingInvoker<'config, 'resolver, R> { + inner: evm::standard::Invoker<'config, 'resolver, R>, + capture: RefCell>, +} + +impl<'config, 'resolver, R> CapturingInvoker<'config, 'resolver, R> { + /// Wrap an existing standard invoker. + pub fn new(inner: evm::standard::Invoker<'config, 'resolver, R>) -> Self { + Self { + inner, + capture: RefCell::new(None), + } + } + + /// Take the capture produced by the most recent call to + /// [`evm::Invoker::finalize_transact`]. + /// + /// Returns `None` if no transaction has been finalized through this + /// invoker yet, or if the capture has already been consumed by a previous + /// call to this method. + pub fn take_capture(&self) -> Option { + self.capture.borrow_mut().take() + } +} + +// ── Invoker impl ────────────────────────────────────────────────────────── + +impl<'config, 'resolver, H, R> InvokerT for CapturingInvoker<'config, 'resolver, R> +where + R::State: InvokerState + AsRef + AsMut + AsRef, + ::TransactArgs: AsRef>, + H: RuntimeEnvironment + RuntimeBackend + TransactionalBackend, + R: Resolver, + >::Trap: TrapConsume, + R::Interpreter: FeedbackInterpreter + FeedbackInterpreter, +{ + type State = R::State; + type Interpreter = R::Interpreter; + type Interrupt = + <>::Trap as TrapConsume>::Rest; + type TransactArgs = <>::State as InvokerState>::TransactArgs; + type TransactValue = TransactValue; + type TransactInvoke = TransactInvoke<'config>; + type SubstackInvoke = SubstackInvoke; + + #[inline] + fn new_transact( + &self, + args: Self::TransactArgs, + handler: &mut H, + ) -> Result< + ( + Self::TransactInvoke, + InvokerControl, + ), + ExitError, + > { + self.inner.new_transact(args, handler) + } + + #[inline] + fn enter_substack( + &self, + trap: >::Trap, + machine: &mut Self::Interpreter, + handler: &mut H, + depth: usize, + ) -> Capture< + Result< + ( + Self::SubstackInvoke, + InvokerControl, + ), + ExitError, + >, + Self::Interrupt, + > { + self.inner.enter_substack(trap, machine, handler, depth) + } + + #[inline] + fn exit_substack( + &self, + trap_data: Self::SubstackInvoke, + exit: InvokerExit, + parent: &mut Self::Interpreter, + handler: &mut H, + ) -> Result<(), ExitError> { + self.inner.exit_substack(trap_data, exit, parent, handler) + } + + fn finalize_transact( + &self, + invoke: &Self::TransactInvoke, + exit: InvokerExit, + handler: &mut H, + ) -> Result { + let retval = exit.retval.clone(); + + let effective_gas = match &exit.result { + Ok(_) => exit + .substate + .as_ref() + .map(|s| s.effective_gas(true)) + .unwrap_or_default(), + Err(ExitError::Reverted) => exit + .substate + .as_ref() + .map(|s| s.effective_gas(false)) + .unwrap_or_default(), + Err(_) => U256::ZERO, + }; + + let mut used_gas = invoke.gas_limit.saturating_sub(effective_gas); + + let result = self.inner.finalize_transact(invoke, exit, handler); + if let Ok(transact_value) = &result { + used_gas = transact_value.used_gas; + } + + *self.capture.borrow_mut() = Some(InvokerCapture { retval, used_gas }); + + result + } +} diff --git a/runtime-sdk/modules/evm/src/engine/mod.rs b/runtime-sdk/modules/evm/src/engine/mod.rs new file mode 100644 index 00000000000..851e9ab856e --- /dev/null +++ b/runtime-sdk/modules/evm/src/engine/mod.rs @@ -0,0 +1,7 @@ +pub mod backend; +pub mod invoker; +pub mod state; + +pub use backend::OasisBackend; +pub use invoker::CapturingInvoker; +pub use state::WrappedState; diff --git a/runtime-sdk/modules/evm/src/engine/state.rs b/runtime-sdk/modules/evm/src/engine/state.rs new file mode 100644 index 00000000000..bd2fd0c2033 --- /dev/null +++ b/runtime-sdk/modules/evm/src/engine/state.rs @@ -0,0 +1,206 @@ +//! Wrapper around [`evm::standard::State`] that propagates ancestor gas usage +//! down the call-frame stack. + +use evm::{ + interpreter::{ + runtime::{GasState, RuntimeConfig, RuntimeState}, + uint::{H160, H256, U256}, + ExitError, + }, + standard::{Config, GasometerState, InvokerState, TransactArgs}, + uint::U256Ext, + GasMutState, MergeStrategy, +}; + +/// Access the cumulative gas consumed by all ancestor execution frames. +/// +/// This trait is implemented by [`WrappedState`]. Precompiles that need to +/// know how much gas has been spent since the start of the transaction should +/// require this bound and combine its value with the current frame's own +/// `total_used_gas()`: +/// +/// ```text +/// total = G::parent_used_gas() + gasometer_state.total_used_gas() +/// ``` +pub trait ParentGasInfo { + /// Gas consumed by every frame that is an ancestor of the current frame, + /// **not** counting the gas that was allocated to this frame itself. + fn parent_used_gas(&self) -> U256; +} + +/// An [`evm::standard::State`] wrapper that additionally tracks +/// `parent_used_gas`, the cumulative gas consumed by all ancestor frames. +pub struct WrappedState<'config> { + /// Inner standard EVM state. + pub inner: evm::standard::State<'config>, + /// Cumulative gas consumed by all ancestor frames. + parent_used_gas: U256, +} + +impl<'config> WrappedState<'config> { + /// Create a root `WrappedState`. + fn from_root(inner: evm::standard::State<'config>) -> Self { + Self { + inner, + parent_used_gas: U256::ZERO, + } + } +} + +impl<'config> ParentGasInfo for WrappedState<'config> { + #[inline] + fn parent_used_gas(&self) -> U256 { + self.parent_used_gas + } +} + +impl<'config> AsRef for WrappedState<'config> { + #[inline] + fn as_ref(&self) -> &RuntimeState { + self.inner.as_ref() + } +} + +impl<'config> AsMut for WrappedState<'config> { + #[inline] + fn as_mut(&mut self) -> &mut RuntimeState { + self.inner.as_mut() + } +} + +impl<'config> AsRef for WrappedState<'config> { + #[inline] + fn as_ref(&self) -> &GasometerState { + self.inner.as_ref() + } +} + +impl<'config> AsMut for WrappedState<'config> { + #[inline] + fn as_mut(&mut self) -> &mut GasometerState { + self.inner.as_mut() + } +} + +impl<'config> AsRef for WrappedState<'config> { + #[inline] + fn as_ref(&self) -> &Config { + self.inner.as_ref() + } +} + +impl<'config> AsRef for WrappedState<'config> { + #[inline] + fn as_ref(&self) -> &RuntimeConfig { + self.inner.as_ref() + } +} + +impl<'config> GasState for WrappedState<'config> { + #[inline] + fn gas(&self) -> U256 { + self.inner.gas() + } +} + +impl<'config> GasMutState for WrappedState<'config> { + #[inline] + fn record_gas(&mut self, gas: U256) -> Result<(), ExitError> { + self.inner.record_gas(gas) + } +} + +impl<'config> InvokerState for WrappedState<'config> { + /// Re-use the standard [`TransactArgs`] so the rest of the invoker + /// machinery (which expects `AsRef>`) continues to + /// work without any wrapper. + type TransactArgs = TransactArgs<'config>; + + fn new_transact_call( + runtime: RuntimeState, + gas_limit: U256, + data: &[u8], + access_list: &[(H160, Vec)], + args: &TransactArgs<'config>, + ) -> Result { + let inner = as InvokerState>::new_transact_call( + runtime, + gas_limit, + data, + access_list, + args, + )?; + Ok(Self::from_root(inner)) + } + + fn new_transact_create( + runtime: RuntimeState, + gas_limit: U256, + code: &[u8], + access_list: &[(H160, Vec)], + args: &TransactArgs<'config>, + ) -> Result { + let inner = as InvokerState>::new_transact_create( + runtime, + gas_limit, + code, + access_list, + args, + )?; + Ok(Self::from_root(inner)) + } + + fn substate( + &mut self, + runtime: RuntimeState, + gas_limit: U256, + is_static: bool, + call_has_value: bool, + ) -> Result { + // Snapshot the parent frame's total gas consumption before calling + // `inner.substate()`. Inside that call, `GasometerState::submeter()` + // records the child's allocation (`gas_limit`) as an additional cost + // in the parent's gasometer. We therefore must snapshot here to avoid + // including the child's allocation in `parent_used_gas`. + // + // After the snapshot: + // parent_used_gas_for_child + // = self.parent_used_gas (gas used by grandparent+) + // + parent_frame_used (gas used by this frame up + // to and including the CALL + // opcode cost, but not the + // gas allocated to the child) + let parent_frame_used = U256::from(self.inner.gasometer.total_used_gas()); + + let inner = self + .inner + .substate(runtime, gas_limit, is_static, call_has_value)?; + + let parent_used_gas = self.parent_used_gas.saturating_add(parent_frame_used); + + Ok(Self { + inner, + parent_used_gas, + }) + } + + #[inline] + fn merge(&mut self, substate: Self, strategy: MergeStrategy) { + self.inner.merge(substate.inner, strategy) + } + + #[inline] + fn record_codedeposit(&mut self, len: usize) -> Result<(), ExitError> { + self.inner.record_codedeposit(len) + } + + #[inline] + fn is_static(&self) -> bool { + self.inner.is_static() + } + + #[inline] + fn effective_gas(&self, with_refund: bool) -> U256 { + self.inner.effective_gas(with_refund) + } +} diff --git a/runtime-sdk/modules/evm/src/lib.rs b/runtime-sdk/modules/evm/src/lib.rs index 50484c1ec9e..3946ccc80ba 100644 --- a/runtime-sdk/modules/evm/src/lib.rs +++ b/runtime-sdk/modules/evm/src/lib.rs @@ -5,8 +5,8 @@ extern crate substrate_bn as bn; -pub mod backend; pub mod derive_caller; +pub mod engine; pub mod precompile; pub mod raw_tx; mod signed_call; @@ -16,12 +16,9 @@ pub mod types; use std::collections::HashSet; use base64::prelude::*; -use evm::{ - executor::stack::{StackExecutor, StackSubstateMetadata}, - Config as EVMConfig, -}; +use evm::interpreter::ExitError; use hex::FromHex; -use once_cell::sync::{Lazy, OnceCell}; +use once_cell::sync::Lazy; use thiserror::Error; use oasis_runtime_sdk::{ @@ -45,7 +42,7 @@ use oasis_runtime_sdk::{ use types::{H160, H256, U256}; -use crate as oasis_runtime_sdk_evm; +use crate::{self as oasis_runtime_sdk_evm, precompile::Precompiles}; #[cfg(any(test, feature = "test"))] pub mod mock; @@ -57,10 +54,6 @@ const MODULE_NAME: &str = "evm"; /// Module configuration. pub trait Config: 'static { - /// AdditionalPrecompileSet is the type used for the additional precompiles. - /// Use `()` if unused. - type AdditionalPrecompileSet: evm::executor::stack::PrecompileSet; - /// The chain ID to supply when a contract requests it. Ethereum-format transactions must use /// this chain ID. const CHAIN_ID: u64; @@ -77,6 +70,9 @@ pub trait Config: 'static { /// Maximum result size in bytes. const MAX_RESULT_SIZE: usize = 1024; + /// EVM config. + const EVM_CONFIG: evm::standard::Config = evm::standard::Config::cancun(); + /// Maps an Ethereum address into an SDK account address. fn map_address(address: primitive_types::H160) -> Address { Address::new( @@ -91,34 +87,14 @@ pub trait Config: 'static { /// If any of the precompile addresses returned is the same as for one of /// the builtin precompiles, then the returned implementation will /// overwrite the builtin implementation. - fn additional_precompiles() -> Option { - None - } - - /// Returns the config used by the EVM (in the hardfork sense). - // In some cases, the config may be runtime config dependent (e.g., constant - // timeness when confidential), so this is made part of the trait. - fn evm_config(estimation: bool) -> &'static EVMConfig { - static EVM_CONFIG: OnceCell = OnceCell::new(); - static EVM_CONFIG_ESTIMATE: OnceCell = OnceCell::new(); - - if estimation { - EVM_CONFIG_ESTIMATE.get_or_init(|| { - // The estimate mode overestimates transaction costs and returns a gas costs - // that should be sufficient to execute a transaction, but likely overestimated. - // The "proper" EVM-way to estimate exact gas is to disable this estimation and - // do a binary search over all possible gas costs to find the minimum gas cost - // with which the transaction succeeds. This mode should only be used when the - // caller wants to avoid the expensive binary search and is ok with a possible - // overestimation of gas costs. - EVMConfig { - estimate: true, - ..Self::evm_config(false).clone() - } - }) - } else { - EVM_CONFIG.get_or_init(EVMConfig::shanghai) - } + fn additional_precompiles() -> Option> + where + G: AsRef + + AsRef + + evm::GasMutState, + H: evm::interpreter::runtime::RuntimeBackend, + { + None::<()> } } @@ -174,9 +150,9 @@ pub enum Error { Core(#[from] CoreError), } -impl From for Error { - fn from(e: evm::ExitError) -> Error { - use evm::ExitError::*; +impl From for Error { + fn from(e: evm::interpreter::ExitException) -> Error { + use evm::interpreter::ExitException::*; let msg = match e { StackUnderflow => "stack underflow", StackOverflow => "stack overflow", @@ -186,32 +162,47 @@ impl From for Error { CallTooDeep => "call too deep", CreateCollision => "create collision", CreateContractLimit => "create contract limit", - InvalidCode(..) => "invalid code", - + InvalidOpcode(_) => "invalid opcode", OutOfOffset => "out of offset", OutOfGas => "out of gas", - OutOfFund => "out of funds", - - #[allow(clippy::upper_case_acronyms)] - PCUnderflow => "PC underflow", - + OutOfFund => "out of fund", + PCUnderflow => "pc underflow", CreateEmpty => "create empty", MaxNonce => "nonce overflow", - + NotEOA => "not eoa", Other(msg) => return Error::ExecutionFailed(msg.to_string()), + _ => "unknown error", }; Error::ExecutionFailed(msg.to_string()) } } -impl From for Error { - fn from(e: evm::ExitFatal) -> Error { - use evm::ExitFatal::*; +impl From for Error { + fn from(e: evm::interpreter::ExitFatal) -> Error { + use evm::interpreter::ExitFatal::*; let msg = match e { NotSupported => "not supported", UnhandledInterrupt => "unhandled interrupt", - CallErrorAsFatal(err) => return err.into(), + ExceptionAsFatal(e) => return e.into(), + AlreadyExited => "already exited", + Unfinished => "unfinished", + UnevenSubstate => "uneven substate", + InvalidFeedback => "invalid feedback", Other(msg) => return Error::ExecutionFailed(msg.to_string()), + _ => "unknown error", + }; + Error::ExecutionFailed(msg.to_string()) + } +} + +impl From for Error { + fn from(e: evm::interpreter::ExitError) -> Error { + use evm::interpreter::ExitError; + + let msg = match e { + ExitError::Reverted => "reverted", + ExitError::Exception(e) => return e.into(), + ExitError::Fatal(e) => return e.into(), }; Error::ExecutionFailed(msg.to_string()) } @@ -325,9 +316,8 @@ impl API for Module { return Ok(vec![]); } - let (tx_call_format, tx_index, is_simulation) = CurrentState::with_env(|env| { - (env.tx_call_format(), env.tx_index(), env.is_simulation()) - }); + let (tx_call_format, tx_index) = + CurrentState::with_env(|env| (env.tx_call_format(), env.tx_index())); // Create output (the contract address) does not need to be encrypted because it's // trivially computable by anyone who can observe the create tx and receipt status. @@ -336,12 +326,7 @@ impl API for Module { Self::decode_call_data(ctx, init_code, tx_call_format, tx_index, true)? .expect("processing always proceeds"); - // If in simulation, this must be EstimateGas query. - // Use estimate mode if not doing binary search for exact gas costs. - let estimate_gas = - is_simulation && ::Core::estimate_gas_search_max_iters(ctx) == 0; - - Self::evm_create(ctx, caller, value, init_code, estimate_gas) + Self::evm_create(ctx, caller, value, init_code) } fn call( @@ -357,20 +342,14 @@ impl API for Module { return Ok(vec![]); } - let (tx_call_format, tx_index, is_simulation) = CurrentState::with_env(|env| { - (env.tx_call_format(), env.tx_index(), env.is_simulation()) - }); + let (tx_call_format, tx_index) = + CurrentState::with_env(|env| (env.tx_call_format(), env.tx_index())); let (data, tx_metadata) = Self::decode_call_data(ctx, data, tx_call_format, tx_index, true)? .expect("processing always proceeds"); - // If in simulation, this must be EstimateGas query. - // Use estimate mode if not doing binary search for exact gas costs. - let estimate_gas = - is_simulation && ::Core::estimate_gas_search_max_iters(ctx) == 0; - - let evm_result = Self::evm_call(ctx, caller, address, value, data, estimate_gas); + let evm_result = Self::evm_call(ctx, caller, address, value, data); Self::encode_evm_result(ctx, evm_result, tx_metadata) } @@ -428,7 +407,7 @@ impl API for Module { value, data: data.clone(), }), - Box::new(move || Self::evm_call(ctx, caller, address, value, data, false)), + Box::new(move || Self::evm_call(ctx, caller, address, value, data)), ) } None => { @@ -439,7 +418,7 @@ impl API for Module { value, init_code: data.clone(), }), - Box::new(|| Self::evm_create(ctx, caller, value, data, false)), + Box::new(|| Self::evm_create(ctx, caller, value, data)), ) } }; @@ -491,22 +470,15 @@ impl Module { address: H160, value: U256, data: Vec, - estimate_gas: bool, ) -> Result, Error> { Self::evm_execute( ctx, caller, - |exec, gas_limit| { - exec.transact_call( - caller.into(), - address.into(), - value.into(), - data, - gas_limit, - vec![], - ) + value, + evm::standard::TransactArgsCallCreate::Call { + address: address.into(), + data, }, - estimate_gas, ) } @@ -515,64 +487,66 @@ impl Module { caller: H160, value: U256, init_code: Vec, - estimate_gas: bool, ) -> Result, Error> { Self::evm_execute( ctx, caller, - |exec, gas_limit| { - // Precompute the address as execution can modify state such that the subsequent - // address derivation would be incorrect (e.g. due to nonce increments). - let address = exec.create_address(evm::CreateScheme::Legacy { - caller: caller.into(), - }); - let (exit_reason, exit_value) = - exec.transact_create(caller.into(), value.into(), init_code, gas_limit, vec![]); - if exit_reason.is_succeed() { - // If successful return the contract deployed address. - (exit_reason, address.as_bytes().to_vec()) - } else { - // Otherwise propagate the exit value. - (exit_reason, exit_value) - } + value, + evm::standard::TransactArgsCallCreate::Create { + init_code, + salt: None, // Regular CREATE. }, - estimate_gas, ) } - fn evm_execute(ctx: &C, source: H160, f: F, estimate_gas: bool) -> Result, Error> + fn evm_execute( + ctx: &C, + caller: H160, + value: U256, + args: evm::standard::TransactArgsCallCreate, + ) -> Result, Error> where C: Context, - F: FnOnce( - &mut StackExecutor< - 'static, - '_, - backend::OasisStackState<'_, '_, 'static, C, Cfg>, - precompile::Precompiles>, - >, - u64, - ) -> (evm::ExitReason, Vec), { let is_query = CurrentState::with_env(|env| !env.is_execute()); - let cfg = Cfg::evm_config(estimate_gas); let gas_limit: u64 = ::Core::remaining_tx_gas(); let gas_price: primitive_types::U256 = CurrentState::with_env(|env| env.tx_auth_info().fee.gas_price().into()); - let vicinity = backend::Vicinity { - gas_price, - origin: source.into(), + let precompiles = Precompiles::<'_, Cfg, C>::new(ctx); + let gas_etable = evm::interpreter::etable::Single::new(evm::standard::eval_gasometer); + // Use WrappedState as the machine state type so that every execution + // frame carries `parent_used_gas`, giving precompiles exact visibility + // into total gas consumed at any call-stack depth. + let exec_etable: evm::interpreter::etable::DispatchEtable< + engine::WrappedState<'_>, + engine::OasisBackend<'_, C, Cfg>, + evm::interpreter::trap::CallCreateTrap, + > = evm::interpreter::etable::DispatchEtable::runtime(); + let etable = evm::interpreter::etable::Chained(gas_etable, exec_etable); + let resolver = evm::standard::EtableResolver::new(&precompiles, &etable); + let invoker = engine::CapturingInvoker::new(evm::standard::Invoker::new(&resolver)); + + let args = evm::standard::TransactArgs { + call_create: args, + caller: caller.into(), + value: value.into(), + gas_limit: gas_limit.into(), + gas_price: evm::standard::TransactGasPrice::Legacy(gas_price), + access_list: vec![], // TODO + config: &Cfg::EVM_CONFIG, }; - let backend = backend::OasisBackend::<'_, C, Cfg>::new(ctx, vicinity); - let metadata = StackSubstateMetadata::new(gas_limit, cfg); - let stackstate = backend::OasisStackState::new(metadata, &backend); - let precompiles = precompile::Precompiles::new(&backend); - let mut executor = StackExecutor::new_with_precompiles(stackstate, cfg, &precompiles); + let mut backend = engine::OasisBackend::<'_, C, Cfg>::new(ctx, caller.into()); - // Run EVM and process the result. - let (exit_reason, exit_value) = f(&mut executor, gas_limit); - let gas_used = executor.used_gas(); + // TODO: Stack/heap split should be part of Cfg. + let result = evm::transact(args, Some(4), &mut backend, &invoker); + + let capture = invoker.take_capture(); + let (exit_value, used_gas) = capture + .map(|c| (c.retval, c.used_gas)) + .unwrap_or_else(|| (Vec::new(), gas_limit.into())); + let used_gas: u64 = used_gas.try_into().unwrap_or(u64::MAX); // Clamp data based on maximum allowed result size. let exit_value = if !is_query && exit_value.len() > Cfg::MAX_RESULT_SIZE { @@ -581,31 +555,31 @@ impl Module { exit_value }; - let exit_value = match exit_reason { - evm::ExitReason::Succeed(_) => exit_value, - err => { - let err = match err { - evm::ExitReason::Revert(_) => { - Error::Reverted(BASE64_STANDARD.encode(exit_value)) - } - evm::ExitReason::Error(err) => err.into(), - evm::ExitReason::Fatal(err) => err.into(), - _ => unreachable!("already handled above"), - }; - - ::Core::use_tx_gas(gas_used)?; + let exit_value = match result { + Ok(transact_value) => match transact_value.call_create { + evm::standard::TransactValueCallCreate::Create { address, .. } => { + address.as_bytes().to_vec() + } + evm::standard::TransactValueCallCreate::Call { .. } => exit_value, + }, + Err(ExitError::Reverted) => { + ::Core::use_tx_gas(used_gas)?; ::Accounts::set_refund_unused_tx_fee(Cfg::REFUND_UNUSED_FEE); - return Err(err); + return Err(Error::Reverted(BASE64_STANDARD.encode(&exit_value))); + } + Err(err) => { + ::Core::use_tx_gas(used_gas)?; + return Err(err.into()); } }; - // Apply can fail in case of unsupported actions. - if let Err(err) = executor.into_state().apply() { - ::Core::use_tx_gas(gas_used)?; + // Apply final backend state. + if let Err(err) = backend.apply() { + ::Core::use_tx_gas(used_gas)?; return Err(err); // Do not refund unused fee. - }; + } - ::Core::use_tx_gas(gas_used)?; + ::Core::use_tx_gas(used_gas)?; ::Accounts::set_refund_unused_tx_fee(Cfg::REFUND_UNUSED_FEE); Ok(exit_value) diff --git a/runtime-sdk/modules/evm/src/precompile/confidential.rs b/runtime-sdk/modules/evm/src/precompile/confidential.rs index dc7cf254ee1..6d982ce55d8 100644 --- a/runtime-sdk/modules/evm/src/precompile/confidential.rs +++ b/runtime-sdk/modules/evm/src/precompile/confidential.rs @@ -2,8 +2,8 @@ use std::{collections::HashMap, convert::TryInto}; use evm::{ - executor::stack::{PrecompileFailure, PrecompileHandle, PrecompileOutput}, - ExitError, ExitRevert, ExitSucceed, + interpreter::{ExitError, ExitException, ExitSucceed}, + GasMutState, }; use hmac::{Hmac, Mac}; use once_cell::sync::Lazy; @@ -11,15 +11,22 @@ use once_cell::sync::Lazy; use oasis_runtime_sdk::{ core::common::crypto::mrae::deoxysii::{DeoxysII, KEY_SIZE, NONCE_SIZE}, crypto::signature::{self, SignatureType}, + Context, CurrentState, }; -use crate::backend::{EVMBackendExt, RNG_MAX_BYTES}; - -use super::{record_linear_cost, record_multilinear_cost, PrecompileResult}; +use super::{record_linear_cost, record_multilinear_cost}; /// Length of an EVM word, in bytes. pub const WORD: usize = 32; +/// The maximum number of bytes that may be generated by one invocation of `random_bytes`. +/// +/// The precompile function also limits the number of bytes returned, but it's here, too, to prevent +/// accidental memory overconsumption. +/// +/// This constant might make a good config param, if anyone asks or this changes frequently. +const RNG_MAX_BYTES: u64 = 1024; + /// The base cost for x25519 key derivation. const X25519_KEY_DERIVATION_BASE_COST: u64 = 1_100; @@ -77,14 +84,18 @@ static VERIFY_MESSAGE_COST: Lazy> = Lazy::new ]) }); -pub(super) fn call_random_bytes( - handle: &mut impl PrecompileHandle, - backend: &B, -) -> PrecompileResult { +pub(super) fn call_random_bytes( + input: &[u8], + gasometer: &mut G, + ctx: &C, +) -> Result<(ExitSucceed, Vec), ExitError> +where + C: Context, + G: GasMutState, +{ let (num_bytes_big, pers_str): (solabi::U256, solabi::Bytes>) = - solabi::decode(handle.input()).map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(e.to_string().into()), - })?; + solabi::decode(input) + .map_err(|e| ExitError::Exception(ExitException::Other(e.to_string().into())))?; let pers_str = pers_str.as_bytes(); let num_bytes: u64 = num_bytes_big @@ -101,47 +112,66 @@ pub(super) fn call_random_bytes( // to use an efficient cryptographic hash function with some bookkeeping. // In any case, it's much cheaper than using a VRF oracle, and even a Solidity DRBG, // which has a cost-per-byte upwards of 1000. - record_multilinear_cost(handle, num_bytes, pers_str.len() as u64, 240, 60, 10_000)?; - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: backend.random_bytes(num_bytes, pers_str), - }) + record_multilinear_cost(gasometer, num_bytes, pers_str.len() as u64, 240, 60, 10_000)?; + + // Refuse to generate more than 1 KiB in one go. + // EVM memory gas is checked only before and after calls, so we won't + // see the quadratic memory cost until after this call uses its time. + let num_bytes = num_bytes.min(RNG_MAX_BYTES) as usize; + let mut output = vec![0u8; num_bytes]; + CurrentState::with(|state| { + let mut rng = state + .rng() + .fork(ctx, pers_str) + .expect("unable to access RNG"); + rand_core::RngCore::try_fill_bytes(&mut rng, &mut output).expect("RNG is inoperable"); + }); + + Ok((ExitSucceed::Returned, output)) } -pub(super) fn call_curve25519_compute_public( - handle: &mut impl PrecompileHandle, -) -> PrecompileResult { - handle.record_cost(CURVE25519_COMPUTE_PUBLIC_COST)?; - let input = handle.input(); // Input encoding: bytes32 private. +pub(super) fn call_curve25519_compute_public( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState, +{ + gasometer.record_gas(CURVE25519_COMPUTE_PUBLIC_COST.into())?; + + // Input encoding: bytes32 private. if input.len() != 32 { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other("input length must be 32 bytes".into()), - }); + return Err(ExitError::Exception(ExitException::Other( + "input length must be 32 bytes".into(), + ))); } let private = <&[u8; WORD]>::try_from(input).unwrap(); let secret = x25519_dalek::StaticSecret::from(*private); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: x25519_dalek::PublicKey::from(&secret).as_bytes().to_vec(), - }) + let output = x25519_dalek::PublicKey::from(&secret).as_bytes().to_vec(); + Ok((ExitSucceed::Returned, output)) } -pub(super) fn call_x25519_derive(handle: &mut impl PrecompileHandle) -> PrecompileResult { +pub(super) fn call_x25519_derive( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState, +{ record_linear_cost( - handle, - handle.input().len() as u64, + gasometer, + input.len() as u64, X25519_KEY_DERIVATION_BASE_COST, 0, )?; // Input encoding: bytes32 public || bytes32 private. - let input = handle.input(); let mut public = [0u8; WORD]; let mut private = [0u8; WORD]; if input.len() != 2 * WORD { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other("input length must be 64 bytes".into()), - }); + return Err(ExitError::Exception(ExitException::Other( + "input length must be 64 bytes".into(), + ))); } public.copy_from_slice(&input[0..WORD]); private.copy_from_slice(&input[WORD..]); @@ -151,34 +181,31 @@ pub(super) fn call_x25519_derive(handle: &mut impl PrecompileHandle) -> Precompi let mut kdf = Hmac::::new_from_slice(b"MRAE_Box_Deoxys-II-256-128").map_err(|_| { - PrecompileFailure::Error { - exit_status: ExitError::Other("unable to create key derivation function".into()), - } + ExitError::Exception(ExitException::Other( + "unable to create key derivation function".into(), + )) })?; kdf.update(private.diffie_hellman(&public).as_bytes()); let mut derived_key = [0u8; KEY_SIZE]; let digest = kdf.finalize(); derived_key.copy_from_slice(&digest.into_bytes()[..KEY_SIZE]); + let output = derived_key.to_vec(); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: derived_key.to_vec(), - }) + Ok((ExitSucceed::Returned, output)) } #[allow(clippy::type_complexity)] fn decode_deoxysii_call_args( input: &[u8], -) -> Result<([u8; KEY_SIZE], [u8; NONCE_SIZE], Vec, Vec), PrecompileFailure> { +) -> Result<([u8; KEY_SIZE], [u8; NONCE_SIZE], Vec, Vec), ExitError> { let (key, nonce, text, ad): ( solabi::Bytes<[u8; 32]>, // key solabi::Bytes<[u8; 32]>, // nonce solabi::Bytes>, // plain or ciphertext solabi::Bytes>, // associated data - ) = solabi::decode(input).map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(e.to_string().into()), - })?; + ) = solabi::decode(input) + .map_err(|e| ExitError::Exception(ExitException::Other(e.to_string().into())))?; let key_bytes = key.as_bytes(); let nonce_bytes = nonce.as_bytes(); @@ -193,147 +220,168 @@ fn decode_deoxysii_call_args( Ok((key, nonce, text, ad)) } -pub(super) fn call_deoxysii_seal(handle: &mut impl PrecompileHandle) -> PrecompileResult { +pub(super) fn call_deoxysii_seal( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState, +{ record_linear_cost( - handle, - handle.input().len() as u64, + gasometer, + input.len() as u64, DEOXYSII_BASE_COST, DEOXYSII_WORD_COST, )?; - let (key, nonce, text, ad) = decode_deoxysii_call_args(handle.input())?; + let (key, nonce, text, ad) = decode_deoxysii_call_args(input)?; let deoxysii = DeoxysII::new(&key); let encrypted = deoxysii.seal(&nonce, text, ad); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: encrypted, - }) + Ok((ExitSucceed::Returned, encrypted)) } -pub(super) fn call_deoxysii_open(handle: &mut impl PrecompileHandle) -> PrecompileResult { +pub(super) fn call_deoxysii_open( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState, +{ record_linear_cost( - handle, - handle.input().len() as u64, + gasometer, + input.len() as u64, DEOXYSII_BASE_COST, DEOXYSII_WORD_COST, )?; - let (key, nonce, ciphertext, ad) = decode_deoxysii_call_args(handle.input())?; + let (key, nonce, ciphertext, ad) = decode_deoxysii_call_args(input)?; let ciphertext = ciphertext.to_vec(); let deoxysii = DeoxysII::new(&key); match deoxysii.open(&nonce, ciphertext, ad) { - Ok(decrypted) => Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: decrypted, - }), - Err(_) => Err(PrecompileFailure::Revert { - exit_status: ExitRevert::Reverted, - output: vec![], - }), + Ok(decrypted) => Ok((ExitSucceed::Returned, decrypted)), + Err(_) => Err(ExitError::Reverted), } } -pub(super) fn call_keypair_generate(handle: &mut impl PrecompileHandle) -> PrecompileResult { +pub(super) fn call_keypair_generate( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState, +{ let (method, seed): ( solabi::U256, // method solabi::Bytes>, // seed - ) = solabi::decode(handle.input()).map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(e.to_string().into()), - })?; + ) = solabi::decode(input) + .map_err(|e| ExitError::Exception(ExitException::Other(e.to_string().into())))?; - let method: usize = method.try_into().map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("method identifier out of bounds".into()), + let method: usize = method.try_into().map_err(|_| { + ExitError::Exception(ExitException::Other( + "method identifier out of bounds".into(), + )) })?; let sig_type: SignatureType = >::try_into(method) - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("method identifier out of bounds".into()), + .map_err(|_| { + ExitError::Exception(ExitException::Other( + "method identifier out of bounds".into(), + )) })? .try_into() - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("unknown signature type".into()), - })?; + .map_err(|_| ExitError::Exception(ExitException::Other("unknown signature type".into())))?; record_linear_cost( - handle, - handle.input().len() as u64, + gasometer, + input.len() as u64, *KEYPAIR_GENERATE_BASE_COST .get(&sig_type) - .ok_or(PrecompileFailure::Error { - exit_status: ExitError::Other("unknown signature type".into()), - })?, + .ok_or(ExitError::Exception(ExitException::Other( + "unknown signature type".into(), + )))?, 0, )?; let signer = signature::MemorySigner::new_from_seed(sig_type, seed.as_bytes()).map_err(|err| { - PrecompileFailure::Error { - exit_status: ExitError::Other(format!("error creating signer: {err}").into()), - } + ExitError::Exception(ExitException::Other( + format!("error creating signer: {err}").into(), + )) })?; let public = signer.public_key().as_bytes().to_vec(); let private = signer.to_bytes(); + let output = solabi::encode(&(solabi::Bytes(public), solabi::Bytes(private))); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&(solabi::Bytes(public), solabi::Bytes(private))), - }) + Ok((ExitSucceed::Returned, output)) } -pub(super) fn call_sign(handle: &mut impl PrecompileHandle) -> PrecompileResult { +pub(super) fn call_sign( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState, +{ #[allow(clippy::type_complexity)] let (typ, pk, ctx, msg): ( solabi::U256, // signature type solabi::Bytes>, // private key solabi::Bytes>, // context or precomputed hash bytes solabi::Bytes>, // message; should be zero-length if precomputed hash given - ) = solabi::decode(handle.input()).map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(e.to_string().into()), - })?; + ) = solabi::decode(input) + .map_err(|e| ExitError::Exception(ExitException::Other(e.to_string().into())))?; let message = msg.as_bytes(); let ctx_or_hash = ctx.as_bytes(); let pk = pk.as_bytes(); - let method: usize = typ.try_into().map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("signature type identifier out of bounds".into()), + let method: usize = typ.try_into().map_err(|_| { + ExitError::Exception(ExitException::Other( + "signature type identifier out of bounds".into(), + )) })?; let sig_type: SignatureType = >::try_into(method) - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("signature type identifier out of bounds".into()), + .map_err(|_| { + ExitError::Exception(ExitException::Other( + "signature type identifier out of bounds".into(), + )) })? .try_into() - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("unknown signature type".into()), - })?; + .map_err(|_| ExitError::Exception(ExitException::Other("unknown signature type".into())))?; let costs = *SIGN_MESSAGE_COST .get(&sig_type) - .ok_or(PrecompileFailure::Error { - exit_status: ExitError::Other("unknown signature type".into()), - })?; - record_linear_cost(handle, handle.input().len() as u64, costs.0, costs.1)?; + .ok_or(ExitError::Exception(ExitException::Other( + "unknown signature type".into(), + )))?; + record_linear_cost(gasometer, input.len() as u64, costs.0, costs.1)?; let signer = signature::MemorySigner::from_bytes(sig_type, pk).map_err(|e| { - PrecompileFailure::Error { - exit_status: ExitError::Other(format!("error creating signer: {e}").into()), - } + ExitError::Exception(ExitException::Other( + format!("error creating signer: {e}").into(), + )) })?; let result = signer.sign_by_type(sig_type, ctx_or_hash, message); - let result = result.map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(format!("error signing message: {e}").into()), + let result = result.map_err(|e| { + ExitError::Exception(ExitException::Other( + format!("error signing message: {e}").into(), + )) })?; + let output = result.into(); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: result.into(), - }) + Ok((ExitSucceed::Returned, output)) } -pub(super) fn call_verify(handle: &mut impl PrecompileHandle) -> PrecompileResult { +pub(super) fn call_verify( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState, +{ #[allow(clippy::type_complexity)] let (typ, pk, ctx, msg, sig): ( solabi::U256, // signature type @@ -341,46 +389,44 @@ pub(super) fn call_verify(handle: &mut impl PrecompileHandle) -> PrecompileResul solabi::Bytes>, // context or precomputed hash bytes solabi::Bytes>, // message; should be zero-length if precomputed hash given solabi::Bytes>, // signature - ) = solabi::decode(handle.input()).map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(e.to_string().into()), - })?; + ) = solabi::decode(input) + .map_err(|e| ExitError::Exception(ExitException::Other(e.to_string().into())))?; let signature = sig.to_vec(); let message = msg.as_bytes(); let ctx_or_hash = ctx.as_bytes(); let pk = pk.as_bytes(); - let method: usize = typ.try_into().map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("signature type identifier out of bounds".into()), + let method: usize = typ.try_into().map_err(|_| { + ExitError::Exception(ExitException::Other( + "signature type identifier out of bounds".into(), + )) })?; let sig_type: SignatureType = >::try_into(method) - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("signature type identifier out of bounds".into()), + .map_err(|_| { + ExitError::Exception(ExitException::Other( + "signature type identifier out of bounds".into(), + )) })? .try_into() - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("unknown signature type".into()), - })?; + .map_err(|_| ExitError::Exception(ExitException::Other("unknown signature type".into())))?; let costs = *VERIFY_MESSAGE_COST .get(&sig_type) - .ok_or(PrecompileFailure::Error { - exit_status: ExitError::Other("unknown signature type".into()), - })?; - record_linear_cost(handle, handle.input().len() as u64, costs.0, costs.1)?; + .ok_or(ExitError::Exception(ExitException::Other( + "unknown signature type".into(), + )))?; + record_linear_cost(gasometer, input.len() as u64, costs.0, costs.1)?; let signature: signature::Signature = signature.into(); - let public_key = - signature::PublicKey::from_bytes(sig_type, pk).map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("error reading public key".into()), - })?; + let public_key = signature::PublicKey::from_bytes(sig_type, pk).map_err(|_| { + ExitError::Exception(ExitException::Other("error reading public key".into())) + })?; let result = public_key.verify_by_type(sig_type, ctx_or_hash, message, &signature); + let output = solabi::encode(&(result.is_ok(),)); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&(result.is_ok(),)), - }) + Ok((ExitSucceed::Returned, output)) } #[cfg(test)] @@ -392,7 +438,7 @@ mod test { use oasis_runtime_sdk::crypto::signature::{self, SignatureType}; - use crate::precompile::{testing::*, PrecompileResult}; + use crate::precompile::testing::*; #[test] fn test_x25519_derive() { @@ -411,8 +457,7 @@ mod test { &blob, 1_000_000, ) - .expect("call should return something") - .expect("call should succeed"); + .unwrap(); // Not enough gas. call_contract( @@ -422,7 +467,6 @@ mod test { &blob, 1_000, ) - .expect("call should return something") .expect_err("call should fail"); // Test with known values. @@ -445,9 +489,7 @@ mod test { &blob, 1_000_000, ) - .expect("call should return something") - .expect("call should succeed") - .output; + .unwrap(); assert_eq!( hex::encode(&output), "e69ac21066a8c2284e8fdc690e579af4513547b9b31dd144792c1904b45cf586" @@ -471,8 +513,7 @@ mod test { &blob, 1_000_000, ) - .expect("call should return something") - .expect("call should succeed"); + .unwrap(); }); } @@ -491,8 +532,7 @@ mod test { &blob, 1_000_000, ) - .expect("call should return something") - .expect("call should succeed"); + .unwrap(); }); } @@ -514,9 +554,8 @@ mod test { )), 10_000_000, ) - .expect("call should return something") - .expect("call should succeed"); - assert_ne!(plaintext.as_slice(), ret_ct.output); + .unwrap(); + assert_ne!(plaintext.as_slice(), &ret_ct); let ret_pt = call_contract( H160([ @@ -525,14 +564,13 @@ mod test { &solabi::encode(&( solabi::Bytes(key.to_vec()), solabi::Bytes(nonce.to_vec()), - solabi::Bytes(ret_ct.output.to_vec()), + solabi::Bytes(ret_ct), solabi::Bytes(ad.to_vec()), )), 10_000_000, ) - .expect("call should return something") - .expect("call should succeed"); - assert_eq!(plaintext.as_slice(), ret_pt.output); + .unwrap(); + assert_eq!(plaintext.as_slice(), ret_pt); } #[test] @@ -542,10 +580,10 @@ mod test { 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ]), &solabi::encode(&(solabi::U256::new(4_u128), solabi::Bytes(vec![0xbe, 0xef]))), - 10_560, + 40_000, ) .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), "beef0203"); + assert_eq!(ret.len(), 4); } #[bench] @@ -567,8 +605,7 @@ mod test { )), 10_000_000, ) - .expect("call should return something") - .expect("call should succeed"); + .unwrap(); }); } @@ -591,8 +628,7 @@ mod test { )), 10_000_000, ) - .expect("call should return something") - .expect("call should succeed"); + .unwrap(); }); } @@ -608,7 +644,6 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") .expect_err("call should fail as it has an extra byte of input"); let params = @@ -621,9 +656,7 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") - .expect("call should succeed") - .output; + .unwrap(); assert_eq!( hex::encode(output), @@ -645,7 +678,6 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") .expect_err("call should fail"); // Working test. @@ -660,9 +692,7 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") - .expect("call should succeed") - .output; + .unwrap(); // Again, should be repeatable. let params = solabi::encode(&( @@ -676,9 +706,7 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") - .expect("call should succeed") - .output; + .unwrap(); assert_eq!(output1, output2); } @@ -701,8 +729,7 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") - .expect("call should succeed") + .unwrap(); }); } @@ -756,9 +783,7 @@ mod test { ¶ms, 10_000_000, ) - .unwrap() - .unwrap() - .output; + .unwrap(); let (public_key, private_key): (solabi::Bytes>, solabi::Bytes>) = solabi::decode(&output).expect("decode should succeed"); @@ -772,18 +797,14 @@ mod test { solabi::Bytes(context.to_vec()), solabi::Bytes(message.to_vec()), )); - let output = call_contract( + let signature = call_contract( H160([ 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x06, ]), ¶ms, 10_000_000, ) - .unwrap() - .unwrap() - .output; - - let signature = output.to_vec(); + .unwrap(); // Verify signature. let params = solabi::encode(&( @@ -800,9 +821,7 @@ mod test { ¶ms, 10_000_000, ) - .unwrap() - .unwrap() - .output; + .unwrap(); let status: bool = solabi::decode(&output).expect("decode should succeed"); assert!(status); } @@ -855,9 +874,7 @@ mod test { ¶ms, 10_000_000, ) - .unwrap() - .unwrap() - .output; + .unwrap(); let (public_key, private_key): (solabi::Bytes>, solabi::Bytes>) = solabi::decode(&output).expect("decode should succeed"); @@ -871,18 +888,14 @@ mod test { solabi::Bytes(hasher(message)), solabi::Bytes(Vec::new()), )); - let output = call_contract( + let signature = call_contract( H160([ 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x06, ]), ¶ms, 10_000_000, ) - .unwrap() - .unwrap() - .output; - - let signature = output.to_vec(); + .unwrap(); // Verify signature. let params = solabi::encode(&( @@ -899,9 +912,7 @@ mod test { ¶ms, 10_000_000, ) - .unwrap() - .unwrap() - .output; + .unwrap(); let status: bool = solabi::decode(&output).expect("decode should succeed"); assert!(status); } @@ -914,7 +925,7 @@ mod test { pk: Option<&[u8]>, context: Option<&[u8]>, message: Option<&[u8]>, - ) -> Option { + ) -> Result, String> { let def_pk = signature::MemorySigner::new_from_seed( SignatureType::Ed25519_Oasis, b"01234567890123456789012345678901", @@ -946,19 +957,13 @@ mod test { } // Bogus method. - push_all_and_test(Some(55), None, None, None) - .expect("call should return something") - .expect_err("call should fail"); + push_all_and_test(Some(55), None, None, None).expect_err("call should fail"); // All ok, with context. - push_all_and_test(None, None, None, None) - .expect("call should return something") - .expect("call should succeed"); + push_all_and_test(None, None, None, None).expect("call should succeed"); // All ok, raw. - push_all_and_test(None, None, Some(b""), None) - .expect("call should return something") - .expect("call should succeed"); + push_all_and_test(None, None, Some(b""), None).expect("call should succeed"); } fn bench_signer( @@ -1006,7 +1011,6 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") .expect("call should succeed"); }); } @@ -1084,7 +1088,7 @@ mod test { signature: Option<&[u8]>, context: Option<&[u8]>, message: Option<&[u8]>, - ) -> Option { + ) -> Result, String> { let def_pk = signature::MemorySigner::new_from_seed( SignatureType::Ed25519_Oasis, b"01234567890123456789012345678901", @@ -1118,35 +1122,24 @@ mod test { } // Bogus method. - push_all_and_test(Some(55), None, None, None, None) - .expect("call should return something") - .expect_err("call should fail"); + push_all_and_test(Some(55), None, None, None, None).expect_err("call should fail"); // Invalid public key. let zeroes: Vec = vec![0; 32]; - let mut output = push_all_and_test(None, Some(&zeroes), None, None, None) - .expect("call should return something") - .expect("call should succeed") - .output; + let output = push_all_and_test(None, Some(&zeroes), None, None, None).unwrap(); // Verification should have failed. let status: bool = solabi::decode(&output).expect("decode should succeed"); assert!(!status); // Invalid signature. let long_zeroes: Vec = vec![0; 64]; - output = push_all_and_test(None, None, Some(&long_zeroes), None, None) - .expect("call should return something") - .expect("call should succeed") - .output; + let output = push_all_and_test(None, None, Some(&long_zeroes), None, None).unwrap(); // Verification should have failed. let status: bool = solabi::decode(&output).expect("decode should succeed"); assert!(!status); // All ok. - output = push_all_and_test(None, None, None, None, None) - .expect("call should return something") - .expect("call should succeed") - .output; + let output = push_all_and_test(None, None, None, None, None).unwrap(); let status: bool = solabi::decode(&output).expect("decode should succeed"); assert!(status); } @@ -1198,8 +1191,7 @@ mod test { ¶ms, 10_000_000, ) - .expect("call should return something") - .expect("call should succeed"); + .unwrap(); }); } diff --git a/runtime-sdk/modules/evm/src/precompile/contract.rs b/runtime-sdk/modules/evm/src/precompile/contract.rs index 03587e01654..58af789aec4 100644 --- a/runtime-sdk/modules/evm/src/precompile/contract.rs +++ b/runtime-sdk/modules/evm/src/precompile/contract.rs @@ -1,9 +1,9 @@ use evm::{ - executor::stack::{PrecompileFailure, PrecompileHandle}, - ExitError, + interpreter::runtime::{RuntimeBackend, RuntimeState}, + GasMutState, }; -use crate::precompile::PrecompileResult; +use super::{PrecompileError, PrecompileResult}; /// A static contract is a contract whose implementation is provided by the /// runtime, much like the runtime provides function implementations at @@ -14,7 +14,11 @@ pub trait StaticContract { /// Dispatch a contract method call to a particular method of the /// implementing struct. - fn dispatch_call(handle: &mut impl PrecompileHandle) -> Option; + fn dispatch_call + GasMutState, H: RuntimeBackend>( + input: &[u8], + gasometer: &mut G, + handler: &mut H, + ) -> PrecompileResult; } /// Helper trait for emitting EVM events. @@ -24,7 +28,10 @@ pub trait StaticContract { /// automatically encode event parameters into the format required by the EVM. pub trait EvmEvent { /// Encode the event's data into the required EVM log format end emit it. - fn emit(&self, handle: &mut impl PrecompileHandle) -> Result<(), ExitError>; + fn emit( + &self, + handler: &mut H, + ) -> Result<(), PrecompileError>; } /// Helper trait for raising errors. @@ -35,5 +42,5 @@ pub trait EvmEvent { pub trait EvmError { /// Encode the error's type and parameters into the format specified by the /// EVM ABI and wrap it into a failure sruct used by the executor. - fn encode(&self) -> PrecompileFailure; + fn encode(&self) -> PrecompileError; } diff --git a/runtime-sdk/modules/evm/src/precompile/erc20.rs b/runtime-sdk/modules/evm/src/precompile/erc20.rs index 570c2ebfdf9..bb92f20d61b 100644 --- a/runtime-sdk/modules/evm/src/precompile/erc20.rs +++ b/runtime-sdk/modules/evm/src/precompile/erc20.rs @@ -1,8 +1,9 @@ use std::marker::PhantomData; use evm::{ - executor::stack::{PrecompileHandle, PrecompileOutput}, - ExitSucceed, + backend::RuntimeBackend, + interpreter::{runtime::RuntimeState, ExitSucceed}, + GasMutState, }; use oasis_runtime_sdk::{ modules::accounts::{Error as AccountsError, API as AccountsAPI}, @@ -13,7 +14,7 @@ use primitive_types::H160; use crate::precompile::{ contract::{EvmError as _, EvmEvent as _}, - PrecompileResult, + PrecompileResult, PrecompileSuccess, }; const MODULE_NAME: &str = "evm/erc20"; @@ -334,91 +335,125 @@ impl Erc20Contract { } #[evm_method(signature = "name()")] - fn name(handle: &mut impl PrecompileHandle, _input_offset: usize) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.name)?; - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&[T::NAME.to_string()]), - }) + fn name( + gasometer: &mut impl GasMutState, + _handler: &mut impl RuntimeBackend, + _input_offset: usize, + ) -> PrecompileResult { + gasometer.record_gas(T::GAS_COSTS.name.into())?; + Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&[T::NAME.to_string()]), + )) } #[evm_method(signature = "symbol()")] - fn symbol(handle: &mut impl PrecompileHandle, _input_offset: usize) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.symbol)?; - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&[T::SYMBOL.to_string()]), - }) + fn symbol( + gasometer: &mut impl GasMutState, + _handler: &mut impl RuntimeBackend, + _input_offset: usize, + ) -> PrecompileResult { + gasometer.record_gas(T::GAS_COSTS.symbol.into())?; + Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&[T::SYMBOL.to_string()]), + )) } #[evm_method(signature = "decimals()")] - fn decimals(handle: &mut impl PrecompileHandle, _input_offset: usize) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.decimals)?; - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&[T::DECIMALS as u128]), - }) + fn decimals( + gasometer: &mut impl GasMutState, + _handler: &mut impl RuntimeBackend, + _input_offset: usize, + ) -> PrecompileResult { + gasometer.record_gas(T::GAS_COSTS.decimals.into())?; + Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&[T::DECIMALS as u128]), + )) } #[evm_method(signature = "totalSupply()")] - fn total_supply(handle: &mut impl PrecompileHandle, _input_offset: usize) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.total_supply)?; + fn total_supply( + gasometer: &mut impl GasMutState, + _handler: &mut impl RuntimeBackend, + _input_offset: usize, + ) -> PrecompileResult { + gasometer.record_gas(T::GAS_COSTS.total_supply.into())?; match T::total_supply() { - Ok(amount) => Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&amount), - }), + Ok(amount) => Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&amount), + )), Err(e) => Err(e.encode()), } } #[evm_method(signature = "balanceOf(address)", convert)] - fn balance_of(handle: &mut impl PrecompileHandle, address: H160) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.balace_of)?; + fn balance_of( + gasometer: &mut impl GasMutState, + _handler: &mut impl RuntimeBackend, + address: H160, + ) -> PrecompileResult { + gasometer.record_gas(T::GAS_COSTS.balace_of.into())?; match T::balance_of(&address) { - Ok(amount) => Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&amount), - }), + Ok(amount) => Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&amount), + )), Err(e) => Err(e.encode()), } } #[evm_method(signature = "transfer(address,uint256)", convert)] - fn transfer( - handle: &mut impl PrecompileHandle, + fn transfer( + gasometer: &mut G, + handler: &mut impl RuntimeBackend, recipient: H160, amount: u128, - ) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.transfer)?; - let sender = handle.context().caller; + ) -> PrecompileResult + where + G: AsRef + GasMutState, + { + gasometer.record_gas(T::GAS_COSTS.transfer.into())?; + + let state: &RuntimeState = gasometer.as_ref(); + let sender = state.context.caller; + match T::transfer(&sender, &recipient, amount) { Ok(done) => { TransferEvent { - from: solabi::Address(handle.context().caller.into()), + from: solabi::Address(sender.into()), to: solabi::Address(recipient.into()), value: solabi::U256::from(amount), } - .emit::(handle) + .emit::(handler) .unwrap(); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&done), - }) + Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&done), + )) } Err(e) => Err(e.encode()), } } #[evm_method(signature = "transferFrom(address,address,uint256)", convert)] - fn transfer_from( - handle: &mut impl PrecompileHandle, + fn transfer_from( + gasometer: &mut G, + handler: &mut impl RuntimeBackend, owner: H160, recipient: H160, amount: u128, - ) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.transfer_from)?; - let caller = handle.context().caller; + ) -> PrecompileResult + where + G: AsRef + GasMutState, + { + gasometer.record_gas(T::GAS_COSTS.transfer_from.into())?; + + let state: &RuntimeState = gasometer.as_ref(); + let caller = state.context.caller; + match T::transfer_from(&owner, &caller, &recipient, amount) { Ok(done) => { TransferEvent { @@ -426,25 +461,32 @@ impl Erc20Contract { to: solabi::Address(recipient.into()), value: solabi::U256::from(amount), } - .emit::(handle) + .emit::(handler) .unwrap(); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&[done]), - }) + Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&[done]), + )) } Err(e) => Err(e.encode()), } } #[evm_method(signature = "approve(address,uint256)", convert)] - fn approve( - handle: &mut impl PrecompileHandle, + fn approve( + gasometer: &mut G, + handler: &mut impl RuntimeBackend, spender: H160, amount: u128, - ) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.approve)?; - let owner = handle.context().caller; + ) -> PrecompileResult + where + G: AsRef + GasMutState, + { + gasometer.record_gas(T::GAS_COSTS.approve.into())?; + + let state: &RuntimeState = gasometer.as_ref(); + let owner = state.context.caller; + match T::approve(&owner, &spender, amount) { Ok(done) => { ApprovalEvent { @@ -452,12 +494,12 @@ impl Erc20Contract { spender: solabi::Address(spender.into()), value: solabi::U256::from(amount), } - .emit::(handle) + .emit::(handler) .unwrap(); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&[done]), - }) + Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&[done]), + )) } Err(e) => Err(e.encode()), } @@ -465,24 +507,37 @@ impl Erc20Contract { #[evm_method(signature = "allowance(address,address)", convert)] fn allowance( - handle: &mut impl PrecompileHandle, + gasometer: &mut impl GasMutState, + _handler: &mut impl RuntimeBackend, owner: H160, spender: H160, ) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.allowance)?; + gasometer.record_gas(T::GAS_COSTS.allowance.into())?; + match T::allowance(&owner, &spender) { - Ok(amount) => Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&amount), - }), + Ok(amount) => Ok(PrecompileSuccess::new( + ExitSucceed::Returned, + solabi::encode(&amount), + )), Err(e) => Err(e.encode()), } } #[evm_method(signature = "mint(address,uint256)", convert)] - fn mint(handle: &mut impl PrecompileHandle, to: H160, amount: u128) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.mint)?; - let caller = handle.context().caller; + fn mint( + gasometer: &mut G, + handler: &mut impl RuntimeBackend, + to: H160, + amount: u128, + ) -> PrecompileResult + where + G: AsRef + GasMutState, + { + gasometer.record_gas(T::GAS_COSTS.mint.into())?; + + let state: &RuntimeState = gasometer.as_ref(); + let caller = state.context.caller; + match T::mint(&caller, &to, amount) { Ok(_) => { TransferEvent { @@ -490,21 +545,29 @@ impl Erc20Contract { to: solabi::Address(to.into()), value: solabi::U256::from(amount), } - .emit::(handle) + .emit::(handler) .unwrap(); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }) + Ok(PrecompileSuccess::new(ExitSucceed::Returned, vec![])) } Err(e) => Err(e.encode()), } } #[evm_method(signature = "burn(address,uint256)", convert)] - fn burn(handle: &mut impl PrecompileHandle, from: H160, amount: u128) -> PrecompileResult { - handle.record_cost(T::GAS_COSTS.burn)?; - let caller = handle.context().caller; + fn burn( + gasometer: &mut G, + handler: &mut impl RuntimeBackend, + from: H160, + amount: u128, + ) -> PrecompileResult + where + G: AsRef + GasMutState, + { + gasometer.record_gas(T::GAS_COSTS.burn.into())?; + + let state: &RuntimeState = gasometer.as_ref(); + let caller = state.context.caller; + match T::burn(&caller, &from, amount) { Ok(_) => { TransferEvent { @@ -512,12 +575,9 @@ impl Erc20Contract { to: solabi::Address(H160::zero().into()), value: solabi::U256::from(amount), } - .emit::(handle) + .emit::(handler) .unwrap(); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }) + Ok(PrecompileSuccess::new(ExitSucceed::Returned, vec![])) } Err(e) => Err(e.encode()), } diff --git a/runtime-sdk/modules/evm/src/precompile/gas.rs b/runtime-sdk/modules/evm/src/precompile/gas.rs index aa7ad22f460..e02b39965b8 100644 --- a/runtime-sdk/modules/evm/src/precompile/gas.rs +++ b/runtime-sdk/modules/evm/src/precompile/gas.rs @@ -1,55 +1,68 @@ use evm::{ - executor::stack::{PrecompileFailure, PrecompileHandle, PrecompileOutput}, - ExitError, ExitSucceed, + interpreter::{ExitError, ExitException, ExitSucceed}, + standard::GasometerState, + GasMutState, }; -use super::PrecompileResult; +use crate::engine::state::ParentGasInfo; const GAS_USED_COST: u64 = 10; const PAD_GAS_COST: u64 = 10; -pub(super) fn call_gas_used(handle: &mut impl PrecompileHandle) -> PrecompileResult { - handle.record_cost(GAS_USED_COST)?; +pub(super) fn call_gas_used( + _input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState + AsRef + ParentGasInfo, +{ + gasometer.record_gas(GAS_USED_COST.into())?; - let used_gas: u64 = handle.used_gas(); + let used_gas: u64 = total_used_gas(gasometer); + let output = solabi::encode(&(used_gas,)); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&(used_gas,)), - }) + Ok((ExitSucceed::Returned, output)) } -pub(super) fn call_pad_gas(handle: &mut impl PrecompileHandle) -> PrecompileResult { - handle.record_cost(PAD_GAS_COST)?; +pub(super) fn call_pad_gas( + input: &[u8], + gasometer: &mut G, +) -> Result<(ExitSucceed, Vec), ExitError> +where + G: GasMutState + AsRef + ParentGasInfo, +{ + gasometer.record_gas(PAD_GAS_COST.into())?; // Decode args. - let gas_amount_big: u128 = - solabi::decode(handle.input()).map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(e.to_string().into()), - })?; + let gas_amount_big: u128 = solabi::decode(input) + .map_err(|e| ExitError::Exception(ExitException::Other(e.to_string().into())))?; let gas_amount = gas_amount_big.try_into().unwrap_or(u64::MAX); - // Obtain total used gas so far. - let used_gas = handle.used_gas(); + let used_gas: u64 = total_used_gas(gasometer); - // Fail if more gas that the desired padding was already used. + // Fail if more gas than the desired padding was already used. if gas_amount < used_gas { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other( - "gas pad amount less than already used gas" - .to_string() - .into(), - ), - }); + return Err(ExitError::Exception(ExitException::Other( + "gas pad amount less than already used gas" + .to_string() + .into(), + ))); } // Record the remainder so that the gas use is padded to the desired amount. - handle.record_cost(gas_amount - used_gas)?; + gasometer.record_gas((gas_amount - used_gas).into())?; - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: Vec::new(), - }) + Ok((ExitSucceed::Returned, Vec::new())) +} + +fn total_used_gas(gasometer: &G) -> u64 +where + G: AsRef + ParentGasInfo, +{ + let gs: &GasometerState = gasometer.as_ref(); + let frame_used: u64 = gs.total_used_gas(); + let parent_used: u64 = gasometer.parent_used_gas().try_into().unwrap_or(u64::MAX); + parent_used.saturating_add(frame_used) } #[cfg(test)] @@ -69,22 +82,32 @@ mod test { include_str!("../../../../../tests/e2e/evm/contracts/use_gas/evm_use_gas.hex"); #[test] - fn test_call_gas_used() { + fn test_call_gas_used_basic() { // Test basic. let ret = call_contract( H160([ 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x09, ]), &solabi::encode(&(solabi::Bytes(Vec::new()),)), - 10_560, + 30_000, ) .unwrap(); - let gas_usage_big: u128 = - solabi::decode(&ret.unwrap().output).expect("call should return gas usage"); + let expected_gas_usage: u64 = + 21_000 /* base call transaction cost */ + + 4*63 /* zero data cost */ + + 16 /* non-zero data cost */ + + 10 /* precompile cost */; + let gas_usage_big: u128 = solabi::decode(&ret).expect("call should return gas usage"); let gas_usage: u64 = gas_usage_big.try_into().unwrap_or(u64::max_value()); - assert_eq!(gas_usage, 10, "call should return gas usage"); + assert_eq!( + gas_usage, expected_gas_usage, + "call should return gas usage" + ); + } + #[test] + fn test_call_gas_used_contract() { // Test use gas in contract. let mut mock = Mock::default(); let ctx = mock.create_ctx_for_runtime::(false); @@ -93,7 +116,7 @@ mod test { // Create contract. let contract_address = init_and_deploy_contract(&ctx, &mut signer, TEST_CONTRACT_CODE_HEX); - let expected_gas_used = 22_659; + let expected_gas_used = 25_164; // Call into the test contract. let dispatch_result = signer.call_evm( @@ -126,30 +149,28 @@ mod test { 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa, ]), &solabi::encode(&(1_u64,)), - 10_560, + 40_000, ) - .expect("call should return something") .expect_err("call should fail as the input gas amount is to small"); let ret = call_contract( H160([ 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa, ]), - &solabi::encode(&(20_u64,)), - 10_560, + &solabi::encode(&(30_000u64,)), + 40_000, ) .unwrap(); - assert_eq!(ret.unwrap().output.len(), 0); + assert_eq!(ret.len(), 0); // Test out of gas. call_contract( H160([ 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xa, ]), - &solabi::encode(&(20_000_u64,)), - 10_560, + &solabi::encode(&(50_000_u64,)), + 40_000, ) - .expect("call should return something") .expect_err("call should fail as the gas limit is reached"); // Test gas padding. @@ -160,7 +181,7 @@ mod test { // Create contract. let contract_address = init_and_deploy_contract(&ctx, &mut signer, TEST_CONTRACT_CODE_HEX); - let expected_gas = 41_359; + let expected_gas = 50_156; // Call into the test contract path for `if param > 10`. let dispatch_result = signer.call_evm( diff --git a/runtime-sdk/modules/evm/src/precompile/mod.rs b/runtime-sdk/modules/evm/src/precompile/mod.rs index f7b27eb7b44..612a20136f3 100644 --- a/runtime-sdk/modules/evm/src/precompile/mod.rs +++ b/runtime-sdk/modules/evm/src/precompile/mod.rs @@ -1,36 +1,73 @@ //! EVM precompiles. -use std::{cmp::min, marker::PhantomData}; +use std::marker::PhantomData; use evm::{ - executor::stack::{ - IsPrecompileResult, PrecompileFailure, PrecompileHandle, PrecompileOutput, PrecompileSet, + interpreter::{ + runtime::{RuntimeBackend, RuntimeState}, + ExitError, ExitSucceed, }, - ExitError, + standard::{GasometerState, PrecompileSet}, + GasMutState, }; +use oasis_runtime_sdk::Context; use primitive_types::H160; -use crate::{backend::EVMBackendExt, Config}; +use crate::{engine::state::ParentGasInfo, Config}; mod confidential; pub mod contract; pub mod erc20; mod gas; mod sha2; -mod standard; mod subcall; #[cfg(any(test, feature = "test"))] pub mod testing; -// Some types matching evm::executor::stack. -type PrecompileResult = Result; +/// An error returned by an EVM precompile, together with the output. +#[derive(Clone, Debug)] +pub struct PrecompileError { + pub error: ExitError, + pub output: Vec, +} + +impl PrecompileError { + pub fn new(error: ExitError, output: Vec) -> Self { + Self { error, output } + } +} + +impl From for PrecompileError { + fn from(error: ExitError) -> Self { + Self { + error, + output: Vec::new(), + } + } +} + +/// A successful result returned by an EVM precompile, together with the output. +#[derive(Clone, Debug)] +pub struct PrecompileSuccess { + pub status: ExitSucceed, + pub output: Vec, +} + +impl PrecompileSuccess { + pub fn new(status: ExitSucceed, output: Vec) -> Self { + Self { status, output } + } +} + +/// A result returned by an EVM precompile, either success or error. +pub type PrecompileResult = Result; macro_rules! ensure_gas { ($math:expr) => { - $math.ok_or(PrecompileFailure::Error { - exit_status: ExitError::OutOfGas, - })? + $math.ok_or(evm::interpreter::ExitError::Exception( + evm::interpreter::ExitException::OutOfGas, + ))? }; } @@ -40,154 +77,118 @@ fn bytes_to_words(bytes: u64) -> u64 { } /// Records linear gas cost: base + word*ceil(len/32) -fn record_linear_cost( - handle: &mut impl PrecompileHandle, +fn record_linear_cost( + gasometer: &mut G, len: u64, base: u64, word: u64, -) -> Result<(), PrecompileFailure> { - record_multilinear_cost(handle, len, 0, word, 0, base) +) -> Result<(), evm::interpreter::ExitError> { + record_multilinear_cost(gasometer, len, 0, word, 0, base) } // Records a*ceil(x/32) + b*ceil(y/32) + c, or an error if out of gas. -fn record_multilinear_cost( - handle: &mut impl PrecompileHandle, +fn record_multilinear_cost( + gasometer: &mut G, x: u64, y: u64, a: u64, b: u64, c: u64, -) -> Result<(), PrecompileFailure> { +) -> Result<(), evm::interpreter::ExitError> { let cost = c; let ax = ensure_gas!(a.checked_mul(bytes_to_words(x))); let by = ensure_gas!(b.checked_mul(bytes_to_words(y))); let cost = ensure_gas!(cost.checked_add(ax)); let cost = ensure_gas!(cost.checked_add(by)); - handle.record_cost(cost)?; + gasometer.record_gas(cost.into())?; Ok(()) } -/// Copies bytes from source to target. -fn read_input(source: &[u8], target: &mut [u8], offset: usize) { - if source.len() <= offset { - return; - } - - let len = min(target.len(), source.len() - offset); - target[..len].copy_from_slice(&source[offset..offset + len]); -} - -pub(crate) struct Precompiles<'a, Cfg: Config, B: EVMBackendExt> { - backend: &'a B, +pub(crate) struct Precompiles<'a, Cfg: Config, C: Context> { + ctx: &'a C, config: PhantomData, } -impl<'a, Cfg: Config, B: EVMBackendExt> Precompiles<'a, Cfg, B> { - pub(crate) fn new(backend: &'a B) -> Self { +impl<'a, Cfg: Config, C: Context> Precompiles<'a, Cfg, C> { + pub(crate) fn new(ctx: &'a C) -> Self { Self { - backend, + ctx, config: PhantomData, } } } -impl PrecompileSet for Precompiles<'_, Cfg, B> { - fn execute(&self, handle: &mut impl PrecompileHandle) -> Option { - let address = handle.code_address(); - match self.is_precompile(address, handle.remaining_gas()) { - IsPrecompileResult::Answer { - is_precompile: true, - extra_cost, - } => { - if let Err(e) = handle.record_cost(extra_cost) { - return Some(Err(e.into())); - } - } - IsPrecompileResult::OutOfGas => { - return Some(Err(ExitError::OutOfGas.into())); - } - _ => { - return None; - } +impl PrecompileSet for Precompiles<'_, Cfg, C> +where + Cfg: Config, + C: Context, + G: AsRef + + AsRef + + AsRef + + GasMutState + + ParentGasInfo, + H: RuntimeBackend, +{ + fn execute( + &self, + code_address: H160, + input: &[u8], + gasometer: &mut G, + handler: &mut H, + ) -> Option<(evm::interpreter::ExitResult, Vec)> { + // First try the standard Ethereum precompiles. + let std_precompiles = evm_precompile::StandardPrecompileSet; + if let Some(result) = std_precompiles.execute(code_address, input, gasometer, handler) { + return Some(result); } - Some(match (address[0], address[18], address[19]) { - // Ethereum-compatible. - // 0x0000000000000000000000000000000000000001 - (0, 0, 1) => standard::call_ecrecover(handle), - // 0x0000000000000000000000000000000000000002 - (0, 0, 2) => standard::call_sha256(handle), - // 0x0000000000000000000000000000000000000003 - (0, 0, 3) => standard::call_ripemd160(handle), - // 0x0000000000000000000000000000000000000004 - (0, 0, 4) => standard::call_datacopy(handle), - // 0x0000000000000000000000000000000000000005 - (0, 0, 5) => standard::call_bigmodexp(handle), - // 0x0000000000000000000000000000000000000006 - (0, 0, 6) => standard::call_bn128_add(handle), - // 0x0000000000000000000000000000000000000007 - (0, 0, 7) => standard::call_bn128_mul(handle), - // 0x0000000000000000000000000000000000000008 - (0, 0, 8) => standard::call_bn128_pairing(handle), + + // Then try the Oasis-specific precompiles. + let result = match ( + code_address[0], + code_address[18], + code_address[19], + Cfg::CONFIDENTIAL, + ) { // Oasis-specific, confidential. // 0x0100000000000000000000000000000000000001 - (1, 0, 1) => confidential::call_random_bytes(handle, self.backend), + (1, 0, 1, true) => confidential::call_random_bytes(input, gasometer, self.ctx), // 0x0100000000000000000000000000000000000002 - (1, 0, 2) => confidential::call_x25519_derive(handle), + (1, 0, 2, true) => confidential::call_x25519_derive(input, gasometer), // 0x0100000000000000000000000000000000000003 - (1, 0, 3) => confidential::call_deoxysii_seal(handle), + (1, 0, 3, true) => confidential::call_deoxysii_seal(input, gasometer), // 0x0100000000000000000000000000000000000004 - (1, 0, 4) => confidential::call_deoxysii_open(handle), + (1, 0, 4, true) => confidential::call_deoxysii_open(input, gasometer), // 0x0100000000000000000000000000000000000005 - (1, 0, 5) => confidential::call_keypair_generate(handle), + (1, 0, 5, true) => confidential::call_keypair_generate(input, gasometer), // 0x0100000000000000000000000000000000000006 - (1, 0, 6) => confidential::call_sign(handle), + (1, 0, 6, true) => confidential::call_sign(input, gasometer), // 0x0100000000000000000000000000000000000007 - (1, 0, 7) => confidential::call_verify(handle), + (1, 0, 7, true) => confidential::call_verify(input, gasometer), // 0x0100000000000000000000000000000000000008 - (1, 0, 8) => confidential::call_curve25519_compute_public(handle), + (1, 0, 8, true) => confidential::call_curve25519_compute_public(input, gasometer), // 0x0100000000000000000000000000000000000009 - (1, 0, 9) => gas::call_gas_used(handle), + (1, 0, 9, true) => gas::call_gas_used(input, gasometer), // 0x010000000000000000000000000000000000000a - (1, 0, 10) => gas::call_pad_gas(handle), + (1, 0, 10, true) => gas::call_pad_gas(input, gasometer), // Oasis-specific, general. // 0x0100000000000000000000000000000000000101 - (1, 1, 1) => sha2::call_sha512_256(handle), + (1, 1, 1, _) => sha2::call_sha512_256(input, gasometer), // 0x0100000000000000000000000000000000000102 - (1, 1, 2) => sha2::call_sha512(handle), + (1, 1, 2, _) => sha2::call_sha512(input, gasometer), // 0x0100000000000000000000000000000000000103 - (1, 1, 3) => subcall::call_subcall(handle, self.backend), + (1, 1, 3, _) => subcall::call_subcall(code_address, input, gasometer, self.ctx), // 0x0100000000000000000000000000000000000104 - (1, 1, 4) => sha2::call_sha384(handle), - _ => return Cfg::additional_precompiles().and_then(|pc| pc.execute(handle)), - }) - } - - fn is_precompile(&self, address: H160, remaining_gas: u64) -> IsPrecompileResult { - // See above table in `execute` for matching on what is a valid precompile address. - let addr_bytes = address.as_bytes(); - let (a0, a18, a19) = (address[0], addr_bytes[18], addr_bytes[19]); - if address[1..18].iter().all(|b| *b == 0) - && matches!( - (a0, a18, a19, Cfg::CONFIDENTIAL), - // Ethereum-compatible. - (0, 0, 1..=8, _) | - // Oasis-specific, confidential. - (1, 0, 1..=10, true) | - // Oasis-specific, general. - (1, 1, 1..=4, _) - ) - { - IsPrecompileResult::Answer { - is_precompile: true, - extra_cost: 0, + (1, 1, 4, _) => sha2::call_sha384(input, gasometer), + _ => { + // If nothing matches, try additional precompiles. + return Cfg::additional_precompiles() + .and_then(|pc| pc.execute(code_address, input, gasometer, handler)); } - } else { - Cfg::additional_precompiles() - .map(|pc| pc.is_precompile(address, remaining_gas)) - .unwrap_or(IsPrecompileResult::Answer { - is_precompile: false, - extra_cost: 0, - }) + }; + + match result { + Ok((succeed, retval)) => Some((succeed.into(), retval)), + Err(err) => Some((err.into(), Vec::new())), } } } diff --git a/runtime-sdk/modules/evm/src/precompile/sha2.rs b/runtime-sdk/modules/evm/src/precompile/sha2.rs index 6355ce58b4f..c44685c9c67 100644 --- a/runtime-sdk/modules/evm/src/precompile/sha2.rs +++ b/runtime-sdk/modules/evm/src/precompile/sha2.rs @@ -1,21 +1,22 @@ //! Implements sha512_256 precompile. use evm::{ - executor::stack::{PrecompileHandle, PrecompileOutput}, - ExitSucceed, + interpreter::{ExitError, ExitSucceed}, + GasMutState, }; -use super::{record_linear_cost, PrecompileResult}; +use super::record_linear_cost; macro_rules! make_hasher { ($name:ident, $hasher:ident) => { - pub(super) fn $name(handle: &mut impl PrecompileHandle) -> PrecompileResult { + pub(super) fn $name( + input: &[u8], + gasometer: &mut G, + ) -> Result<(ExitSucceed, Vec), ExitError> { // Costs were computed by benchmarking and comparing to SHA256 and using the SHA256 costs (defined by EVM spec). // See benches/criterion_benchmark.rs for the benchmarks. - record_linear_cost(handle, handle.input().len() as u64, 115, 13)?; - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: ::digest(handle.input()).to_vec(), - }) + record_linear_cost(gasometer, input.len() as u64, 115, 13)?; + let output = ::digest(input).to_vec(); + Ok((ExitSucceed::Returned, output)) } }; } @@ -40,11 +41,10 @@ mod test { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, $ix, ]), &input_bytes, - 3000, - ) - .unwrap(); + 30_000, + ).unwrap(); assert_eq!( - hex::encode(ret.unwrap().output), + hex::encode(ret), hex::encode(::digest(&input_bytes)), ); } diff --git a/runtime-sdk/modules/evm/src/precompile/standard/bn128.rs b/runtime-sdk/modules/evm/src/precompile/standard/bn128.rs deleted file mode 100644 index a569298d790..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/standard/bn128.rs +++ /dev/null @@ -1,257 +0,0 @@ -use bn::{pairing_batch, AffineG1, AffineG2, Fq, Fq2, Fr, Group, Gt, G1, G2}; -use evm::{ - executor::stack::{PrecompileFailure, PrecompileHandle, PrecompileOutput}, - ExitError, ExitSucceed, -}; - -use crate::precompile::{read_input, PrecompileResult}; - -/// The gas cost for point addition on the alt-bn128 elliptic curve. -/// -/// See https://eips.ethereum.org/EIPS/eip-1108#specification. -const BN128_ADD_GAS_COST: u64 = 150; - -/// The gas cost for point multiplication on the alt-bn128 elliptic curve. -/// -/// See https://eips.ethereum.org/EIPS/eip-1108#specification. -const BN128_MUL_GAS_COST: u64 = 6000; - -/// The base gas cost for pairing on the alt-bn128 elliptic curve. -/// -/// See https://eips.ethereum.org/EIPS/eip-1108#specification. -const BN128_PAIRING_BASE_GAS_COST: u64 = 45_000; - -/// The check gas cost per pairing on the alt-bn128 elliptic curve. -/// -/// See https://eips.ethereum.org/EIPS/eip-1108#specification. -const BN128_PAIRING_CHECK_GAS_COST: u64 = 34_000; - -/// Point addition on the alt-bn128 elliptic curve. -pub fn call_bn128_add(handle: &mut impl PrecompileHandle) -> PrecompileResult { - handle.record_cost(BN128_ADD_GAS_COST)?; - - let input = handle.input(); - let p1 = read_curve_point_g1(input, 0)?; - let p2 = read_curve_point_g1(input, 64)?; - let sum = p1 + p2; - let result = encode_curve_point_g1(sum); - - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: result.to_vec(), - }) -} - -/// Point multiplication on the alt-bn128 elliptic curve. -pub fn call_bn128_mul(handle: &mut impl PrecompileHandle) -> PrecompileResult { - handle.record_cost(BN128_MUL_GAS_COST)?; - - let input = handle.input(); - let p = read_curve_point_g1(input, 0)?; - let s = read_field_element_fr(input, 64)?; - let mul = p * s; - let result = encode_curve_point_g1(mul); - - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: result.to_vec(), - }) -} - -/// Pairing check on the alt-bn128 elliptic curve. -pub fn call_bn128_pairing(handle: &mut impl PrecompileHandle) -> PrecompileResult { - let length = handle.input().len(); - if !length.is_multiple_of(192) { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other("bad elliptic curve pairing size".into()), - }); - } - - let num_pairings = length / 192; - handle.record_cost( - BN128_PAIRING_BASE_GAS_COST + BN128_PAIRING_CHECK_GAS_COST * num_pairings as u64, - )?; - - let input = handle.input(); - let mut pairs = Vec::with_capacity(num_pairings); - - for i in 0..num_pairings { - let a = read_curve_point_g1(input, i * 192)?; - let b = read_twist_point_g2(input, i * 192 + 64)?; - pairs.push((a, b)); - } - let mul = pairing_batch(&pairs); - - let mut result = [0u8; 32]; - if mul == Gt::one() { - result[31] = 1; - } - - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: result.to_vec(), - }) -} - -/// Decodes elliptic curve point G1. -fn read_curve_point_g1(source: &[u8], offset: usize) -> Result { - let x = read_field_element_fq(source, offset)?; - let y = read_field_element_fq(source, offset + 32)?; - - if x.is_zero() && y.is_zero() { - return Ok(G1::zero()); - } - - Ok(AffineG1::new(x, y) - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("invalid point G1".into()), - })? - .into()) -} - -/// Decodes elliptic curve point G2. -fn read_twist_point_g2(source: &[u8], offset: usize) -> Result { - let ay = read_field_element_fq(source, offset)?; - let ax = read_field_element_fq(source, offset + 32)?; - let by = read_field_element_fq(source, offset + 64)?; - let bx = read_field_element_fq(source, offset + 96)?; - - let x = Fq2::new(ax, ay); - let y = Fq2::new(bx, by); - - if x.is_zero() && y.is_zero() { - return Ok(G2::zero()); - } - - Ok(AffineG2::new(x, y) - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("invalid point G2".into()), - })? - .into()) -} - -/// Encodes elliptic curve point G1. -fn encode_curve_point_g1(p: G1) -> [u8; 64] { - let mut result = [0u8; 64]; - match AffineG1::from_jacobian(p) { - None => (), // Point at infinity. - Some(p) => { - p.x() - .to_big_endian(&mut result[0..32]) - .expect("slice has 32-byte length"); - p.y() - .to_big_endian(&mut result[32..64]) - .expect("slice has 32-byte length"); - } - } - result -} - -/// Decodes field element Fq. -fn read_field_element_fq(source: &[u8], offset: usize) -> Result { - let mut a = [0u8; 32]; - read_input(source, &mut a, offset); - - Fq::from_slice(&a).map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("invalid field element Fq".into()), - }) -} - -/// Decodes field element Fr. -fn read_field_element_fr(source: &[u8], offset: usize) -> Result { - let mut a = [0u8; 32]; - read_input(source, &mut a, offset); - - Fr::from_slice(&a).map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("invalid field element Fr".into()), - }) -} - -#[cfg(test)] -mod test { - use crate::precompile::testing::*; - - use super::*; - - #[test] - fn test_bn128_add() { - let address = H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x06, - ]); - - for case in read_test_cases("bn256Add").iter() { - let ret = call_contract( - address, - &hex::decode(case.input.as_str()).unwrap(), - case.gas, - ) - .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), case.expected); - } - - for case in read_test_cases("common_bnadd").iter() { - let ret = call_contract( - address, - &hex::decode(case.input.as_str()).unwrap(), - BN128_ADD_GAS_COST, - ) - .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), case.expected); - } - } - - #[test] - fn test_bn128_mul() { - let address = H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x07, - ]); - - for case in read_test_cases("bn256ScalarMul").iter() { - let ret = call_contract( - address, - &hex::decode(case.input.as_str()).unwrap(), - case.gas, - ) - .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), case.expected); - } - - for case in read_test_cases("common_bnmul").iter() { - let ret = call_contract( - address, - &hex::decode(case.input.as_str()).unwrap(), - BN128_MUL_GAS_COST, - ) - .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), case.expected); - } - } - - #[test] - fn test_bn128_pairing() { - let address = H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x08, - ]); - - for case in read_test_cases("bn256Pairing").iter() { - let ret = call_contract( - address, - &hex::decode(case.input.as_str()).unwrap(), - case.gas, - ) - .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), case.expected); - } - - for case in read_test_cases("common_bnpair").iter() { - let ret = call_contract( - address, - &hex::decode(case.input.as_str()).unwrap(), - BN128_PAIRING_BASE_GAS_COST - + BN128_PAIRING_CHECK_GAS_COST * (case.input.len() as u64 / 384), - ) - .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), case.expected); - } - } -} diff --git a/runtime-sdk/modules/evm/src/precompile/standard/mod.rs b/runtime-sdk/modules/evm/src/precompile/standard/mod.rs deleted file mode 100644 index cfb6cb24bec..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/standard/mod.rs +++ /dev/null @@ -1,10 +0,0 @@ -//! Implements the standard precompiles as defined in the EVM specification. - -mod bn128; -mod modexp; -mod simple; - -// Re-exports. -pub(super) use bn128::*; -pub(super) use modexp::*; -pub(super) use simple::*; diff --git a/runtime-sdk/modules/evm/src/precompile/standard/modexp.rs b/runtime-sdk/modules/evm/src/precompile/standard/modexp.rs deleted file mode 100644 index 249dbdda722..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/standard/modexp.rs +++ /dev/null @@ -1,306 +0,0 @@ -use std::cmp::{max, Ordering}; - -use evm::{ - executor::stack::{PrecompileFailure, PrecompileHandle, PrecompileOutput}, - ExitError, ExitSucceed, -}; -use num::{BigUint, FromPrimitive, Integer, One, ToPrimitive, Zero}; - -use crate::precompile::{read_input, PrecompileResult}; - -/// Minimum gas cost of ModExp contract from eip-2565 -/// https://eips.ethereum.org/EIPS/eip-2565 -const MIN_GAS_COST: u64 = 200; - -pub fn call_bigmodexp(handle: &mut impl PrecompileHandle) -> PrecompileResult { - let input = handle.input(); - let mut input_offset = 0; - - // Whenever the input is too short, the missing bytes are considered to be zero. - let mut base_len_buf = [0u8; 32]; - read_input(input, &mut base_len_buf, input_offset); - input_offset += 32; - let mut exp_len_buf = [0u8; 32]; - read_input(input, &mut exp_len_buf, input_offset); - input_offset += 32; - let mut mod_len_buf = [0u8; 32]; - read_input(input, &mut mod_len_buf, input_offset); - input_offset += 32; - - // Reasonable assumption: this must fit within the Ethereum EVM's max stack size. - let max_size_big = BigUint::from_u32(1024).expect("can't create BigUint"); - - let base_len_big = BigUint::from_bytes_be(&base_len_buf); - if base_len_big > max_size_big { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other("unreasonably large base length".into()), - }); - } - - let exp_len_big = BigUint::from_bytes_be(&exp_len_buf); - if exp_len_big > max_size_big { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other("unreasonably large exponent length".into()), - }); - } - - let mod_len_big = BigUint::from_bytes_be(&mod_len_buf); - if mod_len_big > max_size_big { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other("unreasonably large exponent length".into()), - }); - } - - // Bounds check handled above. - let base_len = base_len_big.to_usize().expect("base_len out of bounds"); - let exp_len = exp_len_big.to_usize().expect("exp_len out of bounds"); - let mod_len = mod_len_big.to_usize().expect("mod_len out of bounds"); - - // Gas formula allows arbitrary large exp_len when base and modulus are empty, so we need to - // handle empty base first. - let r = if base_len == 0 && mod_len == 0 { - handle.record_cost(MIN_GAS_COST)?; - BigUint::zero() - } else { - // Read the numbers themselves. - let mut base_buf = vec![0u8; base_len]; - read_input(input, &mut base_buf, input_offset); - input_offset += base_len; - let base = BigUint::from_bytes_be(&base_buf); - - let mut exp_buf = vec![0u8; exp_len]; - read_input(input, &mut exp_buf, input_offset); - input_offset += exp_len; - let exponent = BigUint::from_bytes_be(&exp_buf); - - let mut mod_buf = vec![0u8; mod_len]; - read_input(input, &mut mod_buf, input_offset); // No need to bump offset as we are done. - let modulus = BigUint::from_bytes_be(&mod_buf); - - // Calculate gas cost. - let gas_cost = calculate_gas_cost( - base_len as u64, - mod_len as u64, - &exponent, - &exp_buf, - modulus.is_even(), - ); - - handle.record_cost(gas_cost)?; - - if modulus.is_zero() || modulus.is_one() { - BigUint::zero() - } else { - base.modpow(&exponent, &modulus) - } - }; - - // Write output to given memory, left padded and same length as the modulus. - let bytes = r.to_bytes_be(); - - // Always true except in the case of zero-length modulus, which leads to output of length and - // value 1. - match bytes.len().cmp(&mod_len) { - Ordering::Equal => Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: bytes.to_vec(), - }), - Ordering::Less => { - let mut ret = Vec::with_capacity(mod_len); - ret.extend(core::iter::repeat_n(0, mod_len - bytes.len())); - ret.extend_from_slice(&bytes[..]); - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: ret.to_vec(), - }) - } - Ordering::Greater => Err(PrecompileFailure::Error { - exit_status: ExitError::Other("failed".into()), - }), - } -} - -fn calculate_multiplication_complexity(base_length: u64, mod_length: u64) -> u64 { - let max_length = max(base_length, mod_length); - let mut words = max_length / 8; - if !max_length.is_multiple_of(8) { - words += 1; - } - - words.saturating_mul(words) -} - -fn calculate_iteration_count(exponent: &BigUint, exponent_bytes: &[u8]) -> u64 { - let mut iteration_count: u64 = 0; - let exp_length = exponent_bytes.len() as u64; - - if exp_length <= 32 && exponent.is_zero() { - iteration_count = 0; - } else if exp_length <= 32 { - iteration_count = exponent.bits() - 1; - } else if exp_length > 32 { - // Retrieve the first 32 bytes of exponent for the adjusted exponent length. - let exponent_head = BigUint::from_bytes_be(&exponent_bytes[..32]); - - iteration_count = (8 * (exp_length - 32)) + exponent_head.bits() - 1; - } - - max(iteration_count, 1) -} - -/// Calculate ModExp gas cost according to [EIP-2565](https://eips.ethereum.org/EIPS/eip-2565). -fn calculate_gas_cost( - base_length: u64, - mod_length: u64, - exponent: &BigUint, - exponent_bytes: &[u8], - mod_is_even: bool, -) -> u64 { - let multiplication_complexity = calculate_multiplication_complexity(base_length, mod_length); - let iteration_count = calculate_iteration_count(exponent, exponent_bytes); - let gas = max( - MIN_GAS_COST, - multiplication_complexity.saturating_mul(iteration_count) / 3, - ); - // The modpow operation is more expensive for even numbers. - // See https://github.com/rust-num/num-bigint/blob/65f62a8b1484448bfb9789ef4123b50556254905/src/biguint/power.rs#L140-L146. - gas.saturating_mul(if mod_is_even { 20 } else { 1 }) -} - -#[cfg(test)] -mod test { - use crate::precompile::testing::*; - - use super::*; - - // The following test data is from "go-ethereum/core/vm/contracts_test.go" - - #[test] - fn test_modexp() { - let input = hex::decode( - "0000000000000000000000000000000000000000000000000000000000000001\ - 0000000000000000000000000000000000000000000000000000000000000020\ - 0000000000000000000000000000000000000000000000000000000000000020\ - 03fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc\ - 2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", - ) - .unwrap(); - - let ret = call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x05, - ]), - &input, - 3000, - ) - .unwrap(); - assert_eq!( - hex::encode(ret.unwrap().output), - "0000000000000000000000000000000000000000000000000000000000000001" - ); - } - - #[test] - fn test_out_of_gas() { - let input = "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b81010001df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f"; - match call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x05, - ]), - &hex::decode(input).unwrap(), - 3000, - ) - .unwrap() - { - Ok(_) => { - panic!("Test not expected to pass"); - } - Err(e) => { - assert_eq!( - e, - PrecompileFailure::Error { - exit_status: ExitError::OutOfGas - } - ); - } - } - } - - #[test] - fn test_zero_exp_with_33_length() { - let input = vec![ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - ]; - - let ret = call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x05, - ]), - &input, - 100_000, - ) - .unwrap() - .expect("precompile call should succeed"); - - assert_eq!(ret.output.len(), 1); - - let result = BigUint::from_bytes_be(&ret.output[..]); - let expected = BigUint::parse_bytes(b"0", 10).unwrap(); - assert_eq!(result, expected); - } - - #[test] - fn test_long_exp_gas_cost_matches_specs() { - let input = vec![ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 16, 0, 0, 0, 255, 255, 255, 2, 0, 0, 179, 0, 0, 2, 0, 0, 122, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 255, 251, 0, 0, 0, 0, 4, 38, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 255, 255, 255, 2, 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, - 255, 255, 255, 249, - ]; - - let (_, gas_used) = call_contract_with_gas_report( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x05, - ]), - &input, - 1_000_000, - ) - .expect("precompile call should succeed"); - - // Compare against reference value from geth. - assert_eq!(gas_used, 7104 * 20, "used gas should match reference value"); - } - - #[test] - fn test_vectors() { - let address = H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x05, - ]); - - for case in read_test_cases("modexp_eip2565").iter() { - let (ret, gas_used) = call_contract_with_gas_report( - address, - &hex::decode(case.input.as_str()).unwrap(), - case.gas, - ) - .unwrap(); - - assert_eq!(hex::encode(ret.unwrap().output), case.expected); - assert_eq!(gas_used, case.gas); - } - } -} diff --git a/runtime-sdk/modules/evm/src/precompile/standard/simple.rs b/runtime-sdk/modules/evm/src/precompile/standard/simple.rs deleted file mode 100644 index 7d293a89215..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/standard/simple.rs +++ /dev/null @@ -1,231 +0,0 @@ -use std::convert::TryFrom; - -use evm::{ - executor::stack::{PrecompileHandle, PrecompileOutput}, - ExitSucceed, -}; -use k256::elliptic_curve::scalar::IsHigh; -use ripemd::{Digest as _, Ripemd160}; -use sha2::Sha256; -use sha3::Keccak256; - -use crate::precompile::{read_input, record_linear_cost, PrecompileResult}; - -pub fn call_ecrecover(handle: &mut impl PrecompileHandle) -> PrecompileResult { - record_linear_cost(handle, handle.input().len() as u64, 3000, 0)?; - - // Make right padding for input. - let input = handle.input(); - - // Input encoded as [hash, r, s, v]. - let mut prehash = [0u8; 32]; - let mut padding = [0u8; 32]; - let mut sig = [0u8; 65]; - - read_input(input, &mut prehash, 0); - read_input(input, &mut padding, 32); - read_input(input, &mut sig[..64], 64); - - // Check EIP-155 - if padding[31] > 26 { - sig[64] = padding[31] - 27; - } else { - sig[64] = padding[31]; - } - - // Ensure input bytes 32..63 are all zero. - if padding[..31] != [0; 31] { - return Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }); - } - - let recid = match k256::ecdsa::RecoveryId::from_byte(sig[64]) { - Some(recid) if !recid.is_x_reduced() => recid, - _ => { - return Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }) - } - }; - - let sig = match k256::ecdsa::Signature::try_from(&sig[..64]) { - Ok(s) => s, - Err(_) => { - return Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }) - } - }; - - // Reject high s to make consistent with our Ethereum transaction signature verification. - if sig.s().is_high().into() { - return Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: vec![], - }); - } - - let output = match k256::ecdsa::VerifyingKey::recover_from_prehash(&prehash, &sig, recid) { - Ok(recovered_key) => { - // Convert Ethereum style address - let p = recovered_key.to_encoded_point(false); - let mut hasher = Keccak256::new(); - hasher.update(&p.as_bytes()[1..]); - let mut address = hasher.finalize(); - address[0..12].copy_from_slice(&[0u8; 12]); - address.to_vec() - } - Err(_) => vec![], - }; - - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output, - }) -} - -pub fn call_sha256(handle: &mut impl PrecompileHandle) -> PrecompileResult { - record_linear_cost(handle, handle.input().len() as u64, 60, 12)?; - - let mut hasher = Sha256::new(); - hasher.update(handle.input()); - let digest = hasher.finalize(); - - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: digest.to_vec(), - }) -} - -pub fn call_ripemd160(handle: &mut impl PrecompileHandle) -> PrecompileResult { - record_linear_cost(handle, handle.input().len() as u64, 600, 120)?; - - let mut hasher = Ripemd160::new(); - hasher.update(handle.input()); - let mut result = [0u8; 32]; - result[12..32].copy_from_slice(&hasher.finalize()); - - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: result.to_vec(), - }) -} - -pub fn call_datacopy(handle: &mut impl PrecompileHandle) -> PrecompileResult { - record_linear_cost(handle, handle.input().len() as u64, 15, 3)?; - - Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: handle.input().to_vec(), - }) -} - -#[cfg(test)] -mod test { - extern crate test; - - use test::Bencher; - - use crate::precompile::testing::*; - - // The following test data is from "go-ethereum/core/vm/contracts_test.go" - - #[test] - fn test_ecrecover() { - let input = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"; - let ret = call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, - ]), - &hex::decode(input).unwrap(), - 3000, - ) - .unwrap(); - assert_eq!( - hex::encode(ret.unwrap().output), - "000000000000000000000000ceaccac640adf55b2028469bd36ba501f28b699d" - ); - - // Test with invalid input. - let input = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e0000000000000deadbeef000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"; - let ret = call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, - ]), - &hex::decode(input).unwrap(), - 3000, - ) - .unwrap(); // Should be successful, but empty result. - assert!(ret.unwrap().output.is_empty()); - } - - #[test] - fn test_sha256() { - let input = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"; - let ret = call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x02, - ]), - &hex::decode(input).unwrap(), - 3000, - ) - .unwrap(); - assert_eq!( - hex::encode(ret.unwrap().output), - "811c7003375852fabd0d362e40e68607a12bdabae61a7d068fe5fdd1dbbf2a5d" - ); - } - - #[test] - fn test_ripemd160() { - let input = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"; - let ret = call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x03, - ]), - &hex::decode(input).unwrap(), - 3000, - ) - .unwrap(); - assert_eq!( - hex::encode(ret.unwrap().output), - "0000000000000000000000009215b8d9882ff46f0dfde6684d78e831467f65e6" - ); - } - - #[test] - fn test_datacopy() { - let input = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"; - let ret = call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x04, - ]), - &hex::decode(input).unwrap(), - 3000, - ) - .unwrap(); - assert_eq!(hex::encode(ret.unwrap().output), "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"); - } - - #[bench] - fn bench_ecrecover(b: &mut Bencher) { - let input = "38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e000000000000000000000000000000000000000000000000000000000000001b38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e789d1dd423d25f0772d2748d60f7e4b81bb14d086eba8e8e8efb6dcff8a4ae02"; - let input = hex::decode(input).unwrap(); - - b.iter(|| { - call_contract( - H160([ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x01, - ]), - &input, - 3000, - ) - .expect("call should return something") - .expect("call should succeed"); - }); - } -} diff --git a/runtime-sdk/modules/evm/src/precompile/subcall.rs b/runtime-sdk/modules/evm/src/precompile/subcall.rs index 0b49b541881..66ef9e7fc2d 100644 --- a/runtime-sdk/modules/evm/src/precompile/subcall.rs +++ b/runtime-sdk/modules/evm/src/precompile/subcall.rs @@ -1,14 +1,15 @@ use evm::{ - executor::stack::{PrecompileFailure, PrecompileHandle, PrecompileOutput}, - ExitError, ExitSucceed, + interpreter::{runtime::RuntimeState, ExitError, ExitException, ExitSucceed}, + standard::GasometerState, + GasMutState, }; +use primitive_types::H160; -use crate::backend::EVMBackendExt; use oasis_runtime_sdk::{ - module::CallResult, modules::core::Error, subcall, types::transaction::CallerAddress, + module::CallResult, modules::core::Error, subcall, types::transaction::CallerAddress, Context, }; -use super::{record_linear_cost, PrecompileResult}; +use super::record_linear_cost; /// A subcall validator which prevents any subcalls from re-entering the EVM module. struct ForbidReentrancy; @@ -25,87 +26,93 @@ impl subcall::Validator for ForbidReentrancy { const SUBCALL_BASE_COST: u64 = 10; const SUBCALL_WORD_COST: u64 = 1; -pub(super) fn call_subcall( - handle: &mut impl PrecompileHandle, - backend: &B, -) -> PrecompileResult { +pub(super) fn call_subcall( + code_address: H160, + input: &[u8], + gasometer: &mut G, + ctx: &C, +) -> Result<(ExitSucceed, Vec), ExitError> +where + C: Context, + G: AsRef + AsRef + GasMutState, +{ record_linear_cost( - handle, - handle.input().len() as u64, + gasometer, + input.len() as u64, SUBCALL_BASE_COST, SUBCALL_WORD_COST, )?; + let state: &RuntimeState = gasometer.as_ref(); + // Ensure that the precompile is called using a regular call (and not a delegatecall) so the // caller is actually the address of the calling contract. - if handle.context().address != handle.code_address() { - return Err(PrecompileFailure::Error { - exit_status: ExitError::Other("invalid call".into()), - }); + if state.context.address != code_address { + return Err(ExitError::Exception(ExitException::Other( + "invalid call".into(), + ))); } // Decode arguments. - let (method, body): (solabi::Bytes>, solabi::Bytes>) = - solabi::decode(handle.input()).map_err(|e| PrecompileFailure::Error { - exit_status: ExitError::Other(e.to_string().into()), - })?; + let (method, body): (solabi::Bytes>, solabi::Bytes>) = solabi::decode(input) + .map_err(|e| ExitError::Exception(ExitException::Other(e.to_string().into())))?; // Parse body as CBOR. - let body = cbor::from_slice(body.as_bytes()).map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("body is malformed".into()), - })?; + let body = cbor::from_slice(body.as_bytes()) + .map_err(|_| ExitError::Exception(ExitException::Other("body is malformed".into())))?; // Parse method. - let method = String::from_utf8(method.to_vec()).map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("method is malformed".into()), - })?; + let method = String::from_utf8(method.to_vec()) + .map_err(|_| ExitError::Exception(ExitException::Other("method is malformed".into())))?; // Cap maximum amount of gas that can be used. - let max_gas = handle.remaining_gas(); + let max_gas = gasometer + .gas() + .try_into() + .map_err(|_| ExitError::Exception(ExitException::Other("invalid gas".into())))?; // Ensure that the subcall is read-only and cannot modify state when // the precompile is called using a static call. - let read_only = handle.is_static(); - - let result = backend - .subcall( - subcall::SubcallInfo { - caller: CallerAddress::EthAddress(handle.context().caller.into()), - method, - body, - max_depth: 8, - max_gas, - read_only, - }, - ForbidReentrancy, - ) - .map_err(|_| PrecompileFailure::Error { - exit_status: ExitError::Other("subcall failed".into()), - })?; + let gasometer_state: &GasometerState = gasometer.as_ref(); + let read_only = gasometer_state.is_static; + + let result = subcall::call( + ctx, + subcall::SubcallInfo { + caller: CallerAddress::EthAddress(state.context.caller.into()), + method, + body, + max_depth: 8, + max_gas, + read_only, + }, + ForbidReentrancy, + ) + .map_err(|_| ExitError::Exception(ExitException::Other("subcall failed".into())))?; // Charge gas (this shouldn't fail given that we set the limit appropriately). - handle.record_cost(result.gas_used)?; + gasometer.record_gas(result.gas_used.into())?; match result.call_result { - CallResult::Ok(value) => Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&( + CallResult::Ok(value) => Ok(( + ExitSucceed::Returned, + solabi::encode(&( 0_u64, // status_code solabi::Bytes(cbor::to_vec(value)), // response )), - }), - CallResult::Failed { code, module, .. } => Ok(PrecompileOutput { - exit_status: ExitSucceed::Returned, - output: solabi::encode(&( + )), + CallResult::Failed { code, module, .. } => Ok(( + ExitSucceed::Returned, + solabi::encode(&( code, // status_code solabi::Bytes(module.as_bytes()), // response )), - }), + )), CallResult::Aborted(_) => { // TODO: Should propagate abort. - Err(PrecompileFailure::Error { - exit_status: ExitError::Other("subcall failed".into()), - }) + Err(ExitError::Exception(ExitException::Other( + "subcall failed".into(), + ))) } } } @@ -238,7 +245,7 @@ mod test { let events: Vec = cbor::from_slice(&tags[1].value).unwrap(); assert_eq!(events.len(), 1); // Just one gas used event. - assert_eq!(events[0].amount, 25738); + assert_eq!(events[0].amount, 28238); } #[test] @@ -501,7 +508,7 @@ mod test { ), CallOptions { fee: Fee { - gas: 127_710, + gas: 128_700, ..Default::default() }, ..Default::default() diff --git a/runtime-sdk/modules/evm/src/precompile/testdata/bn256Add.json b/runtime-sdk/modules/evm/src/precompile/testdata/bn256Add.json deleted file mode 100644 index b6fcd550e30..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/testdata/bn256Add.json +++ /dev/null @@ -1,114 +0,0 @@ -[ - { - "Input": "18b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f3726607c2b7f58a84bd6145f00c9c2bc0bb1a187f20ff2c92963a88019e7c6a014eed06614e20c147e940f2d70da3f74c9a17df361706a4485c742bd6788478fa17d7", - "Expected": "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35964723180eed7532537db9ae5e7d48f195c915", - "Name": "chfast1", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "2243525c5efd4b9c3d3c45ac0ca3fe4dd85e830a4ce6b65fa1eeaee202839703301d1d33be6da8e509df21cc35964723180eed7532537db9ae5e7d48f195c91518b18acfb4c2c30276db5411368e7185b311dd124691610c5d3b74034e093dc9063c909c4720840cb5134cb9f59fa749755796819658d32efc0d288198f37266", - "Expected": "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb204", - "Name": "chfast2", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Name": "cdetrio1", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Name": "cdetrio2", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Name": "cdetrio3", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "", - "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Name": "cdetrio4", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Name": "cdetrio5", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Name": "cdetrio6", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Name": "cdetrio7", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Name": "cdetrio8", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Gas": 150, - "Name": "cdetrio9", - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Gas": 150, - "Name": "cdetrio10", - "NoBenchmark": false - }, - { - "Input": "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002", - "Expected": "030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4", - "Name": "cdetrio11", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd315ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4", - "Name": "cdetrio12", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", - "Expected": "15bf2bb17880144b5d1cd2b1f46eff9d617bffd1ca57c37fb5a49bd84e53cf66049c797f9ce0d17083deb32b5e36f2ea2a212ee036598dd7624c168993d1355f", - "Name": "cdetrio13", - "Gas": 150, - "NoBenchmark": false - }, - { - "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Name": "cdetrio14", - "Gas": 150, - "NoBenchmark": false - } -] \ No newline at end of file diff --git a/runtime-sdk/modules/evm/src/precompile/testdata/bn256Pairing.json b/runtime-sdk/modules/evm/src/precompile/testdata/bn256Pairing.json deleted file mode 100644 index 3fbed6b87ce..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/testdata/bn256Pairing.json +++ /dev/null @@ -1,100 +0,0 @@ -[ - { - "Input": "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c2032c61a830e3c17286de9462bf242fca2883585b93870a73853face6a6bf411198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "jeff1", - "Gas": 113000, - "NoBenchmark": false - }, - { - "Input": "2eca0c7238bf16e83e7a1e6c5d49540685ff51380f309842a98561558019fc0203d3260361bb8451de5ff5ecd17f010ff22f5c31cdf184e9020b06fa5997db841213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f06967a1237ebfeca9aaae0d6d0bab8e28c198c5a339ef8a2407e31cdac516db922160fa257a5fd5b280642ff47b65eca77e626cb685c84fa6d3b6882a283ddd1198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "jeff2", - "Gas": 113000, - "NoBenchmark": false - }, - { - "Input": "0f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd216da2f5cb6be7a0aa72c440c53c9bbdfec6c36c7d515536431b3a865468acbba2e89718ad33c8bed92e210e81d1853435399a271913a6520736a4729cf0d51eb01a9e2ffa2e92599b68e44de5bcf354fa2642bd4f26b259daa6f7ce3ed57aeb314a9a87b789a58af499b314e13c3d65bede56c07ea2d418d6874857b70763713178fb49a2d6cd347dc58973ff49613a20757d0fcc22079f9abd10c3baee245901b9e027bd5cfc2cb5db82d4dc9677ac795ec500ecd47deee3b5da006d6d049b811d7511c78158de484232fc68daf8a45cf217d1c2fae693ff5871e8752d73b21198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "jeff3", - "Gas": 113000, - "NoBenchmark": false - }, - { - "Input": "2f2ea0b3da1e8ef11914acf8b2e1b32d99df51f5f4f206fc6b947eae860eddb6068134ddb33dc888ef446b648d72338684d678d2eb2371c61a50734d78da4b7225f83c8b6ab9de74e7da488ef02645c5a16a6652c3c71a15dc37fe3a5dcb7cb122acdedd6308e3bb230d226d16a105295f523a8a02bfc5e8bd2da135ac4c245d065bbad92e7c4e31bf3757f1fe7362a63fbfee50e7dc68da116e67d600d9bf6806d302580dc0661002994e7cd3a7f224e7ddc27802777486bf80f40e4ca3cfdb186bac5188a98c45e6016873d107f5cd131f3a3e339d0375e58bd6219347b008122ae2b09e539e152ec5364e7e2204b03d11d3caa038bfc7cd499f8176aacbee1f39e4e4afc4bc74790a4a028aff2c3d2538731fb755edefd8cb48d6ea589b5e283f150794b6736f670d6a1033f9b46c6f5204f50813eb85c8dc4b59db1c5d39140d97ee4d2b36d99bc49974d18ecca3e7ad51011956051b464d9e27d46cc25e0764bb98575bd466d32db7b15f582b2d5c452b36aa394b789366e5e3ca5aabd415794ab061441e51d01e94640b7e3084a07e02c78cf3103c542bc5b298669f211b88da1679b0b64a63b7e0e7bfe52aae524f73a55be7fe70c7e9bfc94b4cf0da1213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "jeff4", - "Gas": 147000, - "NoBenchmark": false - }, - { - "Input": "20a754d2071d4d53903e3b31a7e98ad6882d58aec240ef981fdf0a9d22c5926a29c853fcea789887315916bbeb89ca37edb355b4f980c9a12a94f30deeed30211213d2149b006137fcfb23036606f848d638d576a120ca981b5b1a5f9300b3ee2276cf730cf493cd95d64677bbb75fc42db72513a4c1e387b476d056f80aa75f21ee6226d31426322afcda621464d0611d226783262e21bb3bc86b537e986237096df1f82dff337dd5972e32a8ad43e28a78a96a823ef1cd4debe12b6552ea5f1abb4a25eb9379ae96c84fff9f0540abcfc0a0d11aeda02d4f37e4baf74cb0c11073b3ff2cdbb38755f8691ea59e9606696b3ff278acfc098fa8226470d03869217cee0a9ad79a4493b5253e2e4e3a39fc2df38419f230d341f60cb064a0ac290a3d76f140db8418ba512272381446eb73958670f00cf46f1d9e64cba057b53c26f64a8ec70387a13e41430ed3ee4a7db2059cc5fc13c067194bcc0cb49a98552fd72bd9edb657346127da132e5b82ab908f5816c826acb499e22f2412d1a2d70f25929bcb43d5a57391564615c9e70a992b10eafa4db109709649cf48c50dd2198a1f162a73261f112401aa2db79c7dab1533c9935c77290a6ce3b191f2318d198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "jeff5", - "Gas": 147000, - "NoBenchmark": false - }, - { - "Input": "1c76476f4def4bb94541d57ebba1193381ffa7aa76ada664dd31c16024c43f593034dd2920f673e204fee2811c678745fc819b55d3e9d294e45c9b03a76aef41209dd15ebff5d46c4bd888e51a93cf99a7329636c63514396b4a452003a35bf704bf11ca01483bfa8b34b43561848d28905960114c8ac04049af4b6315a416782bb8324af6cfc93537a2ad1a445cfd0ca2a71acd7ac41fadbf933c2a51be344d120a2a4cf30c1bf9845f20c6fe39e07ea2cce61f0c9bb048165fe5e4de877550111e129f1cf1097710d41c4ac70fcdfa5ba2023c6ff1cbeac322de49d1b6df7c103188585e2364128fe25c70558f1560f4f9350baf3959e603cc91486e110936198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "jeff6", - "Gas": 113000, - "NoBenchmark": false - }, - { - "Input": "", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "empty_data", - "Gas": 45000, - "NoBenchmark": false - }, - { - "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "one_point", - "Gas": 79000, - "NoBenchmark": false - }, - { - "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "two_point_match_2", - "Gas": 113000, - "NoBenchmark": false - }, - { - "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "two_point_match_3", - "Gas": 113000, - "NoBenchmark": false - }, - { - "Input": "105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "two_point_match_4", - "Gas": 113000, - "NoBenchmark": false - }, - { - "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "ten_point_match_1", - "Gas": 385000, - "NoBenchmark": false - }, - { - "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "ten_point_match_2", - "Gas": 385000, - "NoBenchmark": false - }, - { - "Input": "105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "ten_point_match_3", - "Gas": 113000, - "NoBenchmark": false - } -] \ No newline at end of file diff --git a/runtime-sdk/modules/evm/src/precompile/testdata/bn256ScalarMul.json b/runtime-sdk/modules/evm/src/precompile/testdata/bn256ScalarMul.json deleted file mode 100644 index b0427fcc055..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/testdata/bn256ScalarMul.json +++ /dev/null @@ -1,135 +0,0 @@ -[ - { - "Input": "2bd3e6d0f3b142924f5ca7b49ce5b9d54c4703d7ae5648e61d02268b1a0a9fb721611ce0a6af85915e2f1d70300909ce2e49dfad4a4619c8390cae66cefdb20400000000000000000000000000000000000000000000000011138ce750fa15c2", - "Expected": "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc", - "Name": "chfast1", - "Gas": 6000, - "NoBenchmark": false - }, - { - "Input": "070a8d6a982153cae4be29d434e8faef8a47b274a053f5a4ee2a6c9c13c31e5c031b8ce914eba3a9ffb989f9cdd5b0f01943074bf4f0f315690ec3cec6981afc30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd46", - "Expected": "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e", - "Name": "chfast2", - "Gas": 6000, - "NoBenchmark": false - }, - { - "Input": "025a6f4181d2b4ea8b724290ffb40156eb0adb514c688556eb79cdea0752c2bb2eff3f31dea215f1eb86023a133a996eb6300b44da664d64251d05381bb8a02e183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3", - "Expected": "14789d0d4a730b354403b5fac948113739e276c23e0258d8596ee72f9cd9d3230af18a63153e0ec25ff9f2951dd3fa90ed0197bfef6e2a1a62b5095b9d2b4a27", - "Name": "chfast3", - "Gas": 6000, - "NoBenchmark": false - }, - { - "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "2cde5879ba6f13c0b5aa4ef627f159a3347df9722efce88a9afbb20b763b4c411aa7e43076f6aee272755a7f9b84832e71559ba0d2e0b17d5f9f01755e5b0d11", - "Name": "cdetrio1", - "Gas": 6000, - "NoBenchmark": false - }, - { - "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", - "Expected": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe3163511ddc1c3f25d396745388200081287b3fd1472d8339d5fecb2eae0830451", - "Name": "cdetrio2", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000", - "Expected": "1051acb0700ec6d42a88215852d582efbaef31529b6fcbc3277b5c1b300f5cf0135b2394bb45ab04b8bd7611bd2dfe1de6a4e6e2ccea1ea1955f577cd66af85b", - "Name": "cdetrio3", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009", - "Expected": "1dbad7d39dbc56379f78fac1bca147dc8e66de1b9d183c7b167351bfe0aeab742cd757d51289cd8dbd0acf9e673ad67d0f0a89f912af47ed1be53664f5692575", - "Name": "cdetrio4", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001", - "Expected": "1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6", - "Name": "cdetrio5", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "29e587aadd7c06722aabba753017c093f70ba7eb1f1c0104ec0564e7e3e21f6022b1143f6a41008e7755c71c3d00b6b915d386de21783ef590486d8afa8453b1", - "Name": "cdetrio6", - "Gas": 6000, - "NoBenchmark": false - }, - { - "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", - "Expected": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb", - "Name": "cdetrio7", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000100000000000000000000000000000000", - "Expected": "221a3577763877920d0d14a91cd59b9479f83b87a653bb41f82a3f6f120cea7c2752c7f64cdd7f0e494bff7b60419f242210f2026ed2ec70f89f78a4c56a1f15", - "Name": "cdetrio8", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000009", - "Expected": "228e687a379ba154554040f8821f4e41ee2be287c201aa9c3bc02c9dd12f1e691e0fd6ee672d04cfd924ed8fdc7ba5f2d06c53c1edc30f65f2af5a5b97f0a76a", - "Name": "cdetrio9", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c0000000000000000000000000000000000000000000000000000000000000001", - "Expected": "17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c", - "Name": "cdetrio10", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "00a1a234d08efaa2616607e31eca1980128b00b415c845ff25bba3afcb81dc00242077290ed33906aeb8e42fd98c41bcb9057ba03421af3f2d08cfc441186024", - "Name": "cdetrio11", - "Gas": 6000, - "NoBenchmark": false - }, - { - "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d9830644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000", - "Expected": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b8692929ee761a352600f54921df9bf472e66217e7bb0cee9032e00acc86b3c8bfaf", - "Name": "cdetrio12", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000100000000000000000000000000000000", - "Expected": "1071b63011e8c222c5a771dfa03c2e11aac9666dd097f2c620852c3951a4376a2f46fe2f73e1cf310a168d56baa5575a8319389d7bfa6b29ee2d908305791434", - "Name": "cdetrio13", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000009", - "Expected": "19f75b9dd68c080a688774a6213f131e3052bd353a304a189d7a2ee367e3c2582612f545fb9fc89fde80fd81c68fc7dcb27fea5fc124eeda69433cf5c46d2d7f", - "Name": "cdetrio14", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000001", - "Expected": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98", - "Name": "cdetrio15", - "Gas": 6000, - "NoBenchmark": true - }, - { - "Input": "039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d980000000000000000000000000000000000000000000000000000000000000000", - "Expected": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "Name": "zeroScalar", - "Gas": 6000, - "NoBenchmark": true - } -] \ No newline at end of file diff --git a/runtime-sdk/modules/evm/src/precompile/testdata/common_bnadd.json b/runtime-sdk/modules/evm/src/precompile/testdata/common_bnadd.json deleted file mode 100644 index 703e2a1b539..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/testdata/common_bnadd.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "Input": "089142debb13c461f61523586a60732d8b69c5b38a3380a74da7b2961d867dbf2d5fc7bbc013c16d7945f190b232eacc25da675c0eb093fe6b9f1b4b4e107b3625f8c89ea3437f44f8fc8b6bfbb6312074dc6f983809a5e809ff4e1d076dd5850b38c7ced6e4daef9c4347f370d6d8b58f4b1d8dc61a3c59d651a0644a2a27cf", - "Expected": "0a6678fd675aa4d8f0d03a1feb921a27f38ebdcb860cc083653519655acd6d79172fd5b3b2bfdd44e43bcec3eace9347608f9f0a16f1e184cb3f52e6f259cbeb", - "Name": "bnadd_0_0" - }, - { - "Input": "23f16f1bcc31bd002746da6fa3825209af9a356ccd99cf79604a430dd592bcd90a03caeda9c5aa40cdc9e4166e083492885dad36c72714e3697e34a4bc72ccaa21315394462f1a39f87462dbceb92718b220e4f80af516f727ad85380fadefbc2e4f40ea7bbe2d4d71f13c84fd2ae24a4a24d9638dd78349d0dee8435a67cca6", - "Expected": "013f227997b410cbd96b137a114f5b12d5a3a53d7482797bcd1f116ff30ff1931effebc79dee208d036553beae8ca71afb3b4c00979560db3991c7e67c49103c", - "Name": "bnadd_0_1" - }, - { - "Input": "0341b65d1b32805aedf29c4704ae125b98bb9b736d6e05bd934320632bf46bb60d22bc985718acbcf51e3740c1565f66ff890dfd2302fc51abc999c83d8774ba08ed1b33fe3cd3b1ac11571999e8f451f5bb28dd4019e58b8d24d91cf73dc38f11be2878bb118612a7627f022aa19a17b6eb599bba4185df357f81d052fff90b", - "Expected": "0e9e24a218333ed19a90051efabe246146a6d5017810140ef7e448030539038a230598b7d4127f5b4fd971820084c632ca940b29fcf30139cd1513bbbbf3a3dc", - "Name": "bnadd_0_2" - }, - { - "Input": "279e2a1eee50ae1e3fe441dcd58475c40992735644de5c8f6299b6f0c1fe41af21b37bd13a881181d56752e31cf494003a9d396eb908452718469bc5c75aa8071c35e297f7c55363cd2fd00d916c67fad3bdea15487bdc5cc7b720f3a2c8b776106c2a4cf61ab73f91f2258f1846b9be9d28b9a7e83503fa4f4b322bfc07223c", - "Expected": "22f8aa414eb0b9b296bed3fb355804e92ec0af419d9906335f50f032d87a8bf82643f41b228310b816c784c2c54dcfadeaa328b792dbe0d0e04741cd61dac155", - "Name": "bnadd_0_3" - }, - { - "Input": "0af6f1fd0b29a4f055c91a472f285e919d430a2b73912ae659224e24a458c65e2c1a52f5abf3e86410b9a603159b0bf51abf4d72cbd5e8161a7b5c47d60dfe571f752f85cf5cc01b2dfe279541032da61c2fcc8ae0dfc6d4253ba9b5d3c858231d03a84afe2a9f595ab03007400ccd36a2c0bc31203d881011dfc450c39b5abe", - "Expected": "1e51b9f09d8fc2e4ca11602326c2cfe191c6c6a47874526e80051197e9f6af842282e508ca489bf881e25cf9590151ff5cf94fa523683a0718d87abcc4d4a16f", - "Name": "bnadd_0_4" - }, - { - "Input": "0e6eab4103302750b22364bd1ec80e5edfb3ad06fa175ff2517ca49489f728e9050a17b5a594d0fd6fafed7fe5c447793fe9b617f0f97c3ee6dd29638f6c9232038de98419e242685862c118253ab7df7358f863a59170c37e606d5bd23c742f076ff3443f4e01b7d7ace1315fe50cf77c365d8d289c65303bcc11ba7961ab95", - "Expected": "2231ab2eee93d63596f718533ddbb95a86b13d39e1162897d791566e797f82952f39ea566bede8e7ba15f3c61b0e96275b2fc51800ee2baf2f9bd7acfa874f0a", - "Name": "bnadd_0_5" - }, - { - "Input": "1920c53c756f1ec1a40e0264e5f65808eafaeaa7b0885f89852297bc2186ac9d09416cc536a27b6d5616f74dd2bbbfb463b9961752e0aa38d47b5213994959ab015296293a5a1bb5e15a7d019787422cb3409e075e122c6fc5867f0c3f3715731782b870b6641d8d55323e27ebaea17909499877fda62e3ac1e2b2310cad5f9c", - "Expected": "0fa3236565b78b283f3ce63ca62bafb87c33407b11a077e39230ff37c054cf712a38174368bf872f80f78fb5222e95717183242b9d4da75c66243f043aed2fc5", - "Name": "bnadd_0_6" - }, - { - "Input": "001faaf97b965ffa633612b7c8f9f4be0b286b19662e5cbe6878019d8ba1382b16567ced7a7ee5c272bbc378a95c2436fb0c6133649c77e55a708b28419b5cac0750d51706ced69621c8e4ba1758ba90c39ba8b3b50507bfa545ace1737e360e283d609cd67a291fc3d720c5b1113eececba4ca31d58a1319d6a5a2fa89608f9", - "Expected": "044fe3c480840e5a8f544efd28a8bf3246f0741a8c61c3116e93d84773399c8b26c5b695120cd724aa2a5f4dfd3042c07f752be4c4a8b750398109d80f4772eb", - "Name": "bnadd_0_7" - }, - { - "Input": "128b65cb80257f3006fc20dbb6af6781da7e0f9213d2b909fd113ee0f2d2bb52251e288387db7be742fe67261f36a4f09eeb4763bbbaa1bb13af3dec65302a4115f64edf27478045bf45eded285544acaa7f2b3a2a36176acefc1a3d7181a73219d4344489688c2a2f16caf1141bc42021738339431b3a64cfbc293a73c1eddc", - "Expected": "0a20db61d2b74384ca184f20455ad1f380ba081f89e41c87ceb3fdbbba63c7aa1fbda20003ec799f306f70df7f53f91721e59353013ebf1647f5130903fff482", - "Name": "bnadd_0_8" - }, - { - "Input": "16a9fe4620e58d70109d6995fe5f9eb8b3d533280cc604a333dcf0fa688b62e20b972bf2daef6c10a41db685c2417b6f4362032421c8466277d3271b6e8706a809ad61a8a83df55f6cd293cd674338c35dbb32722e9db2d1a3371b43496c05fa09c73b138499e36453d67a2c9b543c2188918287c4eef2c3ccc9ebe1d6142d01", - "Expected": "005a68cc13a108287aa3ca0bd8bef95096ef22668e15c87f7cbe0167cd1cdc930359b9b2dd28843838cf74cb4af2cfd656690a7f73de771b891142db22fa61fb", - "Name": "bnadd_0_9" - } -] \ No newline at end of file diff --git a/runtime-sdk/modules/evm/src/precompile/testdata/common_bnmul.json b/runtime-sdk/modules/evm/src/precompile/testdata/common_bnmul.json deleted file mode 100644 index 733f6c73ecf..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/testdata/common_bnmul.json +++ /dev/null @@ -1,52 +0,0 @@ -[ - { - "Input": "089142debb13c461f61523586a60732d8b69c5b38a3380a74da7b2961d867dbf2d5fc7bbc013c16d7945f190b232eacc25da675c0eb093fe6b9f1b4b4e107b36ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "0bf982b98a2757878c051bfe7eee228b12bc69274b918f08d9fcb21e9184ddc10b17c77cbf3c19d5d27e18cbd4a8c336afb488d0e92c18d56e64dd4ea5c437e6", - "Name": "bnmul_0_0" - }, - { - "Input": "25f8c89ea3437f44f8fc8b6bfbb6312074dc6f983809a5e809ff4e1d076dd5850b38c7ced6e4daef9c4347f370d6d8b58f4b1d8dc61a3c59d651a0644a2a27cfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "18a902ac147b2951531770c7c18a25e3dd87765e23f7e0c4e9d62b624a6e37450288473776e7e99b2aaa27e8f4656ea9ce5e634fd1ca1aab45315199ecaced2e", - "Name": "bnmul_0_1" - }, - { - "Input": "23f16f1bcc31bd002746da6fa3825209af9a356ccd99cf79604a430dd592bcd90a03caeda9c5aa40cdc9e4166e083492885dad36c72714e3697e34a4bc72ccaaffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "0c6a880ffdd0737c53bfec9b65c9098a3298747bd4e5fd07026661b4cb804331116aeec88e11f49753df224c60c4bd8b8bc0a98b8d50f24ce64475268d227f4c", - "Name": "bnmul_0_2" - }, - { - "Input": "21315394462f1a39f87462dbceb92718b220e4f80af516f727ad85380fadefbc2e4f40ea7bbe2d4d71f13c84fd2ae24a4a24d9638dd78349d0dee8435a67cca6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "1d7985d51e53cdfbd73b051e9a74ab6e621b6b664a7efed00e30c1264f5623d02808eee3baec187160d2499b4aedbc665a532d245212a1be61e0d4b9b36f3075", - "Name": "bnmul_0_3" - }, - { - "Input": "0341b65d1b32805aedf29c4704ae125b98bb9b736d6e05bd934320632bf46bb60d22bc985718acbcf51e3740c1565f66ff890dfd2302fc51abc999c83d8774baffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "15bd6ea71fd264e1bfb04eb6d97b4f3686c5bf36f91356fc13ddde3494e172d90b3f8392fd4cdd5d542887ea4ee0274835bf37b58edf927ef242b8704af52e92", - "Name": "bnmul_0_4" - }, - { - "Input": "08ed1b33fe3cd3b1ac11571999e8f451f5bb28dd4019e58b8d24d91cf73dc38f11be2878bb118612a7627f022aa19a17b6eb599bba4185df357f81d052fff90bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "26ec73a6134f8ebce33d675e1f2e6ff3ec066e8d255ffca6eb55ef2ab7c5c51d06500cfcd6950c92de24b90ca09be110f8f9c2fb4d9cb2a9f9677dd81c1c0607", - "Name": "bnmul_0_5" - }, - { - "Input": "279e2a1eee50ae1e3fe441dcd58475c40992735644de5c8f6299b6f0c1fe41af21b37bd13a881181d56752e31cf494003a9d396eb908452718469bc5c75aa807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "06894837c70570eac651dae1a443b830c292c1801340ca4150c9d339177965e509ad8d4839bc83bd1852e6a8b71dcf01a1f7d6b6b174858ca02893bd5ace3eee", - "Name": "bnmul_0_6" - }, - { - "Input": "1c35e297f7c55363cd2fd00d916c67fad3bdea15487bdc5cc7b720f3a2c8b776106c2a4cf61ab73f91f2258f1846b9be9d28b9a7e83503fa4f4b322bfc07223cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "0e56eeb3f168767b21bce1489d9657f694951b25ea8a081f4ebf68469a1eb1e0293446d763ea9c40e52286f2ac504cfabb364b1f899b874b13d78879d25a5ec5", - "Name": "bnmul_0_7" - }, - { - "Input": "0af6f1fd0b29a4f055c91a472f285e919d430a2b73912ae659224e24a458c65e2c1a52f5abf3e86410b9a603159b0bf51abf4d72cbd5e8161a7b5c47d60dfe57ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "2f63f5f1275c401356e94adfbe5e8cff21485a9281e55d378a51eb93263a40802a817491a84e40c584481df4a5085b301c6fd66cb97856de55cd04df85a6a1d3", - "Name": "bnmul_0_8" - }, - { - "Input": "1f752f85cf5cc01b2dfe279541032da61c2fcc8ae0dfc6d4253ba9b5d3c858231d03a84afe2a9f595ab03007400ccd36a2c0bc31203d881011dfc450c39b5abeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - "Expected": "0aa7b6fda656f23eab50e36db0519cdf79f4624d417253085907ebfd9aef38a414cdd2edce2b313fc6dd390628ac9fac910841706d55f9af2a064548694dc05c", - "Name": "bnmul_0_9" - } -] \ No newline at end of file diff --git a/runtime-sdk/modules/evm/src/precompile/testdata/common_bnpair.json b/runtime-sdk/modules/evm/src/precompile/testdata/common_bnpair.json deleted file mode 100644 index 1219946b4cb..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/testdata/common_bnpair.json +++ /dev/null @@ -1,202 +0,0 @@ -[ - { - "Input": "089142debb13c461f61523586a60732d8b69c5b38a3380a74da7b2961d867dbf2d5fc7bbc013c16d7945f190b232eacc25da675c0eb093fe6b9f1b4b4e107b3629f2c1dbcc614745f242077001ec9edd475acdab9ab435770d456bd22bbd2abf268683f9b1be0bde4508e2e25e51f6b44da3546e87524337d506fd03c4ff7ce01851abe58ef4e08916bec8034ca62c04cd08340ab6cc525e61706340926221651b71422869c92e49465200ca19033a8aa425f955be3d8329c4475503e45c00e1", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_0" - }, - { - "Input": "23f16f1bcc31bd002746da6fa3825209af9a356ccd99cf79604a430dd592bcd90a03caeda9c5aa40cdc9e4166e083492885dad36c72714e3697e34a4bc72ccaa2e832e2bd419280d247658bb64323d59bbf47df41aa729d2168a272d66e306ff18ab999098bc5b30758183a160fcca776562d9a9370278aee9e6f71053e9358f0edd6252e0584efe53db6b3c40d1976d3849f08db15d39a0d7a6e327fc67f45e24925638e68e59cc22218917c61d2934c4e6353e2f62178a09627aed68c4e57a", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_1" - }, - { - "Input": "0341b65d1b32805aedf29c4704ae125b98bb9b736d6e05bd934320632bf46bb60d22bc985718acbcf51e3740c1565f66ff890dfd2302fc51abc999c83d8774ba0d2c492bf135ed45b0d6265c274d145d35b73afd41ee95d3f1da4bc8761038800251d138db1b9748ffc257b147a1aea66413b14df767f98f7ba02489c617eae51065ff2bd9a5b167db36225a35fd712d781309f4e2c8541a335b2c42bd2bcae4191cd528d749c52f3e198e534868d537867109419a32314886f6bb2bcd337773", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_2" - }, - { - "Input": "279e2a1eee50ae1e3fe441dcd58475c40992735644de5c8f6299b6f0c1fe41af21b37bd13a881181d56752e31cf494003a9d396eb908452718469bc5c75aa80728695310187ac477bdf3d7fb472e6374b1222f8ebcfcae72a8b1dc714ec853461fde556a4ef408d4a2ce89143674e9985eff87fa3df3ce6e7483c3a2f9b82bcb18df8612ef09775ec815b602e35eb6ec71ea6f7acebdc23667a60eb465e76d590500f7d19190ee1090bffe087045e97c913f7c5730110559665b3e8a9e0a526e", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_3" - }, - { - "Input": "0af6f1fd0b29a4f055c91a472f285e919d430a2b73912ae659224e24a458c65e2c1a52f5abf3e86410b9a603159b0bf51abf4d72cbd5e8161a7b5c47d60dfe5712fa10f98bc3c4faa2a9729408e92a8b4e6d304abc539cc396820f696f23ecbb2b30d01fe71a3550fa6780e70305d28ea686b72aff7d23cd550f886fcd60f6b30d1142c81b9b27e329c498e4b241fa2ab0e0c62170cbe2a1e642589e4ff6ca54069ec036f519726e40596ede6cd47577c5cc24746754280add50bf87fe7404c8", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_4" - }, - { - "Input": "0e6eab4103302750b22364bd1ec80e5edfb3ad06fa175ff2517ca49489f728e9050a17b5a594d0fd6fafed7fe5c447793fe9b617f0f97c3ee6dd29638f6c9232068b38fd28978b73b64592127317a542e084ea8291e404b88d3a731207104f9624d1ae64196a7d3b8e9fdcf72f9dce16d649fa3971daaca56405a0d331e2aa92210a32dfe27a36ca740e4d668066f7559acddea850fee4ebf9c9a241b337e771191a60da23a028dfc3b3b82c3d15802615f6386f29194e088936e3ffe96809eb", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_5" - }, - { - "Input": "1920c53c756f1ec1a40e0264e5f65808eafaeaa7b0885f89852297bc2186ac9d09416cc536a27b6d5616f74dd2bbbfb463b9961752e0aa38d47b5213994959ab081c536b7d9a27636d0af7d4c8dad2e380cb2996a1d650a2e6123224294a6c86039e75a4a93bcc2798aec714e37b9b2602760e7ec7c6f3342e44018f2986da9b2d1ceb9ba9f7b923459d8b4701dfae12b3efd4174fa3705747fba6bce14a87720c15d04d2bd099f86ccaf9834b9588e88fdec8d04bba329d4fed580884f4b2bb", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_6" - }, - { - "Input": "001faaf97b965ffa633612b7c8f9f4be0b286b19662e5cbe6878019d8ba1382b16567ced7a7ee5c272bbc378a95c2436fb0c6133649c77e55a708b28419b5cac0c37556712bc94140738212a1372a4720ff269102f3f0dad4493b675a85463021e03f350aa8213bd6ce54987e7b32275bcead9a9096897b5c7dcd5964a17e07a2550f45b84e947f8e46267041f661de0ced333f91af090435c4bd6d9cecb4836096855fbc396b73c589e66ad989d7851c08bb55755f5771987d91925ffb40c2f", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_7" - }, - { - "Input": "128b65cb80257f3006fc20dbb6af6781da7e0f9213d2b909fd113ee0f2d2bb52251e288387db7be742fe67261f36a4f09eeb4763bbbaa1bb13af3dec65302a4125ed8b2035e437f057cb45003f1c25510d7e232c7587581bdc3035064a96d2e32293733bfad88afa5adabcf320f055e3fe0d1ae733dc21f5e08fc234029be16a18414155506a4c287ac374bc28635be3e6b8fd0097554db051a45138f0b6140410f8c1e8992d53017580b1b806cd23729f9a2aefc6e60bb82606551c1393750b", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_8" - }, - { - "Input": "16a9fe4620e58d70109d6995fe5f9eb8b3d533280cc604a333dcf0fa688b62e20b972bf2daef6c10a41db685c2417b6f4362032421c8466277d3271b6e8706a8034c462aaaa7a3b4ed1266d755867524258c64b9553c46b2bd4d5c26aaedc66524e9d39a8749083573a1b84662c08ae15f16b75b9fd40089ee412f5e58dfad350e28b1c6e881a288290c7e9e12d23f122e61e89c43619f902c48d300ffe1734b014f125c1960a64127a16c8a17da5f21721e47b17575a94802a78711f45fe988", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_1_9" - }, - { - "Input": "1a4db8abfea95acd4ac4bdf3d9082de13dcb9b2a73d6aa98a296a7d7d1009a8a1e8a143f9ed8661a223e211c4f70b1ac1d5057d71e31f182637b6f26de9a59190e817e9fb476d397b0f09aa07d290cc830ceac3ef815c5b8f45caf2cdafd90e209888f93aab917c7b6a9f8ee7174ff889961ff3509256873a774926c0c5b9a0f1005b845c9f53465d9371efb0eb934ecc8db144d466eaf06614e89c77305c35501951dfd5ce7f374b05b2b2a0737a5251ce4d9f53f0ee7fe79399aa09d6bfe9414e57a7979f8f2d78a1c7dc790476265240fff65e18344caa11b0698a574d4412bb862b7c0f8283e05e10a9b6e3bd19e5b69f6988b3f470692f26c379c33132126a4d85b3499d830033f0388c18b8e7b824b5b0b57db1fe366a435b0c1a53c6000ed1afda982e3f8d71da60ede43dd562ae63597ec91b1cba21e1c9fd5b8fbd81795c6b9f6debf45b77638122c7333a59aaa2e7511f526f496feb84c20f651552581dd3c6f3d05c78234b559d784f502fa5dc0900ae7475ba88716e5ac3d499d", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_0" - }, - { - "Input": "1fc8f5de35d75e7446ef5703dcd7e07ad682030dd525b7620e1f7f36908d535e151d3453db1029bf894b5bded388d6a3fcf97d573bcccf93d27456ec79d9337d23ec8c4d66276cb927175d7bc25e3bf5a2252c4f83de5eabd695181834c67273017bea94aade8279f9b646a2e7f570a88aea7eb8bd51aaf40dbfe070a7228a5d06652252d3e68fc6fd6d76cd726513f0f757783f415762ecf16fb288ea9b10252a6ba1abfff1bf53aef31d24fc7d7c18d452ff529a04bb97e2aeaab748cc19762032882547249177d5cc51a46852ebc90ac17f098a3deb8dd8a37fd007bc2baf28714b756b948ac2b606fe0c4c1c3572423892040e5518f9e6abe89e7b1875bc25cd06956892564bd5e9e8557ba6c719e2ecedb4a4996817a8e77593af1321050b2488820e023afa5734ceab7072083831db2f7063cc57cd9852deab6918ca9b00b22e3956983827a599218890be78a3c0ac7f30d3a35d464a9cd4d4ef552576221f5a9cbdba030df39ed692fe2274fe2a99fda883aa4e724d54d6a0f74e0a89", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_1" - }, - { - "Input": "0069c0c3d6aa9ca250e5bd3e2826e47936b6e479ad7c776caa5ac801dd5a1c2115226a94941ba68cd74c5b982235773c3a9cf6a71b1dc9d4d8307251f1d031c630316709df5c7f6af25fc5f698db87b1170fdf63bd2917bc21b5037452053dd30bec8492774364ac6ceca4b56b9b8d1aec0bcda12943dd1437e515fa7fe5bf8000c0e3fd9719382c09eded028cf0c9f866d0fec2fab515f6aa60249557270f2e25f0d2cf69c495554a426914354b553f3f6f269e0d5340b2593a5793138189ae214aa7d305903ecbdbc10d564e1ebc9455bf0e8aa3ba3321f8b9023b911cecab19239edfaa2efe905d8a5d6884da42815cc84b13d9c4fb3c304cd99d3d27b61e15063c61103bc76e80aadf05a3ae6a36f90013bce43fdb48bfc8e3e2e09f838d1dcd88fe88d48dcb4d6401442b46fd713c41d36dfbc50d8dad834a9615fc01581377baf2e5ec86b4bfe2123c9f1d5cac10fe0a79fff333ac86ebffe1aabb98252316b9995e22925907421897f44ffffa963b730c7edad138f41f54652ddd8c30", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_2" - }, - { - "Input": "240517a373fda7a2fef6ee9e9895505545c354433af3d3548b8537abb10d445c12e45a8b8c4d7a82ae27f0ffe3dd976b1242b040b96043ad31ce9f2ffa5bc707275ec5565ec4ccde5088b40c57c946be5d48b9ba34f956611ec87ed33d47500116f3ff1c54f920a4ba438c43501d2ef59e7c7eb2f8ebde852309bbfbc087af1b1742abd3e12ea49804bc4e8e59ecb9da6789392b1e12958ad653ad49f3d4d8450a1190ddff2fe9afa9dbea1e42222afe9715e1bced4e7ac4c20d89476ed6253c0bcfe3f03313340fd392b32bccfcab83f942f6b13d71e2a3159239c61c50c7bb199c36728784b46d5607ebd7cf5a055a3db4458ad6f0fb7e826d6a280daf625d1db3a467a1de6f3b848da16893902bb07fd0b63f6509dacae6693c7975fe09940b291b95276b136f58cf6f899cbb5a6f4009a4d069be6c0f8f0d6bfd7c38991f0e46dd20f14881ed44b216b44ba054b1f32c61d01f33326ec7f6c2ace3c8901414f211e03a121fcbb34f328205223d7f7ddff484efdd5d06e8886f2781f8e549", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_3" - }, - { - "Input": "15848a9e99c4a0719df209a705edfa52bdca729d0b73a9835880da9dc0cd2ace108b1a4ceabe6a8ba3dea041bb0dff513e7b99057d4b3c2aa378807de47dbc3627515ea8ee84feadb86577a1b7553b2016cc63807de89fcbc05bc3d53b0f23332872f837e4cde9fbf64bdd170d6488a3155bcd5b1fef4fa7ad10089bec8ea7b803713c878e32a49ff95dc2bbe7b1491c38258835dbca14ab343e88dc64004dae0f9ec7e3c20939b84e40bf66864e8129742feed7e1291d752c76bdf28e02d03b2c48bfe10367b611f37ab5847542df1d30baed8abc5380d6d80032d0e04af0d10e119d730f867b4e286a3c1c4cd04236999b9bb94d9001a4f144982d72df407d059e6ea753e84de7e8b41b2d0dca1cfb6b12afeb2564a5e24a2064f1b662a1a912e0bdf2470e896d7fda45c39a66c5c4a5297b4f19810ee37e33f7f50499326b1f70831beccc3eb5fb719d27f111e5c731cbeb4002519a4b3831ba896cffb608157b59ceb6f7a0518df929eac70c7bac9ef9c196ba21266ff47cee9bb0c60864", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_4" - }, - { - "Input": "08a66cc423317e9d9560c307c7918b87672f3d99effd28b1d2bd2877e09fbba41a58977974f56dc522d159bffd0099791d207d2da49ee217055f5d0806e2dd0417b523e87e1d03b9498facd5df95cd85affaa681c2a43e51497997aa916318391835cc25b6a0979581ff7042a390a7315d8f5e938ea40dfdcb24822889e494cc18dcd8bedefa1c477913634203aa21a5a926595f62f4010eb3959d51acc430fa23ff858e75bc56f4d5054035aee0fb7264ecc4861ba1c44db81868108dcdc4dd099b58d1c3d880dda20c24def1b2c54cbb20ed9da85265983a00c1cf1facfcf903e39662a649ddbc4fa6927ed85694167b49ee5787bd755a5e4ff6fb82c32a9f20b8ce350fdb30744dc3dd1829ce8e7365a9ca56bfa4f79831355157a73fe99a17a534a927ed0e6cdfe9ae9befe94f581d20a4f19aa54c93149c95d53714c5a70771d55a8c477c0ebdde254d19e591fc3ecf011848276731a12a96a3267c5c710c76eb36abc43ab4d4b5a7a82770304fc2e9487512493dc5fd59aa6eb30402d0", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_5" - }, - { - "Input": "08808ba03b1abc4b870cd2e50b3960e85ea4ffde76e97ea70e62feb5712ac68823f1f949786f8cf8a18323bbad75bc71afac4e2419181fee3a627a8980f5d36f243b9ecee8d6c2f2f1b91980e4f7136d16f70c94c5fdc21354adb977bc66d748207322b7980616a6e4f4ddc3f223c52a9a11b785298b69f4075349274adeebb21226d7ded357133a1e9a8472f9c0f23e248c1ca1974ae336f4316731f1f473bf00b29428be1694c86da00b5cfe677c1b3332c93105d18df718f9ff0053bcb7a620adf7f96265baa9a9b1512eb1d59834eb931491d360408061135a8b30ddbfdc284fb8dde65089a6359a11fc8d2725409e2bc1e52141f1dd38bd56d10015346d0aad6b6b34672e8ffda5085e97e2a7f82ff4e3e6660b83e151b778e2dfd1ef3f14b07ac31c0927a5cb27b0447051f1ea39baa7ef12572b9b5dc535ffa28341a220dc6c1d760064168c59b36eae9560df6433eb96acd58aa88499ac5f081eed30245b974d3078709e037860b2970943659596a88d529a36275b34b38c51ced169", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_6" - }, - { - "Input": "198f03850c2c5df1bd5601c0a5cdae3cc955026dba50a79dd00aeefe49c48c252ee3bce85e4c7bb10fee21428a8b0c1328d662e152f36a6c62caaac2fe097c0b0c91b38273eedbc873b2172cce9eaf7af1463cb3fb064a49cff2dc95f0b5bc1224a1a5e52496677b5dfa29a4e314d7b32bd22c0f437679e12d0c49c9d84e988014d4d06a717737c0e36767b06809bba6bcda2707bd652b3f922c3a652dfc90b325d0de555188106e9c4bd93171a8377b9d53eeb93b0b259a91c7ba570591f4010f2dbb4dfc16b4fe806d2ed28daf51530d6b88a81c2ffb98d3a6c1153db9239421b7f52300ab7b6eb9d9ef4bd7d58811909cf4c4ad7a9f8546f56099eb6ae1370224ecd4af7d5ec18e5b0c8eb46a8bc774fc4ac6c4233aafe9bf22420ddea4752bff288e58f4bc80b1bb91b450652c120db2ece783788b8ff3beb20b2e8d3c7a2d90a5dc703456ffb854fe3a746143e82bd8e4aae8321ab59a93e5da9d615ede07f9f33a0a234486c63562fd9b27ee6615655b6880bd511475059ab40395d23c", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_7" - }, - { - "Input": "2722ae33a1d80f67a5da37ef2b7489dd39b1c98287fc408eb416e37de71bba1c3054f7ce76b782aa80254ce991fd5f115810e8f8f57ed0a12f30278112157c11165fa63e0d077c2b406c1001da54664d756636d6018616841c5b0d942519fecb1090ad3ca54838d2b89c0d2e3db3c2aff811d58bc32881d2ec947f473a8308a615b9fb021f60b7604ef07863fc6449504708718eaf59bd00f3620a9da16ed8830a95e72b8b56d1850126d77ddbdbd376e3b19f07a75071f0b958bd40471fe6900738bd659eab6973c3416b9e7c9660d341e8eee184c0f9c5ec59696f220903401e37dd4714f68da2a6affcf65a8cd26c7ae3fa0c0e5a3394887ceaebe4f49de90b501640d9ca26d1b466a9ea005b942b047fb519865b3413ccd90533d9902a85187c1fe325590f77ef42af537664469fa950986ce82c31eeaf1f6b348a3de3c6202ae189a9bf004bd80b9d8bdaa9b395a5263735242766aca3679ec3e547171b2a06ce9550542e6246331cbf852383c14830931cd63ededb0f21621b71e7f981", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_8" - }, - { - "Input": "2bc49f4d8134cf72ce0883c589f4f6f0636db174b6176e063b3effdd57e3404309f61eba66408ad541dac082701734d6e6d4cf6f90bc0e65d6578f2d18563e221eb59aa8d8a9187b0857ab89a453fc53209855b300377bbca411998bdf9aa6730bd2384fa0ad96fcd1fc6c1a1a1fb80d4859770ca91b9559281736cfd6745d011cb39aee49da07d70b0f579101c412f1068ea82671859f09c4c1cb3ae74f8cc103fb73a573c8f147ae15610e4f97e291bcfe16556842e00e88ad70db0df2dc3a05430e574064f2d1de68795706bf99b1b6079a99bda3e5ec266567f2f9246e090f5976710762dfa75253c53ae1c2c88523ff08d0c2523d9409033aa2b7e4392000036daaeef66504945efa89111745e29d39ac317d798bbb1d14f84bdf5bfac91134d59ae245678087748ccfd3c65ecf2db2d05595cd6ed8452346713768c7411ab6efb518910157009fdc818e5d4e082da02f0618f4a3d6166f830b81a4e683023ad24b09b49bfd967c7adbe895811172f04a2b90b1379dac89a6fa1a91d8cb", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_2_9" - }, - { - "Input": "03d310db98253bb4a3aaff90eeb790d236cbc5698d5a9a6014965acff56e759a1edc5e9ae29193d6e5deed5c3ac4171cae2da155880cf6058848318de6859ea21ee564b4d91e10d3c3a34787dc163a79bf9d571eeb67ff072609cbe19ff25fc7270e094c2467dcf6ecf8c97a09ef643cfff359cbec1426c5eb01864b5cf3c27309f432f65daced7c895c3748fa0b0dfc430584e419442a25b98e74400789801210fa7bc208e286ebea1f5c342a96782b563a0bc4cdb4c42ba151b9cb76eea93d0abcdaf6ffdf0cbf20235077c7bb3908b74b9a8252083f4b01dcbe84cab90fc71a9681988a15b7eea9ae8cb0c2210b870eec2366e0531c414abb65c668c6eb3e21d0be81c5698882ee63cb729ed3f5b725d7a670b76941ddffff9ddca50cf9af21e61a0ac51a17c0128baa2cda8f212b13943959cf26a7578342c93dd2de7deb194e408b546197d9ee99d643e5385dcb8d5904854d8a836763ab8ce20f9b5027222aced81c808247572971b490eef1515a49f651f7df254de2b35310bb5b78c218b2345c40036ea331bfcfb8536739a5e5530027709adae6632a3613cd0838cd204121beebd54ec6bb063ba5a6d84eeceda2a733260066c90d332425e992ef6c2b0f794d64952d560a422a7ff549a58bfaa0cf791ab6dfad1c4941e19078040324bad1c848f2d8efcd716f7d814c46e2632e74a5b8d455a64c55917b220aab982ed4bbed5f80fac726f4a95789fee7905eef0a241596acbea4268ec3f2b87f3129563b69a30c11a856f68c72f129988e8636c86f57467cba299cdb4917469b49137a989e5d714b4b882d4a455600940ab63b14f23e7934ddd62cf5181099c63b2f57525eb3d19451024a4e71ee09c72c5b7e0dff925001acaee126bcd29db5f600d8ff46230e348d08dcbcdb1f85a5a43aa7b4f51841f1d4f98c18bbb57651982cabdf6326194120727367bdae0b081aa7da12c8f8c6af0ce27d2f8d0f059fe1240c9c5a6993d344744d77bbb855960b6704e91846cf362444bff1ccaf45a7c217873a5d7834d0c1d7d9bab5f9934d7ac218834aa916d459d8ceafc280d59efb", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_0" - }, - { - "Input": "2761d967b3f2481435189a94502260dff1044c8cb24ea3809d0eec28cfdbf6c72c87711eaab02bf1f9940d504be3727789efbbb1c48370f61e2e4daad31be6de08a73a943ab3a7ea19633a4ef9e9bc1de68a51d778e41589504b8fb0818cdf88064eb3b5d1a63404e247cd5118a695b3b85d63e89c8512309d591701596f172a210f847e73452b29da165f6c76462f2ee76ff301b534bb0d2f0f7374b041e15612a910ab4044ec261965b917059383b5d5f5c9eb201eb61a6909fb5a610849aa1f4535e9a8bf16a4a4435004b8ab3a84bb6495a0d748ccfc25388832356732910e2936a799b55efa690fd821a3cb4d352cbb3f22ed5fe865f984e289329ca6591e4e4510639258f836e30c422e3a18fb76bdc121fd28ed77306a05b8a3299fec09decd53dc1620f84154fd333da06556e87fae4463cf02459964412fa50d4b082e0120af9b40957fb7ff0dd412f59cc0acc01c49021389cd470dec453e92faa3221680f87a61c96fefc9ada16473b853c4c92a03e1e38211a9487a2812f830760f4841710cf252069ea39d70793aac9b2f769a3954310546fc15a109f6d057d30f01c88e34c9ec83f28674534aa8ad16f61b744b293b63ae3c2fcb178a08408a1780e9ff8f2973152194ebd44ef8b158470d3f67d08425c7a9d99a4f1ee9502704bc22f9c0177342d11e54a0940cd9b51caa04c762f060d5262b5f31c66d088729dcf02930b56cf1a3bcdd147cab2fcfe913c53bf5456dc19edd706ad2122be5129ff68c503fcbe10cef00f314919b033000f43ca563f92e95a8a9dc19a867e400d5a976132900579ff4d8e1f64d86a453d7576e16459b641d574d2d9af32c0707107329853a55152341e8142e6bd97b51118d4777e44d347a3add4f6e73a6d52c0175507a0d4432b6a72508a8fe5838a14c953bb0a8834366aa0ace3a1c12a005e64fcf94cadbc98cb78a5f768409a1cda219c504f3c0e99d1e8de93601046528ceafcc22a3649dd0270094b4b3fbe55fae668028e67a8dc3378fb726cec2fd0c3322db4dccfde2f638c9e7cde93246102e9539f5ea6bf23e57bb3f60e8690e", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_1" - }, - { - "Input": "28d6423856311fe86c30fcd983dfa63c95bc5adc1dee6fe0ad715dbe7bba3c091165ad57bbd71dba3d734f446b3a11cbfe5e02051f6898a677bdda5134738d5709661289bdac8badf175790f8e406755b33e54bcd8149e1e469de37447185f110efd4f6454886db697584e85127bf4826304d0d9559195b6d3f875cad607958903e94e1ca8dd25c626e31daf9cd26b3caa7ca2615690127aa11647cba037c92a20179a34c869f27fe9783e133f50fcc38bfb81200b9c635d0b9bbbbc789f4cb60511e5e1561aad84bba3d2495e4853046ae1972e687ccab832f34f19fe9b55db11d42ecbbbf14d945c29319a9a945f64610a2bb9059c0c89911556232bdc6c4b1e92ef35b5ecc024193888d764218828778507233cda5076633acd49986023ba1c0110745aacf972ffd66add373241c8285dc6c96928a6ca012b4e572f1897540deab5945fc017e575d40284abc7356a20bb85330533be288d0a14159da44efd1fc7bd3676093afa2c2d809cb5a14b913c5914c77b341f018f391cfecf0029a2090010e0c084f8c16f8496f1c6db02902cccc6cb8d58118e8dee1baaea679a370075a1886efcc99523c8abf69974f742c7d2de3e12598a963713b9bbc31a9f0a14b98584a1aaebc7649c481668a54d9da6fcb308f3dec33e0965775624f2f904298d6b7a0d04b3a217099a7daf390d5a7edfd72b1c8aab02e6f5cb440cd4a84214772064081adcf6e36148eec3bcbbbd12d363b4a76e7018159f559c2ff1c0d8051f9f9abbafb9032e3c95ebde21931a554fab74bfd7f3d61c939268c46ff9c82ffc5143ba27c7aacca19326cd8522f9d55e6b6d17d4b0586b81d86e76dfb9730782e23592d8d735517d63b6b51313e09681bfb6e66cee098ebb60ca3ebb18f80ddd80135c76e5e26ec2d004f572d267f940a5d5b82e35f4df366312e39387662343e67b7783310ea825278a262dea12bd5b1fa71735819e3e360f467d0af5f522234b4bd70b251d63a8dc9bc9e63117ca8342c3dbb3068df38229b5b34f2bd21097b0a55ece871e554a89aa97a7ecb95cd9e1f5ecea94274019d17b9943de13", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_2" - }, - { - "Input": "09fa51b9f1972a041220b86a762c252262d942474d9c2ddaa8d292c79d34b8132771b3f3a480320bc7c9963dda5f4e8120b8f06a0cbc6095d37e0dbbf0b6f9ce23d0c74ab9b983b35311ad334580ad3e9b8ac6eb0ccd69a5097884056c8310e01317cbe87801a1bad8f362bfa07f65f4e6f0df7f1d3681cab1995df75f3caa2516abf6c2348309a172dfb07485e59d4b149d20741c740c9379f5d235c8b7dd922fc0496ddcb63fea074ce4aca7f9a91884b8f3158970ba3f03fd58608b50b7d511857f4a462fb73fa92204c79e81824de2825b74103238b4f8e601a2cb37121303b531c48bcf5c8ddf8e608cd16eef92bec33929ef4d8fe57572214999746567129e8547b1d2f8103bfab8af9a8849ef950c020c2a24c235c889dc65d54c6f00036688a10447a1ca50ecb46b9c77042a3e0959de2919eb62e55e08f94b3b491b05f4e65becdda13865c79072d38ca4a35cd934ccda724348e68631deb874a62d2bec9369394e4b5d549558b030a5b8681d23a67cb9d95465f531a39ae61782b729fc71bd60da082f1dd43572c15900fe35d03e10201fe93668c6e31e0e4330212b0fe78b06800bc1a549cdd0ff91ea7ada763609799901b63a1d3ecb446ad1110847890bfd62a9ad72ad058345167d3716969f4f0c1861e532fcf5dbcbdeec04018770d45b235156f127dc39b55ce54daaccb9b2bffaa9692591647fb85112a622ec7b25af397ed0c3738c242d8c7d98753b0a64f826ad284412b93decd25a091a8d6e03829186f4f33185c75bae823e2840d04ca583753b9ba7b9a215de06ce04ca57858bb1cf75033675d652331e737f7d98400ea1b42102273e74f75ec4a41716a588640c92a28e2d4bf4ca5a6c8fb6fb2d910ce2c882fee639f5e16f11cb1967f6d1826b83b4197e628bf36eead712652ea75027a48148059fb422bf03550f60639bae9064af3ee671b9168eef729fa30153c89843827a9991da684d72ef07e000a8e29e909b06936cc43d82c5bd6f7a4108014532483f674ed28df007232003493fff270b3289b402ba1eab4bf90cbbbdddaec3e70fd0eb648c0fa61b2c", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_3" - }, - { - "Input": "18db259896bf7a55fbd739049dcd87bab41bca06dbe6ba477bd91293ecc7b72a080f9707ac098f3ac7a06fc4cddf9de9024723d7803df1e832f23facc344e09f1f0a58aa3d929cf73ef5fb29717b46818570f8acc287057a61f1bf19952d5d870a985a1377ac0068c32090c4f61af49e438888371fa281863746ad9c4505839a1635829f9dc1168b264dc1b35951410b3f509179a86259cd1bc219e0d9fb6571282e9a7a2784db855d8fc301a21574e67751c63574f552b5075cf0d54feb2ee7086ac4e5ca51c4e84405e5310187119e9283a8e1d4b9be261bea666f724501c302d9e8305711e2081373125393ea672966c2b7931d9de75640aacce9bdd8ff8109610ee10faabfae8ddd3bae29f8644762b842a90a4baca50bd37c4c8e346cdf2c0a29ba08d26cd5e2ea3ac028f2c13854b997da5de4020810d8d1df0b5ede16181628b1a3d5936ef9414119e8bc454d0209022d6c3b6722ed63bd3be9fd11ef16a94dc0c53b0283290c9189b46b2b2e727ac54299b70b73ccd31eadbbbce239183aa0627c185bbed1b35c46d0d2ab1e248f7a4ab6d1896afcb8cecd471911ef208db0fcb30c4d601aecc21ad3457e4a636a2bb289712a98153589c3674a774f08c0f49c7c290fab83aa67c3ed645856531b1e537e060fddb3b722849819cbfe04336ad8c78b7ecd068f1f543b4cf09a510bed3f39c8afd71b549b957d5b4fdd0f2251c9278bb30892b0ea4fbc771380481fdad33dfe0e9f49916e476823feed199cdc78bf86665cfec1b451e92bb8122597a0b28bdd5d380024756fe070aa101deeac40a4d371c0154aecdddb082f6891c7c3a5074e1b5c1b30e4b3ffcca6980bab17266f609f8c1616cf6c23c51e60b24d2ebcff2c7e486abd11f878ad231b2e69a5773f6986e289b67c70b92da16c0c8f2a8dcced737641061312f5fe17952151ca3275c32561490b233e7284a4690a777da485efacab5557307c6d8e588608aa1e46b4edfd86ff457f0ab244e624488e4563be1a0ee35df8b547c43e4e0411b1dce99279dab100f4137847c3bac64342dc95b9cdc2e5880ae61f898181d8", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_4" - }, - { - "Input": "1688243c91950e540e5acdc41b84ee9d2b1c0ecc84dc373d6fd5959baebb33df140c8a9c0ae42792290c177a97425bfbfaf7ef008b7656e906c2df69fbdce89a029c4ee67b639e4b6f7cf0536ba1f24bf61837351b5c74f12fb6cb0887aac3ea1d3c75ef1b03ad925b1b223901a8e7a4e16ef2bf6600e7c175529c18ba8008350aa0f1fd72acfd2bc3c50664eba62133ea85341f0b4ec0c3618f3738401a42ce1fc3592b9642716c47152c9e52881fac74773f705c15b7737e0831ced7a0f8371245c36152deacfd18a947b3f3c83a30652958dd9614b7beef8aa8b5cdb157462ac85cca98a10e6ec5efafdd593179f2f56c4febb1ae6f1d72a9661fd8ed51032b98467d16a6e8e6bfb427838659b8df567ca38ec17c979560bee66d1ab72f372d38efa3e51e7ad3ab06b5610e0631db0a385101b45d0fe47c25610213aa023208289e3f0845bc2197d57ac44b4a808b30aef09a344f80062bd75a1844715d3d0cf55d95f2fefda6a1bab5796626fbb6345796ef134109de55bd61654f54c71f16eb795694ab923473ee66eaa59bbf61de8f8dfa94c481cb4f224b3ba90ec87318c3ec099e1aeb3d63840ccba2159386cb3d71481ef18b5466901b71cdc6e75e1ce807182d1b89fcbaff954b80d8a58d49c953c05a64e2a326cb3ae4802a0f9f29719e2b60002727f32b49638ac3c1d4addc61cb260c4ac99307ba24a7743ad52f325d4f32b8477cbd99a218c2e4ecb3171cab016c51cd800663bec05624f1072775db17ff93e8b807067572c97cbc7321e9690b8fc4f193eb0f1a93ce96a5c20cf7cc3dbf579b54af41204b2451098724e9d8940bd4cabff1605f33592e5f002817dd14edab5e60dde89c66b3c93dc057c53b926b2077d63d2dbbf9316bd64c2bb1b35df3f9ce28954fbe15eb52a08aa70453112cc94ad923616aec0553dfce0d5e44001e7b139917b4cd2d32bca418f24f44bd7ffa16edc47ff8178efee06f28630c2816b74f232864deeea9073bdc2128d704d2375431c7bb196825b0ba890b5ecd90caa2107b346a40472b9972bdca3e388e38a2914e2c1f022a82d49b4f", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_5" - }, - { - "Input": "0eefcc4248b67e40298c48e0ed47dca1dbf6f6e377506899430b11bf03b17ede10c71a49ccfb43f8475de84b581eef9ab283c1238e172bf48150f29e1e56201204c9eaee6321d6ee36b8670498aa1c73665f3ecc7350c8ee09a573e692d26320171450a989ebe50e365b92d24c311fd830972e7b16a2523e634175c4e24c884a1a6bf429331081e6e930bd36e23bdf91bb8180a6e4129c11655cb9468093ceba0e9d0caa4d47983e49ee253051aaefd86cc6dd367384f89e2d166bd721c658122a55d1dc0b4bd2f33984f0099a6d44c85baa10aaca32d0ec89e494d24514a68c2d43c0e6576ec46f88dbdcc7c57d685a3eb9342ba7c71b62de9e6373bd9094ff0a716e218f8e4174821a7dc090fa93b7683e2a6e363afe3eb7287a7dcbf9ea090dada034b037e05a7c8b232b8c691b7f0c3b9a870d786e913d936f8256f2e8c0131bdc0ab71a147cb4d91bba85941c00ec91994d2e9e53b1929a14ee2e876dff021d8b2738aed0201234d3919498c918fd5340541ec616542d92d955df4c182902237ac6c6802585c60640eefde7c05fbdf206a5ec25dc3411a4e9b4e6b57be611bbc865815ccfb7c666b117834cbf2a7edd9c2baa691ee3d453c3652c49761b234be3f502cdf3d1e6258eb846afca7acb0fe13577e226ddd277daf32d1d0c5c25e39a0be0435820302ccb2763016b10d0dbde867c745fe86cfba8cc925a2eb72d4bb48beada74cddc1c791a980d9bf7601ce0aec444354a5c02185d392f66f50e4860e017fc0453fd1bb0453197ff5abfacd35b90e7d9b03ff0900cc857ef7f2f0ccd45b2e137fd53d99d027b79aa390ac021bf4d6aa95cc96bacd6a071386e21f73cf3d42f0ed82ca6f673bb89223e16386c7328385edb01eadd4ce28e5ab418861414b0b511cc6300bd0cc6c95538014be8a4a20d8cf56d74f4a63225302b1f065e5ce6c676af04344de377f580aad377dab935d532f2dce9daeb0f31d6900af84aeeab7ebb4390e6bbb4218558fba894959f2cc2fef8af5d1c16998a38c6076f86dbd858db5b0b15ca2cddb0092ef861188e0434f4232d7e3e884fa42bba", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_6" - }, - { - "Input": "05fa7cb22fb8809abb745dc167279147fa174e0444cfc99a38f23f2b93e49ad62f7f94d2d206264a9358b54fc96ac31921948cf3c13d121c923991f0b47c04291b2582586c93d23816aac8ce2f90eb913e554211251bc9a2d64dd2efb9a905b80f73f8ca76c166aa5735d9370cf944306abfcac5a5874cc95b00b569f7eba01a1d92dac05e6fe60b5131a0d2e9c459d4b3deaf1a462332b285f90a25e5b61c211467961e060894bc8111abdbb66365b9da4a6700f2d530ae69289d2cc32185d004951597c8a0547ea22859b97dd87a37a8b4125bfcb513eff29e0bcae7a7dab00cb314388716efc2bee7b4294811db5bacaa3bcf720932e253f002b53e968f930bfa9409e358a1370c298a8cb622a0079bd7bf1a0e32e8f8dde7a0f56877945d2f95f233ceb61db914a2fc789bd35b3df37f62329a886194450ccc9e708d900c1fec898ed485e2970646f939313b33a6d3416476fcb249a96f6f11d030093f890621cd7af05f335e3514d7f10972f2b56614e917d9c4cb85178cce40f09a2291211e5387ed32f8c6f90d4c90d60fb08844a0fe0786717113aaf8060208331d3a03558a26134672a33a540774a5a994c549f2ec4e048e99c45f6f44692fa09ecf2d625e843fb3c186d9502acb5c9c3e6d0402ed815d76cf081e3ed847bdf8b0db0caddcd63f8dbab0b1ffdd45ae118ad1dcd7c1306c75a1f448a0e610994e5f300c058a66f63de3e94c81e96dd0cba0182c1371f61006d4cf9c9e24cc439d0cac280db62277ae92b4403f31d0bef2674900f1c21a0fb715b5cad4689154bbf53c2430b990502a5231b79e63246d15293a37918adf641bc8f8b18462909c8d1eea14434c1a33eb5a3b425729a7885db91c54240d3e8049c3d10811709dc86e71ed08d9b41714cb20a4d28f608d83b541cf998bef0ea0257f477e00c180b4e8ae4a0698e1e77ae24715eddf432eb950c3e26972a08521c31c484a733ce217b944f6190db804087bf4786ccbde4b6e149f2471121b29b6cb21d1f7baa6be1ad6ef18295d7425b744106a6fefb550e079074b1933af2bcf989c833a5f133f8e1c490e", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_7" - }, - { - "Input": "273cc7b93b70bbfde8748d62210c033579947802560fd05dad9d65003482995b1b7379946dee0b15e90720dfff72cbb60b60b5aaa8490ed2b77e8f57a8906d1816836ad1a19ace6e0feaa4195ee6006280ce178b5987341221c6ae618794c10603ea811d60c99786835aff3871ef0163cdceec010fd806bd11adeae2a91f4cb6179a512e9627d2af3dfc8a36850e144c7255568b3154d41797e2ac4782234925047ecbe78073575c62a32129476a6456c61545eb98bbf925ae1d673a32d680e71f20ccd414fe03613ff7a3d330ab8bf8964cba66cdf3af8bb955cdc729014e692ef7c335beb80626f05301278f5e3b228bcc981736a258ea6bc4802392f081de265db5dda279bf034808ed23c8613341b31d3d29a2f65a367024af1376d1bb9907b7ed2f35386382b00fb0afa6c5643c170010e35824d8fc84d3604690fa18b404685df83549a5573c7228b29a7dde8679d8771a19e8af709ca46c60f8126e4b033a388adb6c574f85524ff523bc7c44b49c8731b763836e0a4ebf054f0008492b60683ad457d04d91f082e169606c6e5d6e172845fe586925db00a8e6a242c409a8c11d9bd07c2ebbdd653519e9a0f5d29576033ebab9a564e1b07d8909b014232fdeb565d57fecdf556f1b9753361e8d7ceaef0d4778b4669643a8f980ed9107e310cfb6db05062d60b0810fa4aa6ff9825ebc58ae839c844f82ad08d9a273161549f2d3778e678f8167640fde4f43d30f2f60d7ec8cc83673d0e5100235e405c743fcac26a09a44bfb9bbd6f767ccf6dd030879dae04027353dcbfc9a89af0f566f9e06f1a6035c08bd9873e41dc3bf009005f905fc0b9b74ea57a16c5a2411c984cf6d6d274f79bec9cea6021001d0729f412858eda5c909d8bdce6a24980d28d7ff8a6bc01cf9ba50e6613c5495f13a39ced02158862b29579c4cb0e947142fa8592c012a3038fe1178bcb515a016a06651e387087a9110ac43ea9548a520537d116ead0e2498e487613ebb81ef0f6f5210cb448e92f2cda4a4f57013ed1f922e1c90d8e8891a308adec863c0b48faf4b7581e0565ded5a8ac6bccdee08", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_8" - }, - { - "Input": "22f2e1830cea84486d7ff320365a5ead50d356379d7bc4f2b9d77dd298f36fd8087baa2aad4fd8bbca8cc0b525041e1b17aeb3ecc63086cdc6fd1ec2310bb8db243fe8ce837f106ef17e387f9d78df833811427d5338c83f0622f92a65101da31ab23d2eb26b70ff15decd58baf91a68ec85f149012d481da67f806b0571c9471928767c9a5576ba5fbd7cee08203e6de3d9dd36a756fc621700031081a80b7e1aee70334cfaeec2f7551368818353fbd5810266c7d1ba49de47cec9b81b6e82007aed597093879d894ea438d094f3373b51f31bd5993e026e76502bcb1334e32189a92e9df00c0b5c21811462933dd17a5328075b472a53ca61bd9e136701571e529e7c4912cb565a3819473e8cb2c45e0a7b17a63f11e509d80472921e86f92fabe095002240b012e60bc9159383bdbf515def6c41acf180adde6913625a7b11d22c04a21962ecdcb1b679168cc14899e2912f233ed37d116cbde2110af4861ca847018951f8d71a369874541390d23df3cf9e5031655d4e7af4affdda5ec50fb5b633ac619c06ff0312901dc9d949ddb443ded5f59662788c101859ed0cab1782bd118c15612ab18ecaeeb9226a0145c0c1d01428987b8a5523c6da78e015261c22b6d73323e863964a003fb93594743f70e9248ed6898776780a7f3ae7a41b07a0d873b1ece5c55c6c942a7c7249c3d9026fcc607a68fe6e73cd4a76a6821f86065d5e87ffecc2c47bbd85658eb21bbdacdb79f23b031a8c6df93e64574c06eb93cb065183692c4ae4dff2efd51615d926782da50054e4a280c5bafb913d02369aa17493b4fccafbe637b1b7c9e1225e7b6fb24720f778548e304e7617b407e83fd6e3da09599850d6399059fadd57c4fadb492f59ad3adb4783ccda65272f190a9ca862a6d9508d9b2513edecf47aaa4fdc7a64127dcccbe64b7f206d400148ee9fc305099c6a7334452f25473a58edc7161895ab52e3590ea600e2e885010b062ce0df9974072bf87f5a1c8072df23e612b254b688084b5958314efe190bb6fb66657b45e6f81fa7c5fd41004f815ffd08ec00cb46ced2b1f97b04e69b", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_4_9" - }, - { - "Input": "03d333c171b569f9721355f4b5f9569c18006d55ea805d0ab72f392e6e6be88e230688a302d20e6934bc1151bf8a0af65d4294568f5af0b041197aaec74aabea1aae25b6edb4994684b2877875575b74c14a19eb068d429accd0bbbcd4de1d110b2f112b63197fcaa10a2afb08cd221bd509c829efecdd4a3bade00bf947cc3911796bc946a8148ce73aa901e2e1f4dcb259b11ee880e088ddff65f5f6f05d441ae8c9a28a7ee1d483dc47235e16e19303455ee1b7c6c29fdff01d3eab2c4e77284e25e7b8203b7b40dbf1bfcdb4fbdedea474fd44ed67dab27a031959453e9b0010adb1d55c492437f0bab7e1b63a56467681f06a29aca6ab95d29d5fd23c3529e107847478c3dd0aeb69d6c4345dd0239ba105a1bddc699512e027bbb34b81111903892d003d32111610c7ccd4c529f75cc8bf33a894f40756510ec8b9bcfd0402b66e82c6b8fd6de9652d5c81821f69445b0dca7cd052e1811760803f778a1ae8318c37a3652bdcab122282e95dd3f7393b3214e8ce290c01c9345ce81d1c09304eb9899baa26aa963503f8a55ed2a5d0cc2d5d0fbdfae81c3a823790d2371874cf1b2e447a896844c5338098f2ad9dea545e40d5f5a4369125d95fcd5acf0c0ffafa0ba1c1053fdc155d63329f5d8540fe5c6a876793e04913a1e6a7c88815fe284d364a500612c376e7bd39a466e1b9c4c0a85b105d15a973db33a0f1d42ee64373074312ec2147daed5fbc660ff99664dcb993750af8f192ee51b849a51d9a24c4dbe4f69715d00e8ede2f32c2a54c5e8f8a57487cf80dad49915cdc18239b7847b2fe9c17f926ad11e5161802872b6607265d5bf10c737d9eb157506c05725034e5c2a941efb693478b4401e684afba8af20cfc14c53f66652c737ab71657a4156fc5dc9ddf2b07d05c72395c7bb98f97743c6a81dcc11d25dcf313890effb8dceb430ae9009afe11d1f00e0ec2ca627ce9c4919287a319590dfba56d1d76f3288b570588497d0e5cc88341ba9b40b8fee65f042836161d718ebba12203bab8927db4e4b4dcf9ca7f4250c61d0a055985996d04e0c76d49bc83bad37e0a1a1f642a16d95eaddfb9b7a403bdd032f07c9222813df4dda4aa3054716d7622a999ac90eaa7bbc4ec78bb5d47736aaf04f706ddcc4724776a5dc0bc39cd1a0c9c5fb89113f93dc81db66c1ca13534f16518fb0347056c08bac62a1bcd1b201516a4f52fca78d9d140d40687b093176eb90fb236c03cad3ebf57027afc11742095f3a98a957815f7b13e263a5f11bccea9f6e716e219915e9075d9c0c2a8e0260e553a1182aa35b5d8d710c9705010e1350c02b6a217ec61245bee22c8509810027b242574ec29b652f249774d7320612dde5ca36f20f42bb169352a568e4c14a972b4ef4a1ca49f0e4b095f77ec5929486d1a051ed3b766a40d442e8e7d3b04ebc527aedcdd807d94774c23dbf3bf2841a2a0e3272e10431a056b1fb1224d16565b2f5350a0c8bcdcc6a3a2d189cc488c6c88cf9a0bd213248f73095f4ac0116d2a932043b527cb2a7c42e329a00310c9418da803179a099418ddb9ed859b06035b9b8fa5ebdbcc460641e8af2bd20e68e62d50563672a52294cc0e94cb331287c3cc9c9b8f389de88ed033ca26234d38089a712dfac171b8c8d743c5a2560b1f5c5d64fb31d6830a6c982fc8daafcc6b2ac02ac20685e11cf211edadf2bc01f9b7d3b716110dbfcda9974d00a0e90721e9aae490f3e0ba84b55cefa94919197ef9a4b21ccef5186f0d9801a25cbb77227b2d8488fa8da35e8c70495fb6861997575cfbbc644daf21868564be6a9fbfd216b252271f08fce405355d84d49028f6c5397686e765c5157034c2ed2f92e2d11c7411613f5c60b5ee50540df6fc025a3e1aee7b30e3113afca04fa7e3949a54f65a25aa8241d5056f289c3378a72d4730731a6659294dfe163718d63cc6239d09033ba48004c52a9d55d66317b62493908d3215efe3d2cb77ff6447a971599b2df711a59395515c4cac93a0f2211fada2e1799efd65247699ffbc3b35cce7d210a61e868d3bd8abb37e20bd5afe2a628ffe54a17a274af70c3584b4f9a2e567c6ae5d5a00d14ac7ffc12d04e06a03d1fee23fa99c63fb8a760fe4794af4221f7bb7ceb194c7df2c63859c8b0329", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_0" - }, - { - "Input": "0bc588b9295424a643de2b40a69c9daff62305085e893ac5c5d404ad565cb89f064f181b7f3fa23a51b829fc7965ddba879c6fb6eb4935ae33756fd01a603ff006bf88db9882537afc39611a5da601b4461f23b8bcd724de1602d10ddf2400e1103d4162b724a3f59c1dde973ecd3086f599fc3fba3092a392b247ae0e555352086554bc12b5b21906ff1f5cbb8ea8065b8384364f1d75dc43fefd5be2ba6e2b1db55d47bb0e96bc45248f7d8e3576f91e6c7db1ba7bd60c36faa62286ae7b7120f8942c679c45219b38e8eacc365bca7dd43e7a5c72457b6c4ccffe1ed38fff28676ef29b9330535753b41464f583af98d87d9af5e453e26e5ae2b5b8900d6a2273ec96dd5d5ae35442d2a401aec95af380f6b94594495f7db684a7bd21cc7115756d01443923350e0f55d5a4572478e5bfd895af1671355dc71962d475d97e0fcbf9663bc4a5135ec00c0275fd629e2c671486523ac3cb274f3c021e434f230e9f37feb748aac515c58c6ada11cd7668939a75cfc4a641c82a88dd642fb39c1b901ae71fb85cc4a5990d19fbe23eb4ea7aeef7a07b5bd9a8628ee7eda77bbe150a9c622deca8c8505253cc14e2908bbbbf8e5cc2e812e8f7a93ef3f3b7c37f1d5fa37baeed342068aecd69557b859a833938de0192b80bb345648eb1af85481421f8a6cfe15954d7c45e82e8c192368f817e1de8a01803d6ded2d258b889c92424fe2cd68ba3328ac7b2042640ed0f9107499dad072a1170bdfc11e3999b7a177288e296a9e13a230d6d2ac704f62abd9af434cc7172468268a27b058cc6822b911b724343991820ddeb0507ba1efc64b6da9bbfb66bcc6dc1968334e59e991987ca0264f9c8da5964afb471dfcee45009ac14dd37520ec63f022ea4ecbb522c466e5b405cdca061c8e56af4864f93fc16271978deadc7bfb667b940186527218b1308f19b5f78e38826e8c0edfcb7bac067f8c412dea480afe0699e1bce28306386adad44c4dcead96aba3c6ac2b511c2050fc36c108842dc68adc692b46006c7437845b91104ce9492712dd05eddebb786e9e50965a87ad9388d375d014b162aa118ed010d6fac2133e46dacd279605ad141d548ce5f6df47f2af040c689127705a6dcefda95143ce3f33a8f1e2bb5d3a6023d7a8bb405337d07bad6e9982b7521e4e177303deba61b19a3c11675b6180e29a79f720c56c1ddc77771969918ecc306d7cf8f2d996ed438b22234436042472402e589dcebe4d4ebd56f54971f7cef6a8b3e1b08248d3f42d957cb5d73d7680167d985cd5a71d91b1e8bd5601262d2cc8102679d1e3765d15df5f020ddac2b2745b108b0d7291700dee47b7b13d6d567250f967755036b3aab4fc48fd80efed33154469ed1deeb843622138723655e3bc692b8b6c508dbd5a6b02cf7f7818224636792dc569f8b5098062fcb1343dc85466867ea7c3f0afc7e45520cbfd8fdf56a3a3679aed086a391b6af57216d573faf61d6405f3d65a897ab4a5a77d94507d8ec790300157dd57b46fe3916316960cecdef7d1af1aa631a1b74da59e4ec618405bcffc885059c3c74585b1b87f2762ee8618a229bd0da5cc35d3d3e920e1863c2babb0ca59bc19597b8200f579d17c5c51094be0e8c425f3cce12e814ca719411c869863d14e1750bba991e0f1d9766b2dc000b3c7451093e5f3293a3c9d36bcafd092d5a19224484ce9100d9659a9571a96dbedb8073a218101ed8f5d224d0b11ca2c898a2b05368adbf2f27181e8fc713173cc3655a599ba70f25ffaf2f29a803d2f58145b6e25327851b55391c39fb460487972b6c817e566c9bc35cbdfa6a89c4643ec632000828ba17530c62524376df313c12934b1745e14167666d4147764280ae0f6ab03c2d4f04f0f5d5ff2e39df860b936e87569da2287a7fcc00e9eca8c9860ece79ddced50c566c803192d5f6863d56d83d10e49dcd60d34555b23d7ef607bbb9a5531b390d9b2016ec136313cb56354fc69c2c97cbf5afd99bff85948e6e730cd37f6cf819fcb2230faca93dc6de50b15aa3dcde0f7d0864056c7ccc11c01b61058a483109171498c1064ca213a3305f1ff0a2861aaff3646bc6a8c8c71804874714881f2a8aefc2aa3e7c8fce2741f292cdac86484aa567e188ee8a908aa5acfaf0dbbc", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_1" - }, - { - "Input": "2685aea6edddbd98ca03c2df477608e71c613e56d9817eb504fd4646d5699f8c266d709c3621b8da9d775d325bd8b916e112f456067cc94c3cdaefd1363ae58d0f238e6e421f1e1a80659b3f3d53c82da29dcd92c8f3e7f5cd6d144264c962e60f0e5f7beee4ab3ca6c225dfcd70cb1dacea4fb1c11efcd92a9bfd000f20385d0c507168460ff0ae1f4a3f4d4d40c2bac5f44e18eb22f961d62817a542ff63111ec38e34e8c84f6b8aeb81ab4d04f44178977880ad50136de60a1d62f3b4fc9407245d2ec4baf533022981fbe51d195b64d3fbc15db7d356f6bd96e425672fa3183cba898f86a37b5f236e41e4938fb5badbfcb19a929fb0b0a945d557d9ba4f0bfae5037583fed3a2d1b726b9f5352a512d1c35ee7e8997aa57b0be6a07b3220aeb130f7f24d035942c0b51ae34ad675041dd89d49c0854aa29036687872f9f105a80888c3259e1ab38ac878b95449da892c2424c0b73a32a4bfd6c1fc2b035166da5e9e14dd821a2bda674e8fbc7edb1c8e1edf32a7fc1a57c5a0583f888460ae28b4c49f27952ca34d10e87fba821e197b891224167a5accfff0a2d6835ca0517e1a590ba9c9f6a14a0b105a34bb5d38df06fe6c87ad79b5902445dcec7d824ac886acc6b9e4405b69d9650e76e92eafd8cd4c670d0eaf4b87894b775221c105c4529534d44bfc6df876cd3f64b459730aaa58f02daabfd425016db382dd12c241b2ae39e4730028739a266d7428bb0f186b0177a5151d821aba508d907ac1ba083d662d28d081508cc46353bd659898905e68ba2d8291da61ab408ac83462f96a39797f8f6957f9994c9e83022ffcb23487eeb10fa010f62467449b1db9b29cf62c0d6b266473eb0bd57accde054bec7804cd87c63b4cea3d9ef688c2076300d74c7b5d90044fed0a3e144ca22f49fd0f519d7f9133f4afe84ed531b8e5c151fba2c92ef82b4974906eaed202eca91413bbef2c19408110d86ab097369a8128a72e0ee836a38fe369c34ab28832467ca7e7da305c7f1734db29dbf5ddd1d2eff09551ac5d3fe228c9cab77da07fbaecb7a4344847b7172858963a81c1cc92ba8f8505e4001622b17c3324a74f572f7905655a37c63dbf2b1e178378c9fb31468feaeb5aef9dd81159a28c201ec816b0bf2358d5eaaf2994f79d945e9f9f22f5b9427cf97e32fbbc4ce9f9bc8b203b5ce92a13388719701140ab94b927d261e807c4698e5ae5b179fd8bb17ee8ac91d6a071c09885c5fbf27529cec212fe8075e75c52a3598f787a261bb7281750b87fe125ea914a2ad8bd77ad60b5994101456c38d0b29c7c9d5251dee44c53ce5c1e06ec623041469154939fca1497a2b24aa5766645e993d87c143ac92f67bd241ee71f36fad6359b04ef25d1e106003161e7e243a350dddd4e5e71f3d260498acfe2da15ac92e024ec7f420dc323b111c0704235cea83ef84cbf533f0b559302ebaf637df3f4d8b68328fad9501355b00a96d3df4f329e4cfcb81daefa893d65caa287cdb330844d31fdc35aa824f8f01b9d722f2ca441ed789275d21ceca9f8b4ad5a2c64d1467519e364ef77bec63054ce19859936c36a5c396cedfae169291b3a2d8d005fed1e4b104f991914fc61b0215a5d38e3bad0ace8354013e8b6ebe73d96fdce88d550953235643111bde05ec8fd2737015151f523cb38a6baa918a4c98e6f955eb2805ede92b82292986061700c3e0189d210d3fb0b4a3bd09bfa0a00241b386394b4e10fe3d480f6c4922823fd2cf9d6134fa302cab2b1fab5957bf6fc7dc4268d5ec0fdab9bf854cf01b07d712153db5c2cef41f822eedb1ec8b86528fb59a12b9362f406c784c55c32b3d0294f737850b94d2ae395964456e19e826fb958730c06e01de0f7f4c3ba9243d95d6a537132236597b565b60453d6ea32c75afb2d875c305661b30ca22f615014ffd20951f8ad3096b7f66eadb520ff3dcab6c86f8fa58f8d486fb0e7c1c2386a1d6047b8807b70d436be59291dd8263a1f3ae9813355f2fbe58010f67d20f576105e2efb422ca422c015e9394e16e484b6ba6da85746f121888b43159d61b793d3497a73545b2e74d525a1a67a201a3a0b9926a2b94d33ed7aa5b0158ff20af4b861226ba9a2c474ab446c2c9eb22f77fe0d45b8b2a810689970885f88b", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_2" - }, - { - "Input": "1891e8689d81bec3dadf1f9604c15044cf827e14e75defde61944ff7bcd6030b1c9d52e52a1ec18146b4eb9dfee11579a281998ec99c3828854c69edffc5cc1a1c2be993abe1a808d8adcfbb9fb05aa82c12ac5aabe25f1e45638d8f522f06c005d8941ad434d5775f021bf825f48b90d106afdc75383fb209244d52f1320ea706ea0f67d737534e83b4c371e90088517aaa2f2a663d8e20ee66fa5d96d9335f28f837eee92c44da5329976752d99b1490668677a12f6957a24e87cf06f9bf14277937b372c4dee270475b2c3950a50dd506c82a326944fb1faf73392ec5a54c22ce783eccf8f06cce6ba0c21fb0b4dc405879b8c4e8e8971df765815f9878a41c8ef188c94fed5973836a452d4d365003c8e56af3fc6effda3362c29201741005f4f78eb380df7e435060e8ca35c6453d8e4bda391e23e47d8bad4d28921a5606d86dfc9574f67d7334c2e73ddae937a36c8c59a81c3f25a3ff7336c024cfe21b86dcf0c54a5ede73ad5c313d5cf5438a1e6745b3b61b18635d3d3d5f51df5d2bc6c558c5f3346e9a400595186a9c9ded299367cfb3a0674f23f1ad0350cd251f268d166c85bca4eb0b3cf3c53bce15abcdd22e22ce0e9758a23c6ca5dc7bf9183144119ebb7d667bf302b4039bbad10ed360d3e0ed47ea273c22083d7fc62f1f5ee2f7167b517eff34f496919da38c6c35093638ec958dc251e7ffa9c173a00809cf94fada7d2fa86013db39978eb153f48c11003b37b0b772700047f4f2531895fc8b4f8b0b884014f229aa5d3f71da7438ef65c446e0b427de019cb6f37b18b768d980b9e6f007a41802ca6903b9c02894bad35e0a40c0b857ca9d9d36fa301afd2c4a0e09c76b8c2cf6e39bfb2ed74f709f4f0108f13b111a04b2411e3515b772fcc87fd59b28bb73361c203c9fcaec94adb10c921a4af2f72e5c8be6ad1626d2029044cefbcee5973de8f419f525704d7558e86bdd34502c56da56cde6282c36358df918f4065f03d107144d581ec4d0d4ded89a81f0c276e5653ab7712b2a995c15310672ba6b4431362266dc719d5cfe3b23dd83a2a34b086c18e02b045ebfda6fbb64a22a1d7709ef5f2b065ee20265d4900d004eb1936ddc3fe60f130649fb7b2ec9103636131656a7a47d161e53af88ec99797c4e8e7051d1732607d5ae2eddd9ff4b12ee5823285651ecc4cf5e6241392f72234e5e6b240575900e21d3821d0ac2c6ed2f0e0b615bf1dc36e365bd69d182733f951be4ac6fcc44116425c28405a420df7e495650d5d0f74ea7dc27ee928d8c7d5907a13416384b15eaf7c8c478da036be27d1498ae0d5beb855aae2620577d9c541e36d2ba1ea62043c1911c37372e86bd8530a0ed3dc407c769f8f248a502e719428fb9706de6289e167378b6422d0155dbbd7bd3d1b677c64746ec51316ab8f37a836110ea3e2c62da428e3a53f8e90b0cd00523d05dcb5b1c1f00bc4c66f4e8ffe62842dc26273a383e45c3e23433bdaaee67b5f685a21cb5e85f331880fe736c4642f972ff17a4a947747c14f722f3136da4a6ef86769176b96a30ac6a3d11fe16860200fe29c194cb2630c988439903421dd883caf0e05e3f82e12fd09bc0415e0814c41d1ca9c349188b686207c5acf04a3ca7c62357ac5a36edffe672b5c7856f29fba11455c3a42f6b1615d934140f1125e8f3d0a813580c49e6f668e5b7078d6b3389145fa1296893fec25354e91427e890658f8e2c558b5f22499a5afc66f8106a8d1af7bd16c15088cbb53c0f95ee9222efdb4c3ade4c08ed74d0747077bc87b86a028e52618b80c87fd7819da4433ef2d6232011f94be93a335d44854e0051008f2bb43f5e84934e286032ffbe10716fac0266c7361df4464a26a832697780089c258e55ac985a00cdb2800aa4126b748825466e4bc0dc02f2b44da5217e6f628413d728dde6aab9d4d8ac72e8eebfa6d70cc8ba05532c707dc8ad0d151e7645dd1a35debd99c840c3c31f3b9c17b7d804c1463e41e9e8d5bc2434d3e863d4893a2fd7432b507d5d1a63d09c555d506799665c144b84d13301aa04d2c68a8069c628c6747241f57eb659356042cf5ecb6f917a6ea88bf2e01a70bfcb317c7a21cd20dec788c2a74ab921d7b14fc855204725acba5cec08a5ff8e3fbc44a95c1493", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_3" - }, - { - "Input": "20b961c884a0ad42964edc3b580f607681058a33aee25d60f7dae9f060217ec119d77c703d1a93059a1baf9c17319ca9f1c5fb4a04855d6aedc308d9070f9769103dd1a1691e5fd39ff70241d7569c17764a3824e49664f5145f956abdd559af262f0e5677944e1834c3b5459e0bfb126d41a8afd73bfa12ee3ef45f17e81ca62dc7a825213952eb841f8942a113a5cbda01359751726ef26ce05491815806cb2bbefb942c709bb4fd01181e99ae1716ee28d0453ef725cb8ea45f7a4f93c6b3203b2360ffca610432f4d1053e633004d7a822ebd940e9a546a7d0f2038728921f1aa6348e2cb062d5e193a49d60214f2f0752fd32b57319b877958ef0f7eb9c1b32607b1f0ce57571b1c609260f757911ed8bcc3896e6c95a13655d11b6a7f929b9eabda75ba7d16a31ae4b7af7d0eb1bb349169df32fa20f4cfc959e722e0f24d21c9b7e68ef0e4e941aaffc472a7fa0b9d03b7097df3c993d108fa69d0a8b189dc5d953fcae14f53a800fa624429d2bbb94ec56f371e65dce393dc602ea2a04b4e2312aacb2061b9d55e615845b085696a908d76944bc822ca909212ac6bd05bb2fd64a97c2dd2e76b9ed90febf4fc236d4c466ab7afa4050101828fa67a02b0d987e9d5d717c8be7757e34354fc9a57198e5d8e867a8ff08b3e3020c84cc015904ec31cea03557ca10f0b7f5ea8b5215c80c01f5cc47bcac78c0d2f1f312135154f38704a2b7db3dc7c86be733e8880e07aa0712c2050627bdf56acd40482f36f73badb30e320c12bb66096c8bd7b978410dd5449f250519c6a122ceda572357aea961fec54427a6a1e6cb2d509210e0a6c049d39eefcf09191b561f361a2d372ecd78676d8180b6120c432178bf969e889d2e386ceb20642a0ab00f1c28263dfd316e344e8f9c1380b0fc5b3ce5bf524cae2978f53e6dff5c6cdf0743ee0c68b4b256d924d9635a4cfe45948e1f5c137369b47439912b113818d26e766d0ccf83a1e2015a3ac6f355345d4ab03f710bda2bf76f42eb7ae70aff6f955184031af5d2333c1dfca388231e1d78a53749973f0a6a01f8ad0018704c7db134592cdc9744ad7b88e407d0eb04696b62fd57be16c249043f670d881e8fb7573f9d0cc54a632cf9de52ee862a07e0d9dc11a3f4df8c9fcde0bc80f9fda1b8a84efb0b67884d640c14cc63211267d15a405fe9d03f9713fc79cb787934a778928b1f244b2e84e926f2d5a7e6d9a154873abd1899a7b20df25ae018279ed525e939da2333d4121573982541bb5fdd5d6570676ca6a2979f92a21a563924eaf1b2cc3c16190560061e4eaf988b117bbef2a7380429021d7190eee78b725bc42613725d2a2e3d1167ad6d74508c5322df36e614e10eedb067f8cfcb9573e9281b0b827e282d3416ccc69d13090246f223e743d077d3d167af6558cd17b8110b422b70462dfe3d677fe5a72c5125c9e67534c06a4070f0bcbd8f6a5d93a7691d63a2811e1908a4f98042938fec22a2372ff55c50d679bdb4dcef9a1ecc1dba4fbb54f6ba153aff2b0ba9da968ff1b07f22e95f4404a924ce1d68c9d4cddb10aa9680cdc2064aacfd45913bcc620e4cf277913eaa093e4b3ce25f40d1ac255f863fcf59c2066e98d7ecc5219edfdec9bdb718416fc65e1b48f3a5e33f40a459600bdf13c8144d022ace69574477c864aaa2cf989a862940f80b2c85e5737926e3fd1e18411d06df3079e19f11b85b2634cb2788caa2fa53cfca5de8888091dbd8cb73b3651e0c60e28b318329e56ce5cc18581966834f960344fe9645682b800bc138e5670f8f23befa1ac5f9caba7fca7179167d2df6ea237dee29bccc80eacabd5a51dc06f245eb13c8ba185388b1de78b300308010a551df2b5311f3ae838318d20297179bbf83449adaf1360b0b10494e299a9cc71672ce5774394144435ed65a061b230c57e56d08af54493bae064a3d94aba34faeab22b8056c9d1fd0b499bdade429c428761820248450189abe14f51cf3274aae5e2d65644e9866e1e5342faff915cc65f72d8210c6aab304b14ce4036862bef5e03cc6269ec755cad0f1bf285f0a67d6a9e5be0d4fe6e50b707331076cd11d96ea9c1c98575d21ca59083964fc06691da6e6e12b833b3b126f159d4fe2619b89bd86423b6cb9bfcb34480fa78c", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_4" - }, - { - "Input": "1ee25d5450b2735be0093c130b7448d1e411e1e8b7913fcb232598dddfaaa687027cdf0955348f4e55caa9d82fd5bbb38b92f60579a83ac709966683f0d9793321506909285bb1b77ba279f0490a97f2161fe1ab39f7f049c1313a9c8811884e15a20e6fcaf1c0bb0715db97d4626fcc02f7ba2ca64b784b2d4f6f51ee71a03b24732d58be9c0dc31b21e1a719031094660c11a00221284d4163228d8c3cab2e1588d6aa85a6f8ae92b8f3cba309971208f66b4d0863ee99d1d5e8fc4c96cff02dcfc369cc91404a1b8309a63ce750324264c2a70c62ff062762ffd9cac5b91a03571ba65a25d22dc4b4313271c8dd74a99fecf08d6dc8e6b51333a428984b1d1129479779b4c500a4200354648d7fbfa67c9a0cb13a3d0e6137e31ba7ff47d207e78fa56ce0c8f6f4e5f31f678a1868f2c7054f796cadb4bd888681492ebc750bec8d2972a70ed03036210e367258f5cf446378f1a21029a48b152fda72fdb6141196031b0f6bff06f6500d7813f8e2dc009f3abf8c9f9160a9cf29fe29b7c11a3d61bc9163aa0403faa3151c0830b043408955dea0cd7e9af20095f4f5763d2acc09a5367d70eb2f0ae60297138f91ab9df8f73a32690ba35abfd521c0e7ce010d36307a14a7b50309a5a73da3fc8e5b6260531b90ade6a08c01cb6ab7c933102527adf2e3b149232e6870a91fe9a0824cad125ea9f88a531a4c39e6e3860b1c2f1e41fbe9e39f018bdd240daa5e7d050b1d72a31fcbd3c57af3fe7623ff3d194460469ef83ed14d5a5dcd75533364b4c3925bb576850e8abcba7e06441f4e2839f9e57171e29052d593183c38c820ec1f54569a5739f8f028321b725b8d6c001822e194f48d5f008f5ac96d24eb40d7bae35c1f7a87bce889392201b7753924aa964b9b82cc1ed724314f55fd3bfe84a79984448e0a309dbec6f202e707000167456b1aeff780eaf36fe6e74450efcb52c0bb8dd225ce291ea32afd792d4726de9cab205db543a5a385432ca762ea52e445402e3f8532377d89b1d99e17c2272e0742d0904dc8076735cac193377a3534a15229e89605c870331e8c4a325c1ae9f4f66b3f9f6744978a7e689fcfc60691e30e53aa60076b17d09c84624a4b19392f9dfda38b2a543220172bd50eb5ec710884855168a7072e2859252a58c82706373a30c0bf2aa918c2870d43c410f52d116fcc691df9b4c4d9f15a10494e10aa74c6d7e9351528814c724757c648365a3585981200e312fd1d5609b9a49702c6cfa5525ec1bb6df19cd838bdc322938b233c080c3e4885d608028ba06b6d2865e834807335d255e605fd759b0bb6834f946a31ec742859a3d72a6da48d9803095c0ab65997de12a21edb99c4892a6c316dfea1a30c4bb8cc601ecc32f1cd2073ac7bbf3e87be5b54b946001b7ac91092cef11b3b2b0e5163c3a605876c2d0628b3e51cb8edae03423b9bddd8e83315bc96135b725525f42965d283cdd3a0184b6465341456b5ebf3885665459aed84e3cbe071324f5016a9ea977561031719dde6c423f21beeaabb44124d104c07e52ac303b44119fab1262b31b90d47ce14fc4af949f7d3e70387fb7a06f7605665c600fdf6e42017a446621fb351e91b130a080b0636f94376096d780ae1123ddb2a7c474da4028e1585206dd9e2c20a075d52d462d5a10121f7dc323a7bc0c5183f79f337b863fbe0680b158ecf81402958c671823cfdd8f2a372fb01ab9a62d2e9926a7eaca029d96672a0cdaa60591e352d8b7b64557a1f8752efd985adfadc50cb8d84a7757521961bbf43aad9b9216148f860853968329a3712dbe936eb643ee767c8c57c1c39819832e7ee4aa920c013bce746641635ea715962af491bec1d478f1164b1daff3800998ebb24c011b9731675637ecfd7282ad4e7703dffccd386472f84af4bfd1613fa124894ae006f44be7e61d498ff3d57006afe82d3255fff68c4dbc0e3ae72b961061069d3140d573447252faa1bbf6628974a8f127cc2540c6fe651c1a4537b85843bce340f8d932a56ff47605daa21e2bea8bc07ebfe9152548fba7bde2664df992583a221a9678e3e3213636f1ea195108c161f3fa7c46d09b4b64918714c33ddf8087a2fd9da39ae9f5ab723fd232f646615af7682dc44bc2a7ef3e1665fd6db5246b6", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_5" - }, - { - "Input": "09d599a8c97251e5d1447076792891b8de719e3fc5b7b245e35c6a8af97dbe1b1cefb6a792c978414992b8c88ead994e8fc972bd8018a40e306eb0e5578b25ca21312203a90480fc7174fba1bb4b9802c930c38aff91399e78e2c76768daff422bbd652137299ba4ebda8016f7501bbfeb6de219561d3f924693efa9acfca2b81618159fd6039f1ee36963eedec8154312d592e6e1dba89d1747c4251bdb725a0c6d546f20a8b44f4517290a078310fd1af065e8ef20ed4ff94c0fd7b7c662be143e5a3414336749caf364eefdc5e30ee73d34d9462a44e90e085851eb93c9b6206426d020f657f36fec865bfa09bc619746c238c4cfa643529eea42aff19dc52abc81b078bdca796d77c4ac57e6a248fdf370d3cd12163c474aaa46eac2cec103b3cc21c58b94796153850268f274376dd6f1a36103e6f870a4eafa452923802c6ca8c36c4a0225e4d80bb8e62aaad963cc39bf9db92e1a0f45a353c82039dd1821a59d0fd59b5d0a0362128b95414fd2479542e1afab6e8fb23e06e9a547210cab4c461a3179e2f0a15c1a20e0569590bc30c8c7344a73db5fe76341efbd2c1d24f43820586b1449eaed8c7063d4e481a1a52d0c5a318f9b69e97c35a6393b016dcb50ee485d31c090cfffa92e709dd5bdf6b94dea9a7310f0c824ba78151003ae718fdd5682ae467b0f776cfdd02db3be8d2aa9d42c88638bffdf154920121c3580c8ff773cdab1bd6a9449d8f4d0dcfd5d3e1bd55acdaed1afb96e40c0dd233eee0523e0a36b7cbba083eb2919ab0a66836dabc699f6f5864d284090cba90d02024b706a23f6d6f84681ab223b9975aa15bfc6c37c1e1d43bcf8de71b10f2321d3e00d52c53f18415f2e87cd00940a6a3234e7400e170297db9b214a596d2a6ca0984a6e1aa1433eb239c30efb32093022dc1ec379567ebe899606324afd22052844ad5cb4241203b35d930334fdcb22754475653cf6138f51677c5759d0034a7400dc24da45b5d4c63576a83f299cc60b43b186de9d8d5120d36596299502031424a44c5970eeb1090ce35d7379a0654db261594a27b7ccec8bab8db83b26534bc2216a34a20a506366d22111acbf059df2198654cd69f1e4db9cf7d4801d135d29f2973a802ab859a35550a844ecde62bdb95e86bb6e974453b5bf2d031a4f3c2aa1d0be4af8f9013414719e7b75536b3e0dbd8250fa3feacd17416de420df18f7491d891ce8c01acf25ed54d37433830a1bb5f169716b07aeb67e4e6a05ce2b0d962f82ebcc36bca7c238f9e0d83f4b731b4447b2fb6f24636aee57260f1a72ebde3694aed548f7d8e20b3f9e119260b66d095e9992ca8645292eb45b01cb4b475f8cdb3126bd428b18745e504371be364d94d482648251a0ae1bb9ae2e976e6fd23476a9181e42a874a734f7efd1dc25037765e35a92885559ef4da81af8fe9ef0615a50760d000b68bff0f102771b9cf46bed9d5ce8565a558e41700bd46d271edbcac6a253a859cb7a172a3176fe6f9eebaf752417603efde4bda114f8788c8608a32c27fb3087189d92464788c4b62525f616c8725f6abf9d4dce07b8399a0e69860301eefd202480a12e054a920ea3dca3844f6309232c61fcfb17c43e311e336f593615004ed5a4b8be2ebde42af53d5fa32a7790ca80fc234a3034f9151c43f2eea7585049b4aad29392d9e9285b011b73cf2c6af955bb236b15857fb2789ec0149c253b23f8232627bd48f36ce4e8bea688d8b64d7469b2072912fb4719cb6894a14986fc875c84c220649f3c48e3a662f4c4f8b0c259529e2b6d3696c45cd1b11f02bd752022b0e7a2599bbca90cb8290789d71bd990d18418bba1e7fca94de8833d95851c88876c42fe817d3025a5076307c85b59add5f81771cbccfaaff14f7fb8807bf88902cdc39ca0a398f8bec67971cf8b771d941204515478d4c8dd014aa27e099cad61aa267ee25fb61d23e5d33ed0e2ad08bfd60c2af2b362d35851adaf161bf289d100b65ccf2050aab6c951e44a010140914e18ceed56ed6655d046f37dd75198590f95200ada816be88cff9fb1ed2aba308c1e556fa4987309f9d3c380432429cc72e8e146a24c339c989d2266c0f1503737075913b800fedc3b85ed5060567231334467aa6104824b79ca8f99ff263fff52", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_6" - }, - { - "Input": "19ca1f96e3289c5656d4c10352144f657c2a89428b7d4330f1e888e3b5b4c15f0de956aa5db71cb39c88cc5ff11e8df5787040891ffab3e2322331fe4e6201b02ffe5b0350192676ee46b31b41c8eaab8ff9122487b9a86b2147b709e37824d02d129f764acabf37e490ce7db53ce2b4209312ca1ad424ebe4eb2ffdaf952a1c1d2063094e546d7e3cbdd07683995f7cbeea09048a904620710923326bf480bd2ee7a2404a0ab6a5b20587081e2f0f630fcc68a139dc635f8207585b699423471ebb4494c2132e960ecee3fefe726c9e8eb207ec6fb922848c20f07f3b6d7ba82ed48a102edf74b6c2a0c3c00047d6678cbbb864407f6760c775ab1266a81c9f2af3cb009291b217d880b7ecf3b88892fde66c985b2b35301d57d9d318401d601e6a4284a43791de04f5c26f29e2e25cb24947adca7e56e1a1ba03cbcba210873004b001fee1e9c6bcd17fdc287f3fd7d4fb0e7f9bc7cd8913037bbb6cd274c21e18b879ae003f24a516097ab114e576c31fc502205e73c1683e0cbaf5fccfe4227f0999fa8cd65d01d281d748ead19540ad1357f3d274b9436d0613bb6482ca2e483b36141dd465a809d324e89a886b3f2a5ba534b0ed5cdead910976659e400f9f0c6e1f4818f8f3ece446e040cda8d27f2f4cfa38e5afb0ca691ab8d113912bd785bb3e736b6a7afacad81a158a57da7a97b1ee82552a94dc17ea082248871902e71297e8e6e985600d8f1deecdc5451f3479e26eea5b396c5352135dc756290ef2305fd43f9275f9b6178180c0ebf3491805239d48e69098c098bde9b6b020f6e519b7863257805e6ffd912294a88711da15864cb78e502c5b7b1c634549155ac0155509b12aaba95cdd1fceb1b5495d5939ea66d3eb606d69f55f22129717993d14d3e9ff2d2f28a318be897d946db05f16e0a705846da2456158d7b98516435dab869cae65a3c9ac4014e52bff7cf183dc4d82706c2ca79104e79aa37b04c3eac831729d837db141e3c7240a766af3fefd712513d9b7704e296ba3c66d2f5546d9a6e362e67593a4ff76ced1767499f61a0aaa35c9adc86e38c046fb0c1d550a18938b0b632ea33b06861bf18aa759f7d19948f4c24789908e40109c6d0ee52be9aa3f2c00131231041c97b788f3d548f8b28bad245a8d744a57bf5c9b137ca7b30ae3f2c8ae8fd3e84e2b8a4ccfe1904994adea9749f55ba7a9bdfef206d28044f2efdcce3ebfc443ae1d8052147eb6d42d0343c206e39292aea132250de83503b212199cf0bf67e3c2a54a54a30afe637ad5f6d74c7e0e0f4f881c1d1e05f6e8cec4135b5c008a1bb843dc3e857d52fcee2a520298bab9282ac416d30ee84e99ee78dfc286b28e60b703136a332de95908117b63c477f309b2ae97022ed6f1a54b994516164004cf5145fc37e8c4871a7055dd1668f797e6609b6d881f6794947b847bc4798f90f274abe605139ed0a8c08afdbe5fb842d7e0ad4e772cf7cb838b23413b68a82a4fd4cfd1f150cd6182df388bb9bfea8cb902ad77e108d7e448a55857369705cbe23efa58bcb60731c977443b7f3b7d78a144579b710ad1010ca4cb30c2d8e9f44f401461baf57093514172eec86e1f018971e28c8d2dd5b5b43873bc63509d967e2b30bd4bb162db4745faf47a64593bcb04c4dc342e7031b0e887aab9abfbe75f761421d85d00fa7a862eb129a79bc9a3dff1345b17b5e7516f4aabf9a49dcf75d6a53ad9420a22f793dd68d9c3aa7c942b6131fb01222d75b7a5d00f267c9bf23d1da0891520489adc3ba71e158d06e2b936a42915a91b7f99341ecbcd5f65b99e100a5d3f01031383ec05efa2ca4e8f8770283922c588ddd38c3efd160bdf296ae4aa7ba35c958fd9e2d77ab1774ec91a252906147e4d85e1493457ff7eaebb505f8522b556c4b6f487680fe918699737fc2dac2c517bf5f945c38479ceedab8ad69dfad8818d7f6986cdc40c40c7f254d837aa190518980d7b47c3078000f8fef69839a3946f26bcddce283c172a481ed4add416f39f0f0fe9c767d85d2c362ab71b74782c1cdb836a060da40adbdd3a401ee80727125b95da0ba13ce26d2dcf5e685924fca207e9600a9cdeb4a6e569638258300e435d19bca9105c292e6b1d3f4faa9c9640c014bbf0e537156e1140954609", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_7" - }, - { - "Input": "1fa11f66353f7a956254f3b98892d9c0f81a654f6609e0f0af13c2f8766c6f16194657ac1800e822825a05aa50d889e603dbbf4fc8e954f3b6f25fb23d5a5479142bf7baf53de4fc8668bbd4c019c0f6b7af0fec0c17ab0b107c83d25e4d18a52ef429052a9b35b41d51163583d57d79c420be96a1554051174b9ea1698878f11b36ee817c1b97813172a6418fb2937898fe7847dde90b6ff50b6b2a34cded942f593eeabb3b9d60300b894b05f78594a82af66d9117ea00224b4a21d7cf9ff51f70c6b295fa70454024594501c593b3aa26e4a93e66a0f38c3fa1d28c1612e91d631437bb2c0b4c9848a8fd19a1f8e3ac50ae338c9b516cc4049310ba4df21f287c33f63043e7e6ab5a1d13f7e759924743b9e46ded795c2c5ab93a909a3f7315530c731d9ba3398de10f401474f70944267f7ae20d0721edb0c0d48aacdfb501132d8f620cf839dfb326b07e46879ef281630486e202f6a5b3ee25d7bfa5d80e850b940cb4236be15cff7fa6f0afe97d4074d08cc84e9fc2c3af23892d61b63026dba27ff40c376fbe12ba44f231cb58178d22dcdf94e555a0fde0266d30002dab14694741bbac573bd15720b01915261df1442a03b424fbeea31b9f525c090ba172060641818b4c8221b8e01aab9788bb736e262e18f179221f6db532bae8058c38b8572443b8e87233d95e71b98acb2c946f149becc8ce8f259a89bffe962917050d74536bb197c472473578db35d84baa6c6ae9f9b436f0be637300423f198a1c23d945422603b6867cc421baac70d469d72d81380292e07297df63b5c01d61214817267145a6b0aea09a9bf2159d7360c4a7eb0a8c28a7e455c8ea3b540b5fc38fa57a56e8987689e52dc7ca0342c83789b8cb5717473014e1802469d01ca6d73befee617ad1012a1aeec56bc4d85e5f9fa8c98a49640c3543752250e921ef6447d718c318e7375b8903222b36ca85554932dcde661bd0e757a2037f4a1ab9425315926458a4e98d280cc10ed597c6c1af13de72471b52bc15d998d3232d2d849b0f73599c8ef253dda011b06a0f5c7fca436be16db5a6c389fb9cebbe0cf834015436d91dee19a986853c38160ad423bf52b4131487b5dafabece4d352e5dd076ceae35ef158c4b8016d3e4358c5e00a6d6fba7b3e319af57cfb7eeab1b64d4fd598ff6ebc85bf4e00445567736905d23864b42926019dcb0d924e90113ab53b025ba35c881dcf5a659f07632d4afae70d36c2cc547fb18898eca81401dba824b34f4ca6aef0edafa43b22378182199c62f74664f8bd35ab7836b318526669195ff4f5ce7fbad03d22789113e2328e4c4e49e3d81c78384315490295817075dbe3988e067faf0e1b4a9341a202e2616676282e029960b4ca852f528ed0e3f852bd6074625bfd6f46948973ac6ddf8fd1fa87a304eae65a6b2a53d50ea05db05521cfe31ec72869bcdfeb019276208720a0d33ee2ca8ab00ec09099e9c235971953f2ad06d4df01028cbe0f6449758345cb1d4ae4bedb642f84ca9e69e21eb1b1d639939504d29f7649423a34e9ddd3fc1e1648d3a6f717af7efd47f841696819248f6d189b54becec21119346431546391cba18e4badd3660cfba53a91c3b2218293d03778fafeff37c2ea71c3bb6823a1eeef64065f4b45cff7169a02a9934fda95861ec8d0768bc5cad58f79d854bd32503a3c72fe40417cee1d4d81a9d1e78f93cf5cafd2362809d788176ab88c1007a69f234a60a50cd0c00857600e144962a0dd987d284313a55210246ec51f3975707719aaa3f8cf6ef757c47226a5907f5019a2d5a82cea4b790e0deb00f70646c7124b8202b5f29f26dc20a12f4430158da8c567ff51da95b9e26ec39bbaac5e32f6a3cede1f933a8b76aa805201d3367d76248671d8412345ecaf89c599e5a88b93d347ad99a6e249af4a322a73a9d41b0d5350111018c3d9987926037a027101683dc814ec07f07daa46d103731cfa07557be53f12153ae35de17d65274fcc4bd4e15ac961d837a8e68ad24b542fa29ffca7fa5d883d1413e6c8183aff268ab0b4c516d88088a0102e2fb2999edcab90a5efc1a3f78ef830660161c361cf699eab00341565881f1c374f50b5012db4af00642b53ec15a66a315cfcbeac29674c3e619870d04810bea6268", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_8" - }, - { - "Input": "2f5a89469bfe012ba76459c35dc24c1aaddec05eee130879f7258d71c97f03072a93777508a68599449e21e16cf2b640f0ac5256231548f2c9e50ae4ab5e2ab7164dab50c5945811423d8717b2f08c524dca34fe055110059a5bb8efefef74e41c89dcffa0b3df9389dbab8f04a89cc52d76485eb690c5a80978f41c33be93f42a7f7a7181c0431613af56e9c2d461a71c0dca94aa3e19736d8cbc3467d841db2815f183c8fb13e36b83a9a6dd99238975ee7578b4dcd316c82818ce012092902aea97784a5249ed59850e30f1d7eb74e9526ad94f5c32af18124ae5913cf456064aae479b94db0dda94455282d2a5bcffd99d5e7749d631125dee0f33c3c0c1288aae58ea8eb4202f12883fc0fcdd68822e03f63a12d6242b0087a8a1495f7c1be646ac485c0d2b972185613095e4d65cc62bcf5b3913de994b430027ea5baf0e30fec7ffcd23b4d7a6adca3c8c994e17f94c76042af6b48441963bd5b478ab11aba040f130739fce83eb9c79c4a86eb251f79152f92afe5d81602744259567095129ca02f619571508cd4f14e669bc759afdf2a98f105ee1d19cc5c8666a7b2059b1d1d6524ebee64551aff3c1c058bc84ba359a85153c6840f9fb99406e4400750e00181c4c86d88d338f58ddd60e5a5b80f83d1926b199951fd27012377c28f1e937b0867a30e1617c85e1dc0a867aa5807b719aa1496cd41acd4a3cb2991018dfefe4eb662fa1a8c892d1971077cb3b81e43c75f412bf4ff67fa9e815cd179228ad0e86867ebd465e80e0523cae366cccf230dd02b58b4dc334f76d8efc1c1657225ab3c04d3e48ef50feb4b1133655c54465ace6d5f4d9222997430e302028fe47b83ec99feb177ddd4def70f8d7c3d774e6198476216ee7d9409b159426b7fcfe50427a47af55719f445ce0ac65f6b444825fa7fb4aa602fa343ae8040e62f09e7e4fd1db2662c0087ca9782f37626d91df409123399dd5c2823268f725da972ca1fae6732cfbf12bd9e5869b5dd7ade24e58d1914de52a6e6c24df6e25c64ab46e4bc7f94167fbe9daa225946046a1261b42fa6d1de0d471ec68aa9f22401b525d3f7e9847bd13103aa28e4bf2e1f47a545f3f7cdcf1621fd9c50cc10f0a2bb7c52925b718b23d79422d7990c7273427262817896b3aaaca889ded820c917c1610cdfcc5821b58b4aea58c86d5793d520d9d8da0a26503fed44591a409f0a9eb7fe6a724ac3f3f7e156c549fa4b51fd0a05231f3fc26b3754ef8aa031a9235db06ff5857739b5ac772d671f809e865cd6d9549bb2f4372f194ee2db50e8e538da6c93dc08c2e85e029c1bfaf6132f18723c06bda51310ef1b746078a2a81296acde9cd3c2de9c5085d319a33d367fb2d19db1b610a376087d1d4596b22909b27282665c97809407bce99fea04e3ebb87e95e0df79e41d67857447f71018c7682174152456cd66cdd61175e8d139985b502ef4a4730334311d794a9a219b49ef5a08c7d3e6b4142a36591873fe04e3f6c218982bb9a7892d8edfb33d90c10f844fde21c32be49991aff39b1c5d5a0875f0ca696b016821fde000d76711b26c07ccd8f5fb96f3a5a5be4d92116c5a786f1f0f762029fb04ad749802df01b91fe1767d07ad8d6fc7b12dacc12c1e0dd32301b60f5579b2e13d751ea08d620421abc8a1bf2246e62468498a1550687dffd7e15c5e7a74fa55b81d5bdeeb6236265d34c29d7d7ff5cbdf071e6489a784e75ed652aba5814530dc2fe2a065c299c3011037f4aec635d14bd3c9a6113b7411d745cdbe920133008642310a3231c7acee4ae528f9cbd2aa8e73f7fdc37067fa7eac6ba22d4bb9b40b96fde7d371d47cd1b8dbc4d5d4a8bf2b60721b9c1b21cb53e268751ec7212804ad98355dc12f7c8d64a99628ac80dac6acbe0b16220fa9ddba015ba16f06c8c57ccfd506418ebdf0ce1738762d3505949ffea9427406d55605b54d05e1c8f1f63cc760f7818f76c8f1552dd6e7572c2e2e84e7ecc83febedf5a789977325ab2fea33a61140baaa1f9d64fb647b4ed54db970b32eb9aec6aba90e6e8ad68b2293e39ef6768074635c4e095ae39e6374b99a6abc4e89155d6e1c5a0a135703c5be082fd44d715060535996f9642fecc139d06a140f8f78b100099740dc0325156b43727224a", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "bnpair_8_9" - } -] \ No newline at end of file diff --git a/runtime-sdk/modules/evm/src/precompile/testdata/modexp_eip2565.json b/runtime-sdk/modules/evm/src/precompile/testdata/modexp_eip2565.json deleted file mode 100644 index c55441439eb..00000000000 --- a/runtime-sdk/modules/evm/src/precompile/testdata/modexp_eip2565.json +++ /dev/null @@ -1,121 +0,0 @@ -[ - { - "Input": "00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", - "Expected": "0000000000000000000000000000000000000000000000000000000000000001", - "Name": "eip_example1", - "Gas": 1360, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", - "Expected": "0000000000000000000000000000000000000000000000000000000000000000", - "Name": "eip_example2", - "Gas": 1360, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb502fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", - "Expected": "60008f1614cc01dcfb6bfb09c625cf90b47d4468db81b5f8b7a39d42f332eab9b2da8f2d95311648a8f243f4bb13cfb3d8f7f2a3c014122ebb3ed41b02783adc", - "Name": "nagydani-1-square", - "Gas": 200, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb503fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", - "Expected": "4834a46ba565db27903b1c720c9d593e84e4cbd6ad2e64b31885d944f68cd801f92225a8961c952ddf2797fa4701b330c85c4b363798100b921a1a22a46a7fec", - "Name": "nagydani-1-qube", - "Gas": 200, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040e09ad9675465c53a109fac66a445c91b292d2bb2c5268addb30cd82f80fcb0033ff97c80a5fc6f39193ae969c6ede6710a6b7ac27078a06d90ef1c72e5c85fb5010001fc9e1f6beb81516545975218075ec2af118cd8798df6e08a147c60fd6095ac2bb02c2908cf4dd7c81f11c289e4bce98f3553768f392a80ce22bf5c4f4a248c6b", - "Expected": "c36d804180c35d4426b57b50c5bfcca5c01856d104564cd513b461d3c8b8409128a5573e416d0ebe38f5f736766d9dc27143e4da981dfa4d67f7dc474cbee6d2", - "Name": "nagydani-1-pow0x10001", - "Gas": 341, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5102e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", - "Expected": "981dd99c3b113fae3e3eaa9435c0dc96779a23c12a53d1084b4f67b0b053a27560f627b873e3f16ad78f28c94f14b6392def26e4d8896c5e3c984e50fa0b3aa44f1da78b913187c6128baa9340b1e9c9a0fd02cb78885e72576da4a8f7e5a113e173a7a2889fde9d407bd9f06eb05bc8fc7b4229377a32941a02bf4edcc06d70", - "Name": "nagydani-2-square", - "Gas": 200, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf5103e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", - "Expected": "d89ceb68c32da4f6364978d62aaa40d7b09b59ec61eb3c0159c87ec3a91037f7dc6967594e530a69d049b64adfa39c8fa208ea970cfe4b7bcd359d345744405afe1cbf761647e32b3184c7fbe87cee8c6c7ff3b378faba6c68b83b6889cb40f1603ee68c56b4c03d48c595c826c041112dc941878f8c5be828154afd4a16311f", - "Name": "nagydani-2-qube", - "Gas": 200, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080cad7d991a00047dd54d3399b6b0b937c718abddef7917c75b6681f40cc15e2be0003657d8d4c34167b2f0bbbca0ccaa407c2a6a07d50f1517a8f22979ce12a81dcaf707cc0cebfc0ce2ee84ee7f77c38b9281b9822a8d3de62784c089c9b18dcb9a2a5eecbede90ea788a862a9ddd9d609c2c52972d63e289e28f6a590ffbf51010001e6d893b80aeed5e6e9ce9afa8a5d5675c93a32ac05554cb20e9951b2c140e3ef4e433068cf0fb73bc9f33af1853f64aa27a0028cbf570d7ac9048eae5dc7b28c87c31e5810f1e7fa2cda6adf9f1076dbc1ec1238560071e7efc4e9565c49be9e7656951985860a558a754594115830bcdb421f741408346dd5997bb01c287087", - "Expected": "ad85e8ef13fd1dd46eae44af8b91ad1ccae5b7a1c92944f92a19f21b0b658139e0cabe9c1f679507c2de354bf2c91ebd965d1e633978a830d517d2f6f8dd5fd58065d58559de7e2334a878f8ec6992d9b9e77430d4764e863d77c0f87beede8f2f7f2ab2e7222f85cc9d98b8467f4bb72e87ef2882423ebdb6daf02dddac6db2", - "Name": "nagydani-2-pow0x10001", - "Gas": 1365, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb02d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", - "Expected": "affc7507ea6d84751ec6b3f0d7b99dbcc263f33330e450d1b3ff0bc3d0874320bf4edd57debd587306988157958cb3cfd369cc0c9c198706f635c9e0f15d047df5cb44d03e2727f26b083c4ad8485080e1293f171c1ed52aef5993a5815c35108e848c951cf1e334490b4a539a139e57b68f44fee583306f5b85ffa57206b3ee5660458858534e5386b9584af3c7f67806e84c189d695e5eb96e1272d06ec2df5dc5fabc6e94b793718c60c36be0a4d031fc84cd658aa72294b2e16fc240aef70cb9e591248e38bd49c5a554d1afa01f38dab72733092f7555334bbef6c8c430119840492380aa95fa025dcf699f0a39669d812b0c6946b6091e6e235337b6f8", - "Name": "nagydani-3-square", - "Gas": 341, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb03d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", - "Expected": "1b280ecd6a6bf906b806d527c2a831e23b238f89da48449003a88ac3ac7150d6a5e9e6b3be4054c7da11dd1e470ec29a606f5115801b5bf53bc1900271d7c3ff3cd5ed790d1c219a9800437a689f2388ba1a11d68f6a8e5b74e9a3b1fac6ee85fc6afbac599f93c391f5dc82a759e3c6c0ab45ce3f5d25d9b0c1bf94cf701ea6466fc9a478dacc5754e593172b5111eeba88557048bceae401337cd4c1182ad9f700852bc8c99933a193f0b94cf1aedbefc48be3bc93ef5cb276d7c2d5462ac8bb0c8fe8923a1db2afe1c6b90d59c534994a6a633f0ead1d638fdc293486bb634ff2c8ec9e7297c04241a61c37e3ae95b11d53343d4ba2b4cc33d2cfa7eb705e", - "Name": "nagydani-3-qube", - "Gas": 341, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000100c9130579f243e12451760976261416413742bd7c91d39ae087f46794062b8c239f2a74abf3918605a0e046a7890e049475ba7fbb78f5de6490bd22a710cc04d30088179a919d86c2da62cf37f59d8f258d2310d94c24891be2d7eeafaa32a8cb4b0cfe5f475ed778f45907dc8916a73f03635f233f7a77a00a3ec9ca6761a5bbd558a2318ecd0caa1c5016691523e7e1fa267dd35e70c66e84380bdcf7c0582f540174e572c41f81e93da0b757dff0b0fe23eb03aa19af0bdec3afb474216febaacb8d0381e631802683182b0fe72c28392539850650b70509f54980241dc175191a35d967288b532a7a8223ce2440d010615f70df269501944d4ec16fe4a3cb010001d7a85909174757835187cb52e71934e6c07ef43b4c46fc30bbcd0bc72913068267c54a4aabebb493922492820babdeb7dc9b1558fcf7bd82c37c82d3147e455b623ab0efa752fe0b3a67ca6e4d126639e645a0bf417568adbb2a6a4eef62fa1fa29b2a5a43bebea1f82193a7dd98eb483d09bb595af1fa9c97c7f41f5649d976aee3e5e59e2329b43b13bea228d4a93f16ba139ccb511de521ffe747aa2eca664f7c9e33da59075cc335afcd2bf3ae09765f01ab5a7c3e3938ec168b74724b5074247d200d9970382f683d6059b94dbc336603d1dfee714e4b447ac2fa1d99ecb4961da2854e03795ed758220312d101e1e3d87d5313a6d052aebde75110363d", - "Expected": "37843d7c67920b5f177372fa56e2a09117df585f81df8b300fba245b1175f488c99476019857198ed459ed8d9799c377330e49f4180c4bf8e8f66240c64f65ede93d601f957b95b83efdee1e1bfde74169ff77002eaf078c71815a9220c80b2e3b3ff22c2f358111d816ebf83c2999026b6de50bfc711ff68705d2f40b753424aefc9f70f08d908b5a20276ad613b4ab4309a3ea72f0c17ea9df6b3367d44fb3acab11c333909e02e81ea2ed404a712d3ea96bba87461720e2d98723e7acd0520ac1a5212dbedcd8dc0c1abf61d4719e319ff4758a774790b8d463cdfe131d1b2dcfee52d002694e98e720cb6ae7ccea353bc503269ba35f0f63bf8d7b672a76", - "Name": "nagydani-3-pow0x10001", - "Gas": 5461, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8102df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", - "Expected": "8a5aea5f50dcc03dc7a7a272b5aeebc040554dbc1ffe36753c4fc75f7ed5f6c2cc0de3a922bf96c78bf0643a73025ad21f45a4a5cadd717612c511ab2bff1190fe5f1ae05ba9f8fe3624de1de2a817da6072ddcdb933b50216811dbe6a9ca79d3a3c6b3a476b079fd0d05f04fb154e2dd3e5cb83b148a006f2bcbf0042efb2ae7b916ea81b27aac25c3bf9a8b6d35440062ad8eae34a83f3ffa2cc7b40346b62174a4422584f72f95316f6b2bee9ff232ba9739301c97c99a9ded26c45d72676eb856ad6ecc81d36a6de36d7f9dafafee11baa43a4b0d5e4ecffa7b9b7dcefd58c397dd373e6db4acd2b2c02717712e6289bed7c813b670c4a0c6735aa7f3b0f1ce556eae9fcc94b501b2c8781ba50a8c6220e8246371c3c7359fe4ef9da786ca7d98256754ca4e496be0a9174bedbecb384bdf470779186d6a833f068d2838a88d90ef3ad48ff963b67c39cc5a3ee123baf7bf3125f64e77af7f30e105d72c4b9b5b237ed251e4c122c6d8c1405e736299c3afd6db16a28c6a9cfa68241e53de4cd388271fe534a6a9b0dbea6171d170db1b89858468885d08fecbd54c8e471c3e25d48e97ba450b96d0d87e00ac732aaa0d3ce4309c1064bd8a4c0808a97e0143e43a24cfa847635125cd41c13e0574487963e9d725c01375db99c31da67b4cf65eff555f0c0ac416c727ff8d438ad7c42030551d68c2e7adda0abb1ca7c10", - "Name": "nagydani-4-square", - "Gas": 1365, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b8103df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", - "Expected": "5a2664252aba2d6e19d9600da582cdd1f09d7a890ac48e6b8da15ae7c6ff1856fc67a841ac2314d283ffa3ca81a0ecf7c27d89ef91a5a893297928f5da0245c99645676b481b7e20a566ee6a4f2481942bee191deec5544600bb2441fd0fb19e2ee7d801ad8911c6b7750affec367a4b29a22942c0f5f4744a4e77a8b654da2a82571037099e9c6d930794efe5cdca73c7b6c0844e386bdca8ea01b3d7807146bb81365e2cdc6475f8c23e0ff84463126189dc9789f72bbce2e3d2d114d728a272f1345122de23df54c922ec7a16e5c2a8f84da8871482bd258c20a7c09bbcd64c7a96a51029bbfe848736a6ba7bf9d931a9b7de0bcaf3635034d4958b20ae9ab3a95a147b0421dd5f7ebff46c971010ebfc4adbbe0ad94d5498c853e7142c450d8c71de4b2f84edbf8acd2e16d00c8115b150b1c30e553dbb82635e781379fe2a56360420ff7e9f70cc64c00aba7e26ed13c7c19622865ae07248daced36416080f35f8cc157a857ed70ea4f347f17d1bee80fa038abd6e39b1ba06b97264388b21364f7c56e192d4b62d9b161405f32ab1e2594e86243e56fcf2cb30d21adef15b9940f91af681da24328c883d892670c6aa47940867a81830a82b82716895db810df1b834640abefb7db2092dd92912cb9a735175bc447be40a503cf22dfe565b4ed7a3293ca0dfd63a507430b323ee248ec82e843b673c97ad730728cebc", - "Name": "nagydani-4-qube", - "Gas": 1365, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000200db34d0e438249c0ed685c949cc28776a05094e1c48691dc3f2dca5fc3356d2a0663bd376e4712839917eb9a19c670407e2c377a2de385a3ff3b52104f7f1f4e0c7bf7717fb913896693dc5edbb65b760ef1b00e42e9d8f9af17352385e1cd742c9b006c0f669995cb0bb21d28c0aced2892267637b6470d8cee0ab27fc5d42658f6e88240c31d6774aa60a7ebd25cd48b56d0da11209f1928e61005c6eb709f3e8e0aaf8d9b10f7d7e296d772264dc76897ccdddadc91efa91c1903b7232a9e4c3b941917b99a3bc0c26497dedc897c25750af60237aa67934a26a2bc491db3dcc677491944bc1f51d3e5d76b8d846a62db03dedd61ff508f91a56d71028125035c3a44cbb041497c83bf3e4ae2a9613a401cc721c547a2afa3b16a2969933d3626ed6d8a7428648f74122fd3f2a02a20758f7f693892c8fd798b39abac01d18506c45e71432639e9f9505719ee822f62ccbf47f6850f096ff77b5afaf4be7d772025791717dbe5abf9b3f40cff7d7aab6f67e38f62faf510747276e20a42127e7500c444f9ed92baf65ade9e836845e39c4316d9dce5f8e2c8083e2c0acbb95296e05e51aab13b6b8f53f06c9c4276e12b0671133218cc3ea907da3bd9a367096d9202128d14846cc2e20d56fc8473ecb07cecbfb8086919f3971926e7045b853d85a69d026195c70f9f7a823536e2a8f4b3e12e94d9b53a934353451094b81010001df3143a0057457d75e8c708b6337a6f5a4fd1a06727acf9fb93e2993c62f3378b37d56c85e7b1e00f0145ebf8e4095bd723166293c60b6ac1252291ef65823c9e040ddad14969b3b340a4ef714db093a587c37766d68b8d6b5016e741587e7e6bf7e763b44f0247e64bae30f994d248bfd20541a333e5b225ef6a61199e301738b1e688f70ec1d7fb892c183c95dc543c3e12adf8a5e8b9ca9d04f9445cced3ab256f29e998e69efaa633a7b60e1db5a867924ccab0a171d9d6e1098dfa15acde9553de599eaa56490c8f411e4985111f3d40bddfc5e301edb01547b01a886550a61158f7e2033c59707789bf7c854181d0c2e2a42a93cf09209747d7082e147eb8544de25c3eb14f2e35559ea0c0f5877f2f3fc92132c0ae9da4e45b2f6c866a224ea6d1f28c05320e287750fbc647368d41116e528014cc1852e5531d53e4af938374daba6cee4baa821ed07117253bb3601ddd00d59a3d7fb2ef1f5a2fbba7c429f0cf9a5b3462410fd833a69118f8be9c559b1000cc608fd877fb43f8e65c2d1302622b944462579056874b387208d90623fcdaf93920ca7a9e4ba64ea208758222ad868501cc2c345e2d3a5ea2a17e5069248138c8a79c0251185d29ee73e5afab5354769142d2bf0cb6712727aa6bf84a6245fcdae66e4938d84d1b9dd09a884818622080ff5f98942fb20acd7e0c916c2d5ea7ce6f7e173315384518f", - "Expected": "bed8b970c4a34849fc6926b08e40e20b21c15ed68d18f228904878d4370b56322d0da5789da0318768a374758e6375bfe4641fca5285ec7171828922160f48f5ca7efbfee4d5148612c38ad683ae4e3c3a053d2b7c098cf2b34f2cb19146eadd53c86b2d7ccf3d83b2c370bfb840913ee3879b1057a6b4e07e110b6bcd5e958bc71a14798c91d518cc70abee264b0d25a4110962a764b364ac0b0dd1ee8abc8426d775ec0f22b7e47b32576afaf1b5a48f64573ed1c5c29f50ab412188d9685307323d990802b81dacc06c6e05a1e901830ba9fcc67688dc29c5e27bde0a6e845ca925f5454b6fb3747edfaa2a5820838fb759eadf57f7cb5cec57fc213ddd8a4298fa079c3c0f472b07fb15aa6a7f0a3780bd296ff6a62e58ef443870b02260bd4fd2bbc98255674b8e1f1f9f8d33c7170b0ebbea4523b695911abbf26e41885344823bd0587115fdd83b721a4e8457a31c9a84b3d3520a07e0e35df7f48e5a9d534d0ec7feef1ff74de6a11e7f93eab95175b6ce22c68d78a642ad642837897ec11349205d8593ac19300207572c38d29ca5dfa03bc14cdbc32153c80e5cc3e739403d34c75915e49beb43094cc6dcafb3665b305ddec9286934ae66ec6b777ca528728c851318eb0f207b39f1caaf96db6eeead6b55ed08f451939314577d42bcc9f97c0b52d0234f88fd07e4c1d7780fdebc025cfffcb572cb27a8c33963", - "Name": "nagydani-4-pow0x10001", - "Gas": 21845, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf02e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", - "Expected": "d61fe4e3f32ac260915b5b03b78a86d11bfc41d973fce5b0cc59035cf8289a8a2e3878ea15fa46565b0d806e2f85b53873ea20ed653869b688adf83f3ef444535bf91598ff7e80f334fb782539b92f39f55310cc4b35349ab7b278346eda9bc37c0d8acd3557fae38197f412f8d9e57ce6a76b7205c23564cab06e5615be7c6f05c3d05ec690cba91da5e89d55b152ff8dd2157dc5458190025cf94b1ad98f7cbe64e9482faba95e6b33844afc640892872b44a9932096508f4a782a4805323808f23e54b6ff9b841dbfa87db3505ae4f687972c18ea0f0d0af89d36c1c2a5b14560c153c3fee406f5cf15cfd1c0bb45d767426d465f2f14c158495069d0c5955a00150707862ecaae30624ebacdd8ac33e4e6aab3ff90b6ba445a84689386b9e945d01823a65874444316e83767290fcff630d2477f49d5d8ffdd200e08ee1274270f86ed14c687895f6caf5ce528bd970c20d2408a9ba66216324c6a011ac4999098362dbd98a038129a2d40c8da6ab88318aa3046cb660327cc44236d9e5d2163bd0959062195c51ed93d0088b6f92051fc99050ece2538749165976233697ab4b610385366e5ce0b02ad6b61c168ecfbedcdf74278a38de340fd7a5fead8e588e294795f9b011e2e60377a89e25c90e145397cdeabc60fd32444a6b7642a611a83c464d8b8976666351b4865c37b02e6dc21dbcdf5f930341707b618cc0f03c3122646b3385c9df9f2ec730eec9d49e7dfc9153b6e6289da8c4f0ebea9ccc1b751948e3bb7171c9e4d57423b0eeeb79095c030cb52677b3f7e0b45c30f645391f3f9c957afa549c4e0b2465b03c67993cd200b1af01035962edbc4c9e89b31c82ac121987d6529dafdeef67a132dc04b6dc68e77f22862040b75e2ceb9ff16da0fca534e6db7bd12fa7b7f51b6c08c1e23dfcdb7acbd2da0b51c87ffbced065a612e9b1c8bba9b7e2d8d7a2f04fcc4aaf355b60d764879a76b5e16762d5f2f55d585d0c8e82df6940960cddfb72c91dfa71f6b4e1c6ca25dfc39a878e998a663c04fe29d5e83b9586d047b4d7ff70a9f0d44f127e7d741685ca75f11629128d916a0ffef4be586a30c4b70389cc746e84ebf177c01ee8a4511cfbb9d1ecf7f7b33c7dd8177896e10bbc82f838dcd6db7ac67de62bf46b6a640fb580c5d1d2708f3862e3d2b645d0d18e49ef088053e3a220adc0e033c2afcfe61c90e32151152eb3caaf746c5e377d541cafc6cbb0cc0fa48b5caf1728f2e1957f5addfc234f1a9d89e40d49356c9172d0561a695fce6dab1d412321bbf407f63766ffd7b6b3d79bcfa07991c5a9709849c1008689e3b47c50d613980bec239fb64185249d055b30375ccb4354d71fe4d05648fbf6c80634dfc3575f2f24abb714c1e4c95e8896763bf4316e954c7ad19e5780ab7a040ca6fb9271f90a8b22ae738daf6cb", - "Name": "nagydani-5-square", - "Gas": 5461, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf03e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", - "Expected": "5f9c70ec884926a89461056ad20ac4c30155e817f807e4d3f5bb743d789c83386762435c3627773fa77da5144451f2a8aad8adba88e0b669f5377c5e9bad70e45c86fe952b613f015a9953b8a5de5eaee4566acf98d41e327d93a35bd5cef4607d025e58951167957df4ff9b1627649d3943805472e5e293d3efb687cfd1e503faafeb2840a3e3b3f85d016051a58e1c9498aab72e63b748d834b31eb05d85dcde65e27834e266b85c75cc4ec0135135e0601cb93eeeb6e0010c8ceb65c4c319623c5e573a2c8c9fbbf7df68a930beb412d3f4dfd146175484f45d7afaa0d2e60684af9b34730f7c8438465ad3e1d0c3237336722f2aa51095bd5759f4b8ab4dda111b684aa3dac62a761722e7ae43495b7709933512c81c4e3c9133a51f7ce9f2b51fcec064f65779666960b4e45df3900f54311f5613e8012dd1b8efd359eda31a778264c72aa8bb419d862734d769076bce2810011989a45374e5c5d8729fec21427f0bf397eacbb4220f603cf463a4b0c94efd858ffd9768cd60d6ce68d755e0fbad007ce5c2223d70c7018345a102e4ab3c60a13a9e7794303156d4c2063e919f2153c13961fb324c80b240742f47773a7a8e25b3e3fb19b00ce839346c6eb3c732fbc6b888df0b1fe0a3d07b053a2e9402c267b2d62f794d8a2840526e3ade15ce2264496ccd7519571dfde47f7a4bb16292241c20b2be59f3f8fb4f6383f232d838c5a22d8c95b6834d9d2ca493f5a505ebe8899503b0e8f9b19e6e2dd81c1628b80016d02097e0134de51054c4e7674824d4d758760fc52377d2cad145e259aa2ffaf54139e1a66b1e0c1c191e32ac59474c6b526f5b3ba07d3e5ec286eddf531fcd5292869be58c9f22ef91026159f7cf9d05ef66b4299f4da48cc1635bf2243051d342d378a22c83390553e873713c0454ce5f3234397111ac3fe3207b86f0ed9fc025c81903e1748103692074f83824fda6341be4f95ff00b0a9a208c267e12fa01825054cc0513629bf3dbb56dc5b90d4316f87654a8be18227978ea0a8a522760cad620d0d14fd38920fb7321314062914275a5f99f677145a6979b156bd82ecd36f23f8e1273cc2759ecc0b2c69d94dad5211d1bed939dd87ed9e07b91d49713a6e16ade0a98aea789f04994e318e4ff2c8a188cd8d43aeb52c6daa3bc29b4af50ea82a247c5cd67b573b34cbadcc0a376d3bbd530d50367b42705d870f2e27a8197ef46070528bfe408360faa2ebb8bf76e9f388572842bcb119f4d84ee34ae31f5cc594f23705a49197b181fb78ed1ec99499c690f843a4d0cf2e226d118e9372271054fbabdcc5c92ae9fefaef0589cd0e722eaf30c1703ec4289c7fd81beaa8a455ccee5298e31e2080c10c366a6fcf56f7d13582ad0bcad037c612b710fc595b70fbefaaca23623b60c6c39b11beb8e5843b6b3dac60f", - "Name": "nagydani-5-qube", - "Gas": 5461, - "NoBenchmark": false - }, - { - "Input": "000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000400c5a1611f8be90071a43db23cc2fe01871cc4c0e8ab5743f6378e4fef77f7f6db0095c0727e20225beb665645403453e325ad5f9aeb9ba99bf3c148f63f9c07cf4fe8847ad5242d6b7d4499f93bd47056ddab8f7dee878fc2314f344dbee2a7c41a5d3db91eff372c730c2fdd3a141a4b61999e36d549b9870cf2f4e632c4d5df5f024f81c028000073a0ed8847cfb0593d36a47142f578f05ccbe28c0c06aeb1b1da027794c48db880278f79ba78ae64eedfea3c07d10e0562668d839749dc95f40467d15cf65b9cfc52c7c4bcef1cda3596dd52631aac942f146c7cebd46065131699ce8385b0db1874336747ee020a5698a3d1a1082665721e769567f579830f9d259cec1a836845109c21cf6b25da572512bf3c42fd4b96e43895589042ab60dd41f497db96aec102087fe784165bb45f942859268fd2ff6c012d9d00c02ba83eace047cc5f7b2c392c2955c58a49f0338d6fc58749c9db2155522ac17914ec216ad87f12e0ee95574613942fa615898c4d9e8a3be68cd6afa4e7a003dedbdf8edfee31162b174f965b20ae752ad89c967b3068b6f722c16b354456ba8e280f987c08e0a52d40a2e8f3a59b94d590aeef01879eb7a90b3ee7d772c839c85519cbeaddc0c193ec4874a463b53fcaea3271d80ebfb39b33489365fc039ae549a17a9ff898eea2f4cb27b8dbee4c17b998438575b2b8d107e4a0d66ba7fca85b41a58a8d51f191a35c856dfbe8aef2b00048a694bbccff832d23c8ca7a7ff0b6c0b3011d00b97c86c0628444d267c951d9e4fb8f83e154b8f74fb51aa16535e498235c5597dac9606ed0be3173a3836baa4e7d756ffe1e2879b415d3846bccd538c05b847785699aefde3e305decb600cd8fb0e7d8de5efc26971a6ad4e6d7a2d91474f1023a0ac4b78dc937da0ce607a45974d2cac1c33a2631ff7fe6144a3b2e5cf98b531a9627dea92c1dc82204d09db0439b6a11dd64b484e1263aa45fd9539b6020b55e3baece3986a8bffc1003406348f5c61265099ed43a766ee4f93f5f9c5abbc32a0fd3ac2b35b87f9ec26037d88275bd7dd0a54474995ee34ed3727f3f97c48db544b1980193a4b76a8a3ddab3591ce527f16d91882e67f0103b5cda53f7da54d489fc4ac08b6ab358a5a04aa9daa16219d50bd672a7cb804ed769d218807544e5993f1c27427104b349906a0b654df0bf69328afd3013fbe430155339c39f236df5557bf92f1ded7ff609a8502f49064ec3d1dbfb6c15d3a4c11a4f8acd12278cbf68acd5709463d12e3338a6eddb8c112f199645e23154a8e60879d2a654e3ed9296aa28f134168619691cd2c6b9e2eba4438381676173fc63c2588a3c5910dc149cf3760f0aa9fa9c3f5faa9162b0bf1aac9dd32b706a60ef53cbdb394b6b40222b5bc80eea82ba8958386672564cae3794f977871ab62337cf010001e30049201ec12937e7ce79d0f55d9c810e20acf52212aca1d3888949e0e4830aad88d804161230eb89d4d329cc83570fe257217d2119134048dd2ed167646975fc7d77136919a049ea74cf08ddd2b896890bb24a0ba18094a22baa351bf29ad96c66bbb1a598f2ca391749620e62d61c3561a7d3653ccc8892c7b99baaf76bf836e2991cb06d6bc0514568ff0d1ec8bb4b3d6984f5eaefb17d3ea2893722375d3ddb8e389a8eef7d7d198f8e687d6a513983df906099f9a2d23f4f9dec6f8ef2f11fc0a21fac45353b94e00486f5e17d386af42502d09db33cf0cf28310e049c07e88682aeeb00cb833c5174266e62407a57583f1f88b304b7c6e0c84bbe1c0fd423072d37a5bd0aacf764229e5c7cd02473460ba3645cd8e8ae144065bf02d0dd238593d8e230354f67e0b2f23012c23274f80e3ee31e35e2606a4a3f31d94ab755e6d163cff52cbb36b6d0cc67ffc512aeed1dce4d7a0d70ce82f2baba12e8d514dc92a056f994adfb17b5b9712bd5186f27a2fda1f7039c5df2c8587fdc62f5627580c13234b55be4df3056050e2d1ef3218f0dd66cb05265fe1acfb0989d8213f2c19d1735a7cf3fa65d88dad5af52dc2bba22b7abf46c3bc77b5091baab9e8f0ddc4d5e581037de91a9f8dcbc69309be29cc815cf19a20a7585b8b3073edf51fc9baeb3e509b97fa4ecfd621e0fd57bd61cac1b895c03248ff12bdbc57509250df3517e8a3fe1d776836b34ab352b973d932ef708b14f7418f9eceb1d87667e61e3e758649cb083f01b133d37ab2f5afa96d6c84bcacf4efc3851ad308c1e7d9113624fce29fab460ab9d2a48d92cdb281103a5250ad44cb2ff6e67ac670c02fdafb3e0f1353953d6d7d5646ca1568dea55275a050ec501b7c6250444f7219f1ba7521ba3b93d089727ca5f3bbe0d6c1300b423377004954c5628fdb65770b18ced5c9b23a4a5a6d6ef25fe01b4ce278de0bcc4ed86e28a0a68818ffa40970128cf2c38740e80037984428c1bd5113f40ff47512ee6f4e4d8f9b8e8e1b3040d2928d003bd1c1329dc885302fbce9fa81c23b4dc49c7c82d29b52957847898676c89aa5d32b5b0e1c0d5a2b79a19d67562f407f19425687971a957375879d90c5f57c857136c17106c9ab1b99d80e69c8c954ed386493368884b55c939b8d64d26f643e800c56f90c01079d7c534e3b2b7ae352cefd3016da55f6a85eb803b85e2304915fd2001f77c74e28746293c46e4f5f0fd49cf988aafd0026b8e7a3bab2da5cdce1ea26c2e29ec03f4807fac432662b2d6c060be1c7be0e5489de69d0a6e03a4b9117f9244b34a0f1ecba89884f781c6320412413a00c4980287409a2a78c2cd7e65cecebbe4ec1c28cac4dd95f6998e78fc6f1392384331c9436aa10e10e2bf8ad2c4eafbcf276aa7bae64b74428911b3269c749338b0fc5075ad", - "Expected": "5a0eb2bdf0ac1cae8e586689fa16cd4b07dfdedaec8a110ea1fdb059dd5253231b6132987598dfc6e11f86780428982d50cf68f67ae452622c3b336b537ef3298ca645e8f89ee39a26758206a5a3f6409afc709582f95274b57b71fae5c6b74619ae6f089a5393c5b79235d9caf699d23d88fb873f78379690ad8405e34c19f5257d596580c7a6a7206a3712825afe630c76b31cdb4a23e7f0632e10f14f4e282c81a66451a26f8df2a352b5b9f607a7198449d1b926e27036810368e691a74b91c61afa73d9d3b99453e7c8b50fd4f09c039a2f2feb5c419206694c31b92df1d9586140cb3417b38d0c503c7b508cc2ed12e813a1c795e9829eb39ee78eeaf360a169b491a1d4e419574e712402de9d48d54c1ae5e03739b7156615e8267e1fb0a897f067afd11fb33f6e24182d7aaaaa18fe5bc1982f20d6b871e5a398f0f6f718181d31ec225cfa9a0a70124ed9a70031bdf0c1c7829f708b6e17d50419ef361cf77d99c85f44607186c8d683106b8bd38a49b5d0fb503b397a83388c5678dcfcc737499d84512690701ed621a6f0172aecf037184ddf0f2453e4053024018e5ab2e30d6d5363b56e8b41509317c99042f517247474ab3abc848e00a07f69c254f46f2a05cf6ed84e5cc906a518fdcfdf2c61ce731f24c5264f1a25fc04934dc28aec112134dd523f70115074ca34e3807aa4cb925147f3a0ce152d323bd8c675ace446d0fd1ae30c4b57f0eb2c23884bc18f0964c0114796c5b6d080c3d89175665fbf63a6381a6a9da39ad070b645c8bb1779506da14439a9f5b5d481954764ea114fac688930bc68534d403cff4210673b6a6ff7ae416b7cd41404c3d3f282fcd193b86d0f54d0006c2a503b40d5c3930da980565b8f9630e9493a79d1c03e74e5f93ac8e4dc1a901ec5e3b3e57049124c7b72ea345aa359e782285d9e6a5c144a378111dd02c40855ff9c2be9b48425cb0b2fd62dc8678fd151121cf26a65e917d65d8e0dacfae108eb5508b601fb8ffa370be1f9a8b749a2d12eeab81f41079de87e2d777994fa4d28188c579ad327f9957fb7bdecec5c680844dd43cb57cf87aeb763c003e65011f73f8c63442df39a92b946a6bd968a1c1e4d5fa7d88476a68bd8e20e5b70a99259c7d3f85fb1b65cd2e93972e6264e74ebf289b8b6979b9b68a85cd5b360c1987f87235c3c845d62489e33acf85d53fa3561fe3a3aee18924588d9c6eba4edb7a4d106b31173e42929f6f0c48c80ce6a72d54eca7c0fe870068b7a7c89c63cdda593f5b32d3cb4ea8a32c39f00ab449155757172d66763ed9527019d6de6c9f2416aa6203f4d11c9ebee1e1d3845099e55504446448027212616167eb36035726daa7698b075286f5379cd3e93cb3e0cf4f9cb8d017facbb5550ed32d5ec5400ae57e47e2bf78d1eaeff9480cc765ceff39db500", - "Name": "nagydani-5-pow0x10001", - "Gas": 87381, - "NoBenchmark": false - } -] \ No newline at end of file diff --git a/runtime-sdk/modules/evm/src/precompile/testing.rs b/runtime-sdk/modules/evm/src/precompile/testing.rs index 2a6e100656f..01708d33d08 100644 --- a/runtime-sdk/modules/evm/src/precompile/testing.rs +++ b/runtime-sdk/modules/evm/src/precompile/testing.rs @@ -1,17 +1,23 @@ -use evm::{ - executor::stack::{PrecompileHandle, PrecompileSet}, - Context, ExitError, ExitReason, Transfer, -}; pub use primitive_types::{H160, H256}; use oasis_runtime_sdk::{ context, - module::{self}, - modules::{accounts, core, core::Error}, - subcall, - testing::keys, - types::token::{self, Denomination}, - Runtime, Version, + core::storage::mkvs, + module::{self, CallResult}, + modules::{ + accounts, + core::{self}, + }, + storage::MKVSStore, + testing::{ + keys, + mock::{CallOptions, Mock}, + }, + types::{ + token::{self, Denomination}, + transaction::Fee, + }, + CurrentState, Runtime, Version, }; use crate::{ @@ -19,14 +25,11 @@ use crate::{ types::{self}, }; -use super::{PrecompileResult, Precompiles}; use std::collections::BTreeMap; pub(crate) struct TestConfig; impl crate::Config for TestConfig { - type AdditionalPrecompileSet = (); - const CHAIN_ID: u64 = 0; const TOKEN_DENOMINATION: Denomination = Denomination::NATIVE; @@ -34,132 +37,6 @@ impl crate::Config for TestConfig { const CONFIDENTIAL: bool = true; } -struct MockBackend; -impl crate::backend::EVMBackendExt for MockBackend { - fn random_bytes(&self, num_bytes: u64, pers: &[u8]) -> Vec { - pers.iter() - .copied() - .chain((pers.len()..(num_bytes as usize)).map(|i| i as u8)) - .collect() - } - - fn subcall( - &self, - _info: subcall::SubcallInfo, - _validator: V, - ) -> Result { - unimplemented!() - } -} - -struct MockPrecompileHandle<'a> { - address: H160, - input: &'a [u8], - context: &'a Context, - gas_limit: u64, - gas_cost: u64, - gas_used: u64, -} - -impl PrecompileHandle for MockPrecompileHandle<'_> { - fn call( - &mut self, - _to: H160, - _transfer: Option, - _input: Vec, - _gas_limit: Option, - _is_static: bool, - _context: &Context, - ) -> (ExitReason, Vec) { - unimplemented!() - } - - fn record_cost(&mut self, cost: u64) -> Result<(), ExitError> { - if self.remaining_gas() < cost { - return Err(ExitError::OutOfGas); - } - self.gas_cost = self.gas_cost.saturating_add(cost); - self.gas_used = self.gas_used.saturating_add(cost); - - Ok(()) - } - - fn remaining_gas(&self) -> u64 { - self.gas_limit.saturating_sub(self.gas_cost) - } - - fn log(&mut self, _address: H160, _topics: Vec, _data: Vec) -> Result<(), ExitError> { - Ok(()) - } - - fn code_address(&self) -> H160 { - self.address - } - - fn input(&self) -> &[u8] { - self.input - } - - fn context(&self) -> &Context { - self.context - } - - fn is_static(&self) -> bool { - false - } - - fn gas_limit(&self) -> Option { - Some(self.gas_limit) - } - - fn record_external_cost( - &mut self, - _ref_time: Option, - _proof_size: Option, - _storage_growth: Option, - ) -> Result<(), ExitError> { - unimplemented!() - } - - fn refund_external_cost(&mut self, _ref_time: Option, _proof_size: Option) { - unimplemented!() - } - - fn used_gas(&self) -> u64 { - self.gas_used - } -} - -#[doc(hidden)] -pub fn call_contract(address: H160, input: &[u8], gas_limit: u64) -> Option { - call_contract_with_gas_report(address, input, gas_limit).map(|(result, _)| result) -} - -#[doc(hidden)] -pub fn call_contract_with_gas_report( - address: H160, - input: &[u8], - gas_limit: u64, -) -> Option<(PrecompileResult, u64)> { - let context: Context = Context { - address: Default::default(), - caller: Default::default(), - apparent_value: From::from(0), - }; - let precompiles: Precompiles<'_, TestConfig, MockBackend> = Precompiles::new(&MockBackend); - let mut handle = MockPrecompileHandle { - address, - input, - context: &context, - gas_limit, - gas_cost: 0, - gas_used: 0, - }; - precompiles - .execute(&mut handle) - .map(|result| (result, handle.gas_cost)) -} - /// Test case for precompiled contract tests. #[cfg(any(test, feature = "test"))] #[derive(serde::Deserialize)] @@ -262,3 +139,52 @@ pub fn init_and_deploy_contract( let result: Vec = cbor::from_value(result).unwrap(); H160::from_slice(&result) } + +#[doc(hidden)] +pub fn call_contract(address: H160, input: &[u8], gas_limit: u64) -> Result, String> { + let mut mock = Mock::default(); + let ctx = mock.create_ctx_for_runtime::(true); + let mut signer = EvmSigner::new(0, keys::dave::sigspec()); + + // Ensure we always start with a clean state. + let root = mkvs::OverlayTree::new( + mkvs::Tree::builder() + .with_root_type(mkvs::RootType::State) + .build(Box::new(mkvs::sync::NoopReadSyncer)), + ); + let root = MKVSStore::new(root); + + CurrentState::enter(root, || { + TestRuntime::migrate(&ctx); + + let dispatch_result = signer.call_opts( + &ctx, + "evm.Call", + types::Call { + address: address.into(), + value: 0.into(), + data: input.to_vec(), + }, + CallOptions { + fee: Fee { + gas: gas_limit, + ..Default::default() + }, + ..Default::default() + }, + ); + + match dispatch_result.result { + CallResult::Ok(result) => { + let result: Vec = cbor::from_value(result).unwrap(); + Ok(result) + } + CallResult::Failed { + module, + code, + message, + } => Err(format!("module: {module} code: {code} message: {message}")), + CallResult::Aborted(err) => Err(format!("aborted: {err}")), + } + }) +} diff --git a/runtime-sdk/modules/evm/src/test.rs b/runtime-sdk/modules/evm/src/test.rs index b8404d989ee..be1a30362a7 100644 --- a/runtime-sdk/modules/evm/src/test.rs +++ b/runtime-sdk/modules/evm/src/test.rs @@ -10,18 +10,20 @@ use oasis_runtime_sdk::{ core::transaction::tags::Tag, crypto::{self, signature::secp256k1}, error::Error as _, - module::{self, InvariantHandler as _, TransactionHandler as _}, + module::{self, CallResult, InvariantHandler as _, TransactionHandler as _}, modules::{ accounts::{self, Module as Accounts, ADDRESS_FEE_ACCUMULATOR, API as _}, - core::{self, Module as Core}, + core::{self, types::EstimateGasQuery, Module as Core}, }, state::{self, CurrentState, Mode, Options, TransactionResult}, - testing::{keys, mock, mock::CallOptions}, + testing::{ + keys, + mock::{self, CallOptions}, + }, types::{ address::{Address, SignatureAddressSpec}, token::{self, Denomination}, - transaction, - transaction::Fee, + transaction::{self, AuthInfo, Call, CallerAddress, Fee, Transaction}, }, Context, Runtime, Version, }; @@ -46,13 +48,17 @@ static FAUCET_CONTRACT_CODE_HEX: &str = pub(crate) struct EVMConfig; impl Config for EVMConfig { - type AdditionalPrecompileSet = precompile::erc20::Erc20Contract; - const CHAIN_ID: u64 = 0xa515; const TOKEN_DENOMINATION: Denomination = Denomination::NATIVE; - fn additional_precompiles() -> Option { + fn additional_precompiles() -> Option> + where + G: AsRef + + AsRef + + evm::GasMutState, + H: evm::interpreter::runtime::RuntimeBackend, + { Some(precompile::erc20::Erc20Contract::::default()) } } @@ -60,8 +66,6 @@ impl Config for EVMConfig { pub(crate) struct ConfidentialEVMConfig; impl Config for ConfidentialEVMConfig { - type AdditionalPrecompileSet = (); - const CHAIN_ID: u64 = 0x5afe; const TOKEN_DENOMINATION: Denomination = Denomination::NATIVE; @@ -397,7 +401,9 @@ fn test_c10l_enc_call_identity_decoded() { struct CoreConfig; -impl core::Config for CoreConfig {} +impl core::Config for CoreConfig { + const DEFAULT_LOCAL_ESTIMATE_GAS_SEARCH_MAX_ITERS: u64 = 25; +} /// EVM test runtime. struct EVMRuntime(C); @@ -1807,3 +1813,166 @@ fn test_erc20_allowances() { "allowance should be correct" ); } + +#[test] +fn test_suicide() { + let mut mock = mock::Mock::default(); + let ctx = mock.create_ctx_for_runtime::>(false); + let mut signer = EvmSigner::new(0, keys::dave::sigspec()); + + EVMRuntime::::migrate(&ctx); + + // Give Dave some tokens. + Accounts::mint( + keys::dave::address(), + &token::BaseUnits::native(1_000_000_000), + ) + .unwrap(); + + static SUICIDE_CONTRACT_CODE_HEX: &str = + include_str!("../../../../tests/e2e/evm/contracts/evm_suicide_test_compiled.hex"); + static CALL_SUICIDE_CONTRACT_CODE_HEX: &str = + include_str!("../../../../tests/e2e/evm/contracts/evm_call_suicide_test_compiled.hex"); + + // Create suicide contract. + let dispatch_result = signer.call( + &ctx, + "evm.Create", + types::Create { + value: 0.into(), + init_code: load_contract_bytecode(SUICIDE_CONTRACT_CODE_HEX), + }, + ); + let result = dispatch_result.result.unwrap(); + let result: Vec = cbor::from_value(result).unwrap(); + let suicide_contract_address = H160::from_slice(&result); + + // Create call suicide contract, appending the suicide contract address. + let mut init_code = load_contract_bytecode(CALL_SUICIDE_CONTRACT_CODE_HEX); + init_code.resize(init_code.len() + 12, 0); + init_code.extend_from_slice(suicide_contract_address.as_bytes()); + + let dispatch_result = signer.call( + &ctx, + "evm.Create", + types::Create { + value: 0.into(), + init_code, + }, + ); + let result = dispatch_result.result.unwrap(); + let result: Vec = cbor::from_value(result).unwrap(); + let call_suicide_contract_address = H160::from_slice(&result); + + // Test gas estimation during this suicide call. + let query_result = signer.query( + &ctx, + "core.EstimateGas", + EstimateGasQuery { + caller: Some(CallerAddress::EthAddress(signer.address().into())), + tx: Transaction { + version: 0, + call: Call { + method: "evm.Call".to_string(), + body: cbor::to_value(types::Call { + address: call_suicide_contract_address, + data: solabi::selector!("call_suicide()").0.to_vec(), + value: 0.into(), + }), + ..Default::default() + }, + auth_info: AuthInfo { + ..Default::default() + }, + }, + propagate_failures: false, + }, + ); + let result: u64 = query_result.unwrap(); + + // Call the call_suicide method. + let dispatch_result = signer.call_evm_opts( + &ctx, + call_suicide_contract_address, + solabi::selector!("call_suicide()"), + &(), + CallOptions { + fee: Fee { + amount: Default::default(), + gas: result, + consensus_messages: 0, + ..Default::default() + }, + ..Default::default() + }, + ); + match dispatch_result.result { + CallResult::Ok(_) => panic!("call should fail"), + CallResult::Failed { + module, + code, + message, + } => { + assert_eq!(module, "evm"); + assert_eq!(code, 2); + assert!(message.contains("SELFDESTRUCT not supported")); + } + CallResult::Aborted(e) => panic!("tx aborted with error: {e}"), + } + + // Test gas estimation during the direct suicide call. + let query_result = signer.query( + &ctx, + "core.EstimateGas", + EstimateGasQuery { + caller: Some(CallerAddress::EthAddress(signer.address().into())), + tx: Transaction { + version: 0, + call: Call { + method: "evm.Call".to_string(), + body: cbor::to_value(types::Call { + address: suicide_contract_address, + data: solabi::selector!("suicide()").0.to_vec(), + value: 0.into(), + }), + ..Default::default() + }, + auth_info: AuthInfo { + ..Default::default() + }, + }, + propagate_failures: false, + }, + ); + let result: u64 = query_result.unwrap(); + + // Call the suicide method directly. + let dispatch_result = signer.call_evm_opts( + &ctx, + suicide_contract_address, + solabi::selector!("suicide()"), + &(), + CallOptions { + fee: Fee { + amount: Default::default(), + gas: result, + consensus_messages: 0, + ..Default::default() + }, + ..Default::default() + }, + ); + match dispatch_result.result { + CallResult::Ok(_) => panic!("call should fail"), + CallResult::Failed { + module, + code, + message, + } => { + assert_eq!(module, "evm"); + assert_eq!(code, 2); + assert!(message.contains("SELFDESTRUCT not supported")); + } + CallResult::Aborted(e) => panic!("tx aborted with error: {e}"), + } +} diff --git a/runtime-sdk/src/modules/core/mod.rs b/runtime-sdk/src/modules/core/mod.rs index 36960d3004d..a8adc288072 100644 --- a/runtime-sdk/src/modules/core/mod.rs +++ b/runtime-sdk/src/modules/core/mod.rs @@ -745,11 +745,28 @@ impl Module { // Count iterations, and remember if fast path was tried. let (mut iters, mut fast_path_tried) = (0, false); - // The following two variables are used to control the special case where a transaction fails + // The following variables are used to control the special case where a transaction fails // and we check if the error is due to out-of-gas by re-simulating the transaction with maximum // gas limit. This is needed due to EVM transactions failing with a "reverted" error when // not having enough gas for EIP-150 (and not with "out-of-gas"). + // + // `max_gas_failure` records the (module, code, message) of the failure observed at the + // maximum gas limit. If the transaction fails with a *different* error at a lower gas + // limit, that means the lower limit was insufficient to reach the expected failure path — + // typically because EIP-150's 63/64 rule starved a nested call into running out of gas + // before the outer call could reach the real failure site. In that case the binary search + // must continue (lo = mid) rather than exiting early. When the failure at mid gas matches + // the max-gas failure, the gas is sufficient for the expected failure path and the binary + // search tries lower gas. + // + // The message is included in the comparison in addition to (module, code) because two + // distinct failure modes can share the same code. For example, an outer call that runs out + // of gas before reaching a nested call produces ExecutionFailed("out of gas") (code 2), + // while a nested call blocked by backend.apply() produces ExecutionFailed("SELFDESTRUCT + // not supported") (also code 2). Without the message the binary search cannot distinguish + // between these and would converge to the wrong (lower) gas boundary. let (mut has_succeeded, mut tried_with_max_gas) = (false, false); + let mut max_gas_failure: Option<(String, u32, String)> = None; while (lo + 1 < hi) && iters < bs_max_iters { iters += 1; @@ -794,34 +811,83 @@ impl Module { // Estimate failed due to insufficient gas limit. Try with higher gas. lo = mid } - r @ Err(_) => { - let mut res = r; + Err(Error::TxSimulationFailed(mid_failure)) => { + // Non-gas, non-out-of-gas failure at `mid` gas. Extract the full identity of + // this failure (module, code, message) so we can compare it with the max-gas + // failure without holding a borrow across the subsequent simulate() call. + let mid_module = mid_failure.module_name().to_string(); + let mid_code = mid_failure.code(); + let mid_message = mid_failure.to_string(); + + // Ensure we know what the expected failure looks like at max gas. if !tried_with_max_gas { tried_with_max_gas = true; - // Transaction failed and simulation with max gas was not yet tried. - // Try simulating with maximum gas once: - // - if fails, the transaction will always fail, stop the binary search. - // - if succeeds, remember that transaction is failing due to insufficient gas - // and continue the search. - res = simulate(&args.tx, cap, true) + match simulate(&args.tx, cap, true) { + Ok(_) => { + // Transaction can succeed with more gas. + has_succeeded = true; + lo = mid; + continue; + } + err if propagate_failures => return err, + Err(Error::TxSimulationFailed(cap_failure)) => { + max_gas_failure = Some(( + cap_failure.module_name().to_string(), + cap_failure.code(), + cap_failure.to_string(), + )); + } + _ => break, + } } - match res { - Ok(_) => { - has_succeeded = true; - // Transaction can succeed. Try with higher gas. - lo = mid + + if let Some((ref exp_module, exp_code, ref exp_message)) = max_gas_failure { + if mid_module == *exp_module + && mid_code == exp_code + && mid_message == *exp_message + { + // Same failure as at max gas: `mid` gas is sufficient to reach the + // expected failure path. Try lower gas to find the minimum. This is + // necessary because the raw EVM gas-used figure (from a simulation with + // a large gas limit) does not account for EIP-150's 63/64 forwarding + // overhead on nested CALLs — using it directly as the gas limit would + // starve inner calls and produce a different failure (e.g. Reverted + // instead of ExecutionFailed). Converging hi downward ensures the + // returned estimate is the true minimum gas at which the expected + // failure is reachable. + hi = mid; + } else { + // Different failure from max gas: `mid` gas is insufficient to reach + // the expected failure path. This is typically caused by EIP-150's + // 63/64 rule starving a nested call of gas (the outer call then sees + // a different revert instead of the real failure). Increase gas and + // continue the binary search. + lo = mid; } - err if propagate_failures => { - // Estimate failed (not with out-of-gas) and caller wants error propagation -> early exit and return the error. - return err; + } else { + // Max-gas simulation did not produce a TxSimulationFailed result + // (e.g. it returned a fatal/other error). Nothing to compare against; + // exit the loop and fall back to the max-gas estimate. + break; + } + } + r @ Err(_) => { + // Non-TxSimulationFailed error (e.g. fatal runtime error). + if !tried_with_max_gas { + tried_with_max_gas = true; + match simulate(&args.tx, cap, true) { + Ok(_) => { + has_succeeded = true; + lo = mid; + } + err if propagate_failures => return err, + _ => break, } - _ => { - // Estimate failed (not with out-of-gas) but caller wants to know the gas usage. - // Exit loop and do one final estimate without error propagation. - // NOTE: don't continue the binary search for failing transactions as the convergence - // for these could take somewhat long and the estimate with default max gas is likely good. - break; + } else { + if propagate_failures { + return r; } + break; } } } diff --git a/tests/contracts/bench/Cargo.lock b/tests/contracts/bench/Cargo.lock index 416d9e7abde..f046907ef29 100644 --- a/tests/contracts/bench/Cargo.lock +++ b/tests/contracts/bench/Cargo.lock @@ -189,9 +189,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.183" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "memory_units" diff --git a/tests/contracts/hello/Cargo.lock b/tests/contracts/hello/Cargo.lock index 5b14e9b07c9..558af4f5a36 100644 --- a/tests/contracts/hello/Cargo.lock +++ b/tests/contracts/hello/Cargo.lock @@ -78,9 +78,9 @@ dependencies = [ [[package]] name = "arc-swap" -version = "1.8.2" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9f3647c145568cec02c42054e07bdf9a5a698e15b466fb2341bfc393cd24aa5" +checksum = "6a3a1fd6f75306b68087b831f025c712524bcb19aad54e557b1129cfa0a2b207" dependencies = [ "rustversion", ] @@ -283,9 +283,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" dependencies = [ "find-msvc-tools", "shlex", @@ -373,9 +373,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.57" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" dependencies = [ "cc", ] @@ -1046,9 +1046,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] name = "hello" @@ -1096,9 +1096,9 @@ dependencies = [ [[package]] name = "honggfuzz" -version = "0.5.59" +version = "0.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9724607fd5cc535fceca960d7f684a1735c4e96c26b4e43986fe8ce798c2550e" +checksum = "4d6510a410acedd7a7683b3a45dafdc5ccf3c72d6addaa373497005964fc4e23" dependencies = [ "arbitrary", "lazy_static", @@ -1133,12 +1133,13 @@ dependencies = [ [[package]] name = "icu_collections" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ "displaydoc", "potential_utf", + "utf8_iter", "yoke", "zerofrom", "zerovec", @@ -1146,9 +1147,9 @@ dependencies = [ [[package]] name = "icu_locale_core" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ "displaydoc", "litemap", @@ -1159,9 +1160,9 @@ dependencies = [ [[package]] name = "icu_normalizer" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ "icu_collections", "icu_normalizer_data", @@ -1173,15 +1174,15 @@ dependencies = [ [[package]] name = "icu_normalizer_data" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] name = "icu_properties" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ "icu_collections", "icu_locale_core", @@ -1193,15 +1194,15 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.1.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] name = "icu_provider" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ "displaydoc", "icu_locale_core", @@ -1252,12 +1253,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.0" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.0", ] [[package]] @@ -1289,15 +1290,15 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.91" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ "once_cell", "wasm-bindgen", @@ -1343,9 +1344,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.183" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] name = "libloading" @@ -1371,9 +1372,9 @@ checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" [[package]] name = "litemap" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] name = "lock_api" @@ -1497,9 +1498,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "mio" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ "libc", "wasi", @@ -1555,9 +1556,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf97ec579c3c42f953ef76dbf8d55ac91fb219dde70e49aa4a6b7d74e9919050" +checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] name = "num-derive" @@ -1853,9 +1854,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.21.3" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opaque-debug" @@ -2036,9 +2037,9 @@ dependencies = [ [[package]] name = "potential_utf" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ "zerovec", ] @@ -2093,7 +2094,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.4+spec-1.1.0", + "toml_edit 0.25.11+spec-1.1.0", ] [[package]] @@ -2370,9 +2371,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "serde" @@ -2908,9 +2909,9 @@ dependencies = [ [[package]] name = "tinystr" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ "displaydoc", "zerovec", @@ -2918,9 +2919,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.50.0" +version = "1.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" +checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" dependencies = [ "bytes", "libc", @@ -2935,9 +2936,9 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.1" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", @@ -2978,9 +2979,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] @@ -3012,23 +3013,23 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.4+spec-1.1.0" +version = "0.25.11+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7193cbd0ce53dc966037f54351dbbcf0d5a642c7f0038c382ef9e677ce8c13f2" +checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" dependencies = [ "indexmap", - "toml_datetime 1.0.0+spec-1.1.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.0.9+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 0.7.15", + "winnow 1.0.1", ] [[package]] @@ -3095,9 +3096,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68d3c8f01c0cfa54a75291d83601161799e4a89a39e0929f4b0354d88757a37" +checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" [[package]] name = "version_check" @@ -3123,9 +3124,9 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ "cfg-if 1.0.4", "once_cell", @@ -3136,9 +3137,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3146,9 +3147,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ "bumpalo", "proc-macro2", @@ -3159,9 +3160,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.114" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] @@ -3380,11 +3381,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] + [[package]] name = "writeable" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" +checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" [[package]] name = "x25519-dalek" @@ -3436,9 +3446,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -3447,9 +3457,9 @@ dependencies = [ [[package]] name = "yoke-derive" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", @@ -3459,18 +3469,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2578b716f8a7a858b7f02d5bd870c14bf4ddbbcf3a4c05414ba6503640505e3" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.42" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e6cc098ea4d3bd6246687de65af3f920c430e236bee1e3bf2e441463f08a02f" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -3479,18 +3489,18 @@ dependencies = [ [[package]] name = "zerofrom" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" dependencies = [ "zerofrom-derive", ] [[package]] name = "zerofrom-derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", @@ -3520,9 +3530,9 @@ dependencies = [ [[package]] name = "zerotrie" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +checksum = "0f9152d31db0792fa83f70fb2f83148effb5c1f5b8c7686c3459e361d9bc20bf" dependencies = [ "displaydoc", "yoke", @@ -3531,9 +3541,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" dependencies = [ "yoke", "zerofrom", @@ -3542,9 +3552,9 @@ dependencies = [ [[package]] name = "zerovec-derive" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", diff --git a/tests/e2e/evm/contracts/use_gas/evm_use_gas.hex b/tests/e2e/evm/contracts/use_gas/evm_use_gas.hex index a8a80cc837e..de2469d3dfb 100644 --- a/tests/e2e/evm/contracts/use_gas/evm_use_gas.hex +++ b/tests/e2e/evm/contracts/use_gas/evm_use_gas.hex @@ -1 +1 @@ -608060405234801561000f575f80fd5b5061035b8061001d5f395ff3fe608060405234801561000f575f80fd5b5060043610610034575f3560e01c80634f7be61114610038578063ce5cf2b314610042575b5f80fd5b610040610071565b005b610055610050366004610251565b610153565b6040516001600160801b03909116815260200160405180910390f35b6040515f9081906009600160981b01908281818181865af19150503d805f81146100b6576040519150601f19603f3d011682016040523d82523d5f602084013e6100bb565b606091505b5091509150816101095760405162461bcd60e51b815260206004820152601460248201527319d85cd7dd5cd9590818d85b1b0819985a5b195960621b60448201526064015b60405180910390fd5b7fa7f4919b703b170b4423761fe4fa09db0a7caff6f793544ae33a65f6c3ae81e88180602001905181019061013e919061027e565b60405190815260200160405180910390a15050565b5f614e20600a836001600160801b0316111561018a576005610176600285610295565b61018091906102c6565b925082915061018e565b8291505b604080516001600160801b03831660208201525f918291600a600160981b01910160408051601f19818403018152908290526101c9916102f9565b5f604051808303815f865af19150503d805f8114610202576040519150601f19603f3d011682016040523d82523d5f602084013e610207565b606091505b5091509150816102495760405162461bcd60e51b815260206004820152600d60248201526c1c185919d85cc819985a5b1959609a1b6044820152606401610100565b505050919050565b5f60208284031215610261575f80fd5b81356001600160801b0381168114610277575f80fd5b9392505050565b5f6020828403121561028e575f80fd5b5051919050565b5f6001600160801b03808416806102ba57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b6001600160801b038281168282160390808211156102f257634e487b7160e01b5f52601160045260245ffd5b5092915050565b5f82515f5b8181101561031857602081860181015185830152016102fe565b505f92019182525091905056fea26469706673582212202370b2a1e5c223fe3f045279a7652e709f284fecad8cb87fc78a06a799ebf0b964736f6c63430008150033 \ No newline at end of file +6080604052348015600f57600080fd5b5061037a8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80634f7be6111461003b578063ce5cf2b314610045575b600080fd5b610043610074565b005b61005861005336600461025d565b610159565b6040516001600160801b03909116815260200160405180910390f35b60405160009081906009600160981b01908281818181865af19150503d80600081146100bc576040519150601f19603f3d011682016040523d82523d6000602084013e6100c1565b606091505b50915091508161010f5760405162461bcd60e51b815260206004820152601460248201527319d85cd7dd5cd9590818d85b1b0819985a5b195960621b60448201526064015b60405180910390fd5b7fa7f4919b703b170b4423761fe4fa09db0a7caff6f793544ae33a65f6c3ae81e881806020019051810190610144919061028d565b60405190815260200160405180910390a15050565b600061c350600a836001600160801b0316111561019157600561017d6002856102a6565b61018791906102e2565b9250829150610195565b8291505b604080516001600160801b03831660208201526000918291600a600160981b01910160408051601f19818403018152908290526101d191610315565b6000604051808303816000865af19150503d806000811461020e576040519150601f19603f3d011682016040523d82523d6000602084013e610213565b606091505b5091509150816102555760405162461bcd60e51b815260206004820152600d60248201526c1c185919d85cc819985a5b1959609a1b6044820152606401610106565b505050919050565b60006020828403121561026f57600080fd5b81356001600160801b038116811461028657600080fd5b9392505050565b60006020828403121561029f57600080fd5b5051919050565b60006001600160801b038316806102cd57634e487b7160e01b600052601260045260246000fd5b806001600160801b0384160491505092915050565b6001600160801b03828116828216039081111561030f57634e487b7160e01b600052601160045260246000fd5b92915050565b6000825160005b81811015610336576020818601810151858301520161031c565b50600092019182525091905056fea2646970667358221220758be8742200d9ee5049ab60742eadfa0cde55dc67513a9add43743ae8fcab8464736f6c63430008220033 \ No newline at end of file diff --git a/tests/e2e/evm/contracts/use_gas/evm_use_gas.sol b/tests/e2e/evm/contracts/use_gas/evm_use_gas.sol index e25154759b9..346a08fea24 100644 --- a/tests/e2e/evm/contracts/use_gas/evm_use_gas.sol +++ b/tests/e2e/evm/contracts/use_gas/evm_use_gas.sol @@ -22,7 +22,7 @@ contract Test { function test_pad_gas( uint128 input - ) public padGas(20_000) returns (uint128) { + ) public padGas(50_000) returns (uint128) { if (input > 10) { input = (input / 2) - 5; return input; diff --git a/tests/e2e/evm/delegation.go b/tests/e2e/evm/delegation.go index 6ba6e815a8e..68be0e847a2 100644 --- a/tests/e2e/evm/delegation.go +++ b/tests/e2e/evm/delegation.go @@ -81,7 +81,8 @@ func DelegationReceiptsTest(ctx context.Context, env *scenario.Env) error { //no ev := evm.NewV1(env.Client) consAccounts := consensusAccounts.NewV1(env.Client) - gasPrice := uint64(2) + // Use zero gas price so that gas fees don't affect the final balance check. + gasPrice := uint64(0) // Deploy the contract. value := big.NewInt(0).Bytes() // Don't send any tokens. @@ -278,7 +279,7 @@ func DelegationReceiptsTest(ctx context.Context, env *scenario.Env) error { //no return fmt.Errorf("failed to check balance: %w", err) } - // We delegated 10_000 then undelegated 5_000. All gas fees were zero. + // We delegated 10_000 then undelegated 5_000. Gas price is zero, so no fees. expectedBalance := initialBalance.ToBigInt().Uint64() - 5_000 if balance.ToBigInt().Uint64() != expectedBalance { return fmt.Errorf("unexpected dave balance (expected: %d got: %s)", expectedBalance, balance) diff --git a/tests/e2e/evm/tests.go b/tests/e2e/evm/tests.go index 0b98ea2544b..43168aec87b 100644 --- a/tests/e2e/evm/tests.go +++ b/tests/e2e/evm/tests.go @@ -989,6 +989,9 @@ func evmCallSuicideTest(ctx context.Context, log *logging.Logger, rtc client.Run return fmt.Errorf("call_suicide method call should fail") case strings.Contains(err.Error(), "SELFDESTRUCT not supported"): // Expected error message. + if !strings.Contains(err.Error(), "module: evm code: 2") { + return fmt.Errorf("error should include module and evm code: %w", err) + } default: return fmt.Errorf("unexpected suicide call error: %w", err) } diff --git a/tests/runtimes/benchmarking/src/lib.rs b/tests/runtimes/benchmarking/src/lib.rs index dc88298fed3..9ea42808386 100644 --- a/tests/runtimes/benchmarking/src/lib.rs +++ b/tests/runtimes/benchmarking/src/lib.rs @@ -14,8 +14,6 @@ pub struct Runtime; impl modules::core::Config for Config {} impl oasis_runtime_sdk_evm::Config for Config { - type AdditionalPrecompileSet = (); - const CHAIN_ID: u64 = 123456; const TOKEN_DENOMINATION: Denomination = Denomination::NATIVE; diff --git a/tests/runtimes/simple-evm/src/lib.rs b/tests/runtimes/simple-evm/src/lib.rs index 94de00e04f4..32a11be9928 100644 --- a/tests/runtimes/simple-evm/src/lib.rs +++ b/tests/runtimes/simple-evm/src/lib.rs @@ -12,11 +12,11 @@ pub struct Runtime; /// Runtime configuration. pub struct Config; -impl modules::core::Config for Config {} +impl modules::core::Config for Config { + const DEFAULT_LOCAL_ESTIMATE_GAS_SEARCH_MAX_ITERS: u64 = 25; +} impl evm::Config for Config { - type AdditionalPrecompileSet = (); - const CHAIN_ID: u64 = 0xa515; const TOKEN_DENOMINATION: Denomination = Denomination::NATIVE;