From 53f6f8cd3fd49a326938a70814c9a11cd0cae91c Mon Sep 17 00:00:00 2001 From: Joaquin Carletti Date: Thu, 26 Oct 2023 13:57:48 -0300 Subject: [PATCH 1/4] add compilation flag to Make --- Makefile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Makefile b/Makefile index a2a1b28e..62978b52 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,5 @@ +OPT ?= 3 + .PHONY: setup update run test docs setup: @@ -15,6 +17,7 @@ copy-precompiles: .PHONY: build-precompiles build-precompiles: copy-precompiles + sed -i '' -e 's/--optimization [123sz]/--optimization ${OPT}/' submodules/era-test-node/etc/system-contracts/scripts/compile-yul.ts cd submodules/era-test-node && make build-precompiles run: build-precompiles From 951ffc16b216bd9ca07556efffb737f95e8a7c3f Mon Sep 17 00:00:00 2001 From: Joaquin Carletti Date: Thu, 26 Oct 2023 18:24:48 -0300 Subject: [PATCH 2/4] update tests and add script --- Makefile | 2 +- gas_reports.py | 36 ++ tests/build.rs | 33 ++ tests/tests/ecadd_tests.rs | 114 ++-- tests/tests/ecmul_tests.rs | 474 ++++++++++++----- tests/tests/ecpairing_tests.rs | 70 ++- tests/tests/modexp_tests.rs | 747 +++++++++++++++++---------- tests/tests/p256verify_tests.rs | 19 +- tests/tests/secp256k1verify_tests.rs | 18 +- tests/tests/test_utils.rs | 46 +- 10 files changed, 1117 insertions(+), 442 deletions(-) create mode 100755 gas_reports.py create mode 100644 tests/build.rs diff --git a/Makefile b/Makefile index 62978b52..3754f74c 100644 --- a/Makefile +++ b/Makefile @@ -21,7 +21,7 @@ build-precompiles: copy-precompiles cd submodules/era-test-node && make build-precompiles run: build-precompiles - cd submodules/era-test-node && cargo run -- --show-calls=all --resolve-hashes run + cd submodules/era-test-node && cargo +nightly run -- --show-calls=all --resolve-hashes run test: cd tests && \ diff --git a/gas_reports.py b/gas_reports.py new file mode 100755 index 00000000..b44c6373 --- /dev/null +++ b/gas_reports.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python3 + +import subprocess +import requests +import time + +def main(): + optimization = ["2"] + + headers = { + # Already added when you pass json= + # 'content-type': 'application/json', + } + + json_data = { + 'jsonrpc': '2.0', + 'id': 1, + 'method': 'zks_L1BatchNumber', + 'params': [], + } + + for opt in optimization: + popen = subprocess.Popen(["make", "run", "OTP={opt}"]) + while True: + try: + response = requests.post('http://localhost:8011', headers=headers, json=json_data) + if response.status_code == 200: + break + time.sleep(5) + except: + time.sleep(5) + subprocess.run(["make", "test"]) + subprocess.run(["mv", "./tests/gas_reports", f"./tests/gas_reports_{opt}"]) + +if __name__ == '__main__': + main() diff --git a/tests/build.rs b/tests/build.rs new file mode 100644 index 00000000..5bfd7c94 --- /dev/null +++ b/tests/build.rs @@ -0,0 +1,33 @@ +use std::fs::OpenOptions; +use std::io::Write; + +fn main() { + let directory = "gas_reports"; + if !std::path::Path::new(&directory).exists() { + std::fs::create_dir(&directory).unwrap(); + } + + let precompiles_report_list: Vec = vec![ + "modexp".to_string(), + "ecadd".to_string(), + "ecmul".to_string(), + "ecpairing".to_string(), + "p256verify".to_string(), + "secp256k1verify".to_string(), + ]; + precompiles_report_list + .into_iter() + .for_each(|mut precompile_name| { + let file_path = format!("{}/{}_report.md", directory, precompile_name); + precompile_name.push_str("_report.md"); + let mut file = OpenOptions::new() + .create(true) + .write(true) + .truncate(true) + .open(file_path) + .unwrap(); + + write!(file, "| Test case | Gas used |\n").unwrap(); + write!(file, "| --------- | -------- |\n").unwrap(); + }); +} diff --git a/tests/tests/ecadd_tests.rs b/tests/tests/ecadd_tests.rs index 14f93c40..92ef7567 100644 --- a/tests/tests/ecadd_tests.rs +++ b/tests/tests/ecadd_tests.rs @@ -1,7 +1,7 @@ use zksync_web3_rs::{types::Bytes, zks_utils::ECADD_PRECOMPILE_ADDRESS}; mod test_utils; -use test_utils::{era_call, eth_call}; +use test_utils::{era_call, eth_call, parse_call_result, write_ecadd_gas_result}; // Puts the points (6, 9) and (19274124, 124124) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes #[tokio::test] @@ -27,7 +27,9 @@ async fn ecadd_0_0_0_0_21000_0() { ) .await .unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 0 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 0 bytes. Gives the execution 21000 bytes"); } // Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -35,7 +37,9 @@ async fn ecadd_0_0_0_0_21000_0() { async fn ecadd_1_2_0_0_21000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes @@ -43,7 +47,9 @@ async fn ecadd_1_2_0_0_21000_128() { async fn ecadd_0_0_0_0_25000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); } // Puts the points (0, 3) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes @@ -65,7 +71,9 @@ async fn ecadd_0_0_1_3_25000_128() { async fn ecadd_0_0_1_2_25000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 25000 bytes @@ -73,7 +81,9 @@ async fn ecadd_0_0_1_2_25000_128() { async fn ecadd_0_0_0_0_25000_64() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 25000 bytes"); } // Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -81,7 +91,9 @@ async fn ecadd_0_0_0_0_25000_64() { async fn ecadd_1_2_1_2_21000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the points (1, 3) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 25000 bytes @@ -96,7 +108,9 @@ async fn ecadd_1_3_0_0_25000_80() { async fn ecadd_1_2_0_0_25000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes @@ -104,7 +118,9 @@ async fn ecadd_1_2_0_0_25000_192() { async fn ecadd_0_0_0_0_21000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 25000 bytes @@ -112,7 +128,9 @@ async fn ecadd_0_0_0_0_21000_192() { async fn ecadd_0_0_0_0_25000_80() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 25000 bytes"); } // Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (10744596414106452074759370245733544594153395043370666422502510773307029471145, 21039565435327757486054843320102702720990930294403178719740356721829973864651) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes @@ -120,7 +138,9 @@ async fn ecadd_0_0_0_0_25000_80() { async fn ecadd_1145_3932_1145_4651_21000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (10744596414106452074759370245733544594153395043370666422502510773307029471145, 21039565435327757486054843320102702720990930294403178719740356721829973864651) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (10744596414106452074759370245733544594153395043370666422502510773307029471145, 21039565435327757486054843320102702720990930294403178719740356721829973864651) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes @@ -128,7 +148,9 @@ async fn ecadd_1145_3932_1145_4651_21000_192() { async fn ecadd_0_0_1_2_21000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); } // Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes @@ -136,7 +158,9 @@ async fn ecadd_0_0_1_2_21000_192() { async fn ecadd_1_2_1_2_25000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); } // Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 25000 bytes @@ -144,7 +168,9 @@ async fn ecadd_1_2_1_2_25000_192() { async fn ecadd_1_2_0_0_25000_64() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 25000 bytes"); } // Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (1624070059937464756887933993293429854168590106605707304006200119738501412969, 3269329550605213075043232856820720631601935657990457502777101397807070461336) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -152,7 +178,9 @@ async fn ecadd_1_2_0_0_25000_64() { async fn ecadd_1145_3932_2969_1336_21000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (1624070059937464756887933993293429854168590106605707304006200119738501412969, 3269329550605213075043232856820720631601935657990457502777101397807070461336) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (1624070059937464756887933993293429854168590106605707304006200119738501412969, 3269329550605213075043232856820720631601935657990457502777101397807070461336) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the points (6, 9) and (19274124, 124124) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -167,7 +195,9 @@ async fn ecadd_6_9_19274124_124124_21000_128() { async fn ecadd_0_0_0_0_21000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 3) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -189,7 +219,9 @@ async fn ecadd_0_0_1_3_21000_128() { async fn ecadd_1_2_0_0_25000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); } // Puts the points (1, 3) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -204,7 +236,9 @@ async fn ecadd_1_3_0_0_21000_80() { async fn ecadd_1_2_1_2_25000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 0 bytes. Gives the execution 25000 bytes @@ -224,7 +258,9 @@ async fn ecadd_0_0_0_0_25000_0() { ) .await .unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 0 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 0 bytes. Gives the execution 25000 bytes"); } // Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -232,7 +268,9 @@ async fn ecadd_0_0_0_0_25000_0() { async fn ecadd_0_0_1_2_21000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes @@ -240,7 +278,9 @@ async fn ecadd_0_0_1_2_21000_128() { async fn ecadd_0_0_0_0_21000_64() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -248,7 +288,9 @@ async fn ecadd_0_0_0_0_21000_64() { async fn ecadd_0_0_0_0_21000_80() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes @@ -256,7 +298,9 @@ async fn ecadd_0_0_0_0_21000_80() { async fn ecadd_0_0_0_0_25000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); } // Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes @@ -264,7 +308,9 @@ async fn ecadd_0_0_0_0_25000_192() { async fn ecadd_1_2_0_0_21000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); } // Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes @@ -272,7 +318,9 @@ async fn ecadd_1_2_0_0_21000_192() { async fn ecadd_1_2_1_2_21000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 21000 bytes"); } // Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes @@ -280,7 +328,9 @@ async fn ecadd_1_2_1_2_21000_192() { async fn ecadd_0_0_1_2_25000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (0, 0) and (1, 2) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); } // Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (10744596414106452074759370245733544594153395043370666422502510773307029471145, 21039565435327757486054843320102702720990930294403178719740356721829973864651) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes @@ -288,7 +338,9 @@ async fn ecadd_0_0_1_2_25000_192() { async fn ecadd_1145_3932_1145_4651_25000_192() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa92e83f8d734803fc370eba25ed1f6b8768bd6d83887b87165fc2434fe11a830cb00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (10744596414106452074759370245733544594153395043370666422502510773307029471145, 21039565435327757486054843320102702720990930294403178719740356721829973864651) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (10744596414106452074759370245733544594153395043370666422502510773307029471145, 21039565435327757486054843320102702720990930294403178719740356721829973864651) into the ECADD precompile, truncating or expanding the input data to 192 bytes. Gives the execution 25000 bytes"); } // Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (1624070059937464756887933993293429854168590106605707304006200119738501412969, 3269329550605213075043232856820720631601935657990457502777101397807070461336) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes @@ -296,7 +348,9 @@ async fn ecadd_1145_3932_1145_4651_25000_192() { async fn ecadd_1145_3932_2969_1336_25000_128() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("17c139df0efee0f766bc0204762b774362e4ded88953a39ce849a8a7fa163fa901e0559bacb160664764a357af8a9fe70baa9258e0b959273ffc5718c6d4cc7c039730ea8dff1254c0fee9c0ea777d29a9c710b7e616683f194f18c43b43b869073a5ffcc6fc7a28c30723d6e58ce577356982d65b833a5a5c15bf9024b43d98").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (1624070059937464756887933993293429854168590106605707304006200119738501412969, 3269329550605213075043232856820720631601935657990457502777101397807070461336) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (10744596414106452074759370245733544594153395043370666422502510773307029471145, 848677436511517736191562425154572367705380862894644942948681172815252343932) and (1624070059937464756887933993293429854168590106605707304006200119738501412969, 3269329550605213075043232856820720631601935657990457502777101397807070461336) into the ECADD precompile, truncating or expanding the input data to 128 bytes. Gives the execution 25000 bytes"); } // Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes @@ -304,5 +358,7 @@ async fn ecadd_1145_3932_2969_1336_25000_128() { async fn ecadd_1_2_0_0_21000_64() { let eth_response = eth_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECADD_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecadd_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the points (1, 2) and (0, 0) into the ECADD precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); } diff --git a/tests/tests/ecmul_tests.rs b/tests/tests/ecmul_tests.rs index b759093e..9c2431e3 100644 --- a/tests/tests/ecmul_tests.rs +++ b/tests/tests/ecmul_tests.rs @@ -1,7 +1,7 @@ use zksync_web3_rs::{types::Bytes, zks_utils::ECMUL_PRECOMPILE_ADDRESS}; mod test_utils; -use test_utils::{era_call, eth_call}; +use test_utils::{era_call, eth_call, parse_call_result, write_ecmul_gas_result}; // Puts the point (1, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes #[tokio::test] @@ -15,7 +15,9 @@ async fn ecmul_1_3_0_21000_128() { async fn ecmul_1_2_5616_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes @@ -44,7 +46,9 @@ async fn ecmul_1_3_5617_28000_96() { async fn ecmul_1_2_5616_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -73,7 +77,9 @@ async fn ecmul_1_3_5616_28000_128() { async fn ecmul_7827_6598_5616_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -95,7 +101,9 @@ async fn ecmul_1_3_5617_28000_128() { async fn ecmul_1_2_340282366920938463463374607431768211456_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -117,7 +125,9 @@ async fn ecmul_1_3_1_28000_128() { async fn ecmul_1_2_9935_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -125,7 +135,9 @@ async fn ecmul_1_2_9935_21000_96() { async fn ecmul_1_2_5617_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -133,7 +145,9 @@ async fn ecmul_1_2_5617_28000_128() { async fn ecmul_1_2_340282366920938463463374607431768211456_21000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -141,7 +155,9 @@ async fn ecmul_1_2_340282366920938463463374607431768211456_21000_80() { async fn ecmul_1_2_2_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -156,7 +172,9 @@ async fn ecmul_1_3_9_21000_128() { async fn ecmul_7827_6598_1456_21000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -164,7 +182,9 @@ async fn ecmul_7827_6598_1456_21000_80() { async fn ecmul_7827_6598_0_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -172,7 +192,9 @@ async fn ecmul_7827_6598_0_28000_96() { async fn ecmul_7827_6598_1456_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -180,7 +202,9 @@ async fn ecmul_7827_6598_1456_21000_96() { async fn ecmul_7827_6598_0_28000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -202,7 +226,9 @@ async fn ecmul_1_3_9_28000_96() { async fn ecmul_7827_6598_9935_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -210,7 +236,9 @@ async fn ecmul_7827_6598_9935_21000_96() { async fn ecmul_1_2_5617_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -239,7 +267,9 @@ async fn ecmul_1_3_9935_28000_96() { async fn ecmul_7827_6598_0_28000_64() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -247,7 +277,9 @@ async fn ecmul_7827_6598_0_28000_64() { async fn ecmul_1_2_9935_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -262,7 +294,9 @@ async fn ecmul_1_3_9935_28000_128() { async fn ecmul_1_2_9935_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -270,7 +304,9 @@ async fn ecmul_1_2_9935_28000_128() { async fn ecmul_7827_6598_1_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -278,7 +314,9 @@ async fn ecmul_7827_6598_1_21000_96() { async fn ecmul_1_2_9_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -286,7 +324,9 @@ async fn ecmul_1_2_9_28000_96() { async fn ecmul_1_2_5617_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -322,7 +362,9 @@ async fn ecmul_1_3_5616_21000_96() { async fn ecmul_7827_6598_2_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -330,7 +372,9 @@ async fn ecmul_7827_6598_2_21000_96() { async fn ecmul_1_2_9_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -352,7 +396,9 @@ async fn ecmul_1_3_2_21000_128() { async fn ecmul_7827_6598_5617_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -367,7 +413,9 @@ async fn ecmul_1_3_0_28000_80() { async fn ecmul_7827_6598_9_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -375,7 +423,9 @@ async fn ecmul_7827_6598_9_28000_96() { async fn ecmul_1_2_9_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -390,7 +440,9 @@ async fn ecmul_1_3_5617_21000_96() { async fn ecmul_1_2_5616_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes @@ -405,7 +457,9 @@ async fn ecmul_1_3_0_21000_64() { async fn ecmul_7827_6598_5616_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -420,7 +474,9 @@ async fn ecmul_1_3_1_28000_96() { async fn ecmul_7827_6598_2_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -428,7 +484,9 @@ async fn ecmul_7827_6598_2_21000_128() { async fn ecmul_1_2_340282366920938463463374607431768211456_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -436,7 +494,9 @@ async fn ecmul_1_2_340282366920938463463374607431768211456_21000_128() { async fn ecmul_7827_6598_9935_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -444,7 +504,9 @@ async fn ecmul_7827_6598_9935_28000_128() { async fn ecmul_1_2_340282366920938463463374607431768211456_28000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -452,7 +514,9 @@ async fn ecmul_1_2_340282366920938463463374607431768211456_28000_80() { async fn ecmul_1_2_9935_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -467,7 +531,9 @@ async fn ecmul_1_3_2_28000_96() { async fn ecmul_1_2_340282366920938463463374607431768211456_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -475,7 +541,9 @@ async fn ecmul_1_2_340282366920938463463374607431768211456_28000_96() { async fn ecmul_1_2_340282366920938463463374607431768211456_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -483,7 +551,9 @@ async fn ecmul_1_2_340282366920938463463374607431768211456_28000_128() { async fn ecmul_7827_6598_2_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -491,7 +561,9 @@ async fn ecmul_7827_6598_2_28000_128() { async fn ecmul_7827_6598_0_21000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -499,7 +571,9 @@ async fn ecmul_7827_6598_0_21000_80() { async fn ecmul_7827_6598_1456_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -507,7 +581,9 @@ async fn ecmul_7827_6598_1456_28000_96() { async fn ecmul_7827_6598_0_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -515,7 +591,9 @@ async fn ecmul_7827_6598_0_21000_96() { async fn ecmul_7827_6598_9935_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -523,7 +601,9 @@ async fn ecmul_7827_6598_9935_21000_128() { async fn ecmul_7827_6598_1456_28000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -531,7 +611,9 @@ async fn ecmul_7827_6598_1456_28000_80() { async fn ecmul_7827_6598_9935_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -546,7 +628,9 @@ async fn ecmul_1_3_9_21000_96() { async fn ecmul_7827_6598_5617_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -561,7 +645,9 @@ async fn ecmul_1_3_9935_21000_96() { async fn ecmul_7827_6598_1456_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -569,7 +655,9 @@ async fn ecmul_7827_6598_1456_21000_128() { async fn ecmul_7827_6598_0_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -577,7 +665,9 @@ async fn ecmul_7827_6598_0_28000_128() { async fn ecmul_1_2_2_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes @@ -585,7 +675,9 @@ async fn ecmul_1_2_2_28000_96() { async fn ecmul_7827_6598_0_21000_64() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f6").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -593,7 +685,9 @@ async fn ecmul_7827_6598_0_21000_64() { async fn ecmul_7827_6598_5617_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -601,7 +695,9 @@ async fn ecmul_7827_6598_5617_28000_128() { async fn ecmul_7827_6598_0_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -609,7 +705,9 @@ async fn ecmul_7827_6598_0_21000_128() { async fn ecmul_7827_6598_1456_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -617,7 +715,9 @@ async fn ecmul_7827_6598_1456_28000_128() { async fn ecmul_1_2_9_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -625,7 +725,9 @@ async fn ecmul_1_2_9_21000_96() { async fn ecmul_7827_6598_1_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -647,7 +749,9 @@ async fn ecmul_1_3_340282366920938463463374607431768211456_21000_96() { async fn ecmul_7827_6598_9_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -669,7 +773,9 @@ async fn ecmul_1_3_340282366920938463463374607431768211456_21000_128() { async fn ecmul_1_2_5617_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -677,7 +783,9 @@ async fn ecmul_1_2_5617_28000_96() { async fn ecmul_7827_6598_5616_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -685,7 +793,9 @@ async fn ecmul_7827_6598_5616_28000_128() { async fn ecmul_7827_6598_2_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -693,7 +803,9 @@ async fn ecmul_7827_6598_2_28000_96() { async fn ecmul_7827_6598_1_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -708,7 +820,9 @@ async fn ecmul_1_3_0_21000_80() { async fn ecmul_7827_6598_5617_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -716,7 +830,9 @@ async fn ecmul_7827_6598_5617_28000_96() { async fn ecmul_7827_6598_9_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 3) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -738,7 +854,9 @@ async fn ecmul_1_3_0_21000_96() { async fn ecmul_7827_6598_5616_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f630644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -746,7 +864,9 @@ async fn ecmul_7827_6598_5616_21000_128() { async fn ecmul_1_2_616_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000230644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -754,7 +874,9 @@ async fn ecmul_1_2_616_28000_96() { async fn ecmul_7827_6598_9_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f60000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -762,7 +884,9 @@ async fn ecmul_7827_6598_9_21000_96() { async fn ecmul_7827_6598_1_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("1a87b0584ce92f4593d161480614f2989035225609f08058ccfa3d0f940febe31a2f3c951f6dadcc7ee9007dff81504b0fcd6d7cf59996efdc33d92bf7f9f8f600000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (11999875504842010600789954262886096740416429265635183817701593963271973497827, 11843594000332171325303933275547366297934113019079887694534126289021216356598) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -770,7 +894,9 @@ async fn ecmul_7827_6598_1_28000_128() { async fn ecmul_0_0_340282366920938463463374607431768211456_28000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes @@ -778,7 +904,9 @@ async fn ecmul_0_0_340282366920938463463374607431768211456_28000_80() { async fn ecmul_0_0_0_21000_64() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -786,7 +914,9 @@ async fn ecmul_0_0_0_21000_64() { async fn ecmul_0_0_1_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -794,7 +924,9 @@ async fn ecmul_0_0_1_21000_128() { async fn ecmul_0_0_340282366920938463463374607431768211456_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 40 bytes. Gives the execution 28000 bytes @@ -802,7 +934,9 @@ async fn ecmul_0_0_340282366920938463463374607431768211456_28000_96() { async fn ecmul_0_0_0_28000_40() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 40 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 40 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -810,7 +944,9 @@ async fn ecmul_0_0_0_28000_40() { async fn ecmul_0_0_5616_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -818,7 +954,9 @@ async fn ecmul_0_0_5616_21000_96() { async fn ecmul_0_0_9_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -833,7 +971,9 @@ async fn ecmul_0_3_2_21000_96() { async fn ecmul_0_0_1_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -841,7 +981,9 @@ async fn ecmul_0_0_1_28000_96() { async fn ecmul_1_2_0_28000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -856,7 +998,9 @@ async fn ecmul_0_3_9935_28000_96() { async fn ecmul_1_2_0_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -864,7 +1008,9 @@ async fn ecmul_1_2_0_28000_96() { async fn ecmul_0_0_1_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -872,7 +1018,9 @@ async fn ecmul_0_0_1_28000_128() { async fn ecmul_0_0_9_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -887,7 +1035,9 @@ async fn ecmul_0_3_9_28000_96() { async fn ecmul_0_0_2_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes @@ -902,7 +1052,9 @@ async fn ecmul_0_3_0_28000_64() { async fn ecmul_0_0_0_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -910,7 +1062,9 @@ async fn ecmul_0_0_0_28000_128() { async fn ecmul_0_0_9935_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -925,7 +1079,9 @@ async fn ecmul_0_3_5616_21000_96() { async fn ecmul_0_0_9_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 0 bytes. Gives the execution 21000 bytes @@ -945,7 +1101,9 @@ async fn ecmul_0_0_0_21000_0() { ) .await .unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 0 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 0 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -960,7 +1118,9 @@ async fn ecmul_0_3_1_21000_96() { async fn ecmul_1_2_2_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -968,7 +1128,9 @@ async fn ecmul_1_2_2_21000_128() { async fn ecmul_0_0_0_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -976,7 +1138,9 @@ async fn ecmul_0_0_0_21000_128() { async fn ecmul_0_0_2_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -984,7 +1148,9 @@ async fn ecmul_0_0_2_21000_128() { async fn ecmul_0_0_340282366920938463463374607431768211456_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -992,7 +1158,9 @@ async fn ecmul_0_0_340282366920938463463374607431768211456_21000_128() { async fn ecmul_1_2_0_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1000,7 +1168,9 @@ async fn ecmul_1_2_0_21000_128() { async fn ecmul_1_2_2_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -1022,7 +1192,9 @@ async fn ecmul_0_3_0_28000_80() { async fn ecmul_1_2_0_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -1037,7 +1209,9 @@ async fn ecmul_0_3_5617_28000_96() { async fn ecmul_0_0_340282366920938463463374607431768211456_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -1045,7 +1219,9 @@ async fn ecmul_0_0_340282366920938463463374607431768211456_28000_128() { async fn ecmul_0_0_2_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -1053,7 +1229,9 @@ async fn ecmul_0_0_2_28000_128() { async fn ecmul_1_2_1_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -1061,7 +1239,9 @@ async fn ecmul_1_2_1_28000_128() { async fn ecmul_0_0_5617_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1083,7 +1263,9 @@ async fn ecmul_0_3_340282366920938463463374607431768211456_21000_80() { async fn ecmul_1_2_0_28000_64() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -1091,7 +1273,9 @@ async fn ecmul_1_2_0_28000_64() { async fn ecmul_1_2_1_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1099,7 +1283,9 @@ async fn ecmul_1_2_1_21000_128() { async fn ecmul_0_0_0_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1107,7 +1293,9 @@ async fn ecmul_0_0_0_21000_96() { async fn ecmul_1_2_1_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -1115,7 +1303,9 @@ async fn ecmul_1_2_1_21000_96() { async fn ecmul_0_0_0_21000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1123,7 +1313,9 @@ async fn ecmul_0_0_0_21000_80() { async fn ecmul_0_0_340282366920938463463374607431768211456_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 40 bytes. Gives the execution 21000 bytes @@ -1131,7 +1323,9 @@ async fn ecmul_0_0_340282366920938463463374607431768211456_21000_96() { async fn ecmul_0_0_0_21000_40() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 40 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 40 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -1139,7 +1333,9 @@ async fn ecmul_0_0_0_21000_40() { async fn ecmul_0_0_5616_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes @@ -1147,7 +1343,9 @@ async fn ecmul_0_0_5616_21000_128() { async fn ecmul_0_0_0_28000_64() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -1174,7 +1372,9 @@ async fn ecmul_0_0_0_28000_0() { ) .await .unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 0 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 0 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes @@ -1182,7 +1382,9 @@ async fn ecmul_0_0_0_28000_0() { async fn ecmul_0_0_340282366920938463463374607431768211456_21000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -1211,7 +1413,9 @@ async fn ecmul_0_3_2_28000_96() { async fn ecmul_0_0_5616_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1219,7 +1423,9 @@ async fn ecmul_0_0_5616_28000_96() { async fn ecmul_1_2_0_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1234,7 +1440,9 @@ async fn ecmul_0_3_9935_21000_96() { async fn ecmul_1_2_0_21000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -1249,7 +1457,9 @@ async fn ecmul_0_3_340282366920938463463374607431768211456_28000_128() { async fn ecmul_0_0_1_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -1257,7 +1467,9 @@ async fn ecmul_0_0_1_21000_96() { async fn ecmul_0_0_5616_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes @@ -1293,7 +1505,9 @@ async fn ecmul_0_3_5617_21000_128() { async fn ecmul_0_0_2_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 2 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1301,7 +1515,9 @@ async fn ecmul_0_0_2_21000_96() { async fn ecmul_0_0_9935_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -1309,7 +1525,9 @@ async fn ecmul_0_0_9935_21000_96() { async fn ecmul_0_0_5617_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes @@ -1331,7 +1549,9 @@ async fn ecmul_0_3_5617_28000_128() { async fn ecmul_0_0_9_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495616 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -1346,7 +1566,9 @@ async fn ecmul_0_3_5616_28000_96() { async fn ecmul_0_0_5617_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -1375,7 +1597,9 @@ async fn ecmul_0_3_9935_28000_128() { async fn ecmul_0_0_9935_21000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 9 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes @@ -1425,7 +1649,9 @@ async fn ecmul_0_3_9_21000_128() { async fn ecmul_0_0_9935_28000_128() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 115792089237316195423570985008687907853269984665640564039457584007913129639935 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes @@ -1440,7 +1666,9 @@ async fn ecmul_0_3_5617_21000_96() { async fn ecmul_0_0_5617_21000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 21888242871839275222246405745257275088548364400416034343698204186575808495617 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 21000 bytes"); } // Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes @@ -1448,7 +1676,9 @@ async fn ecmul_0_0_5617_21000_96() { async fn ecmul_1_2_0_21000_64() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 64 bytes. Gives the execution 21000 bytes"); } // Puts the point (0, 3) and the factor 340282366920938463463374607431768211456 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes @@ -1477,7 +1707,9 @@ async fn ecmul_0_3_340282366920938463463374607431768211456_28000_96() { async fn ecmul_0_0_0_28000_80() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 80 bytes. Gives the execution 28000 bytes"); } // Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -1485,7 +1717,9 @@ async fn ecmul_0_0_0_28000_80() { async fn ecmul_1_2_1_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (1, 2) and the factor 1 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes @@ -1493,7 +1727,9 @@ async fn ecmul_1_2_1_28000_96() { async fn ecmul_0_0_0_28000_96() { let eth_response = eth_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECMUL_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecmul_gas_result(gas_used); + assert_eq!(eth_response, era_output, "Puts the point (0, 0) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 96 bytes. Gives the execution 28000 bytes"); } // Puts the point (0, 3) and the factor 0 into the ECMUL precompile, truncating or expanding the input data to 128 bytes. Gives the execution 28000 bytes diff --git a/tests/tests/ecpairing_tests.rs b/tests/tests/ecpairing_tests.rs index 8ed56d7b..6565bcb2 100644 --- a/tests/tests/ecpairing_tests.rs +++ b/tests/tests/ecpairing_tests.rs @@ -1,7 +1,7 @@ use zksync_web3_rs::{types::Bytes, zks_utils::ECPAIRING_PRECOMPILE_ADDRESS}; mod test_utils; -use test_utils::{era_call, eth_call}; +use test_utils::{era_call, eth_call, parse_call_result, write_ecpairing_gas_result}; // Puts the given data into the ECPAIRING precompile #[tokio::test] @@ -20,8 +20,10 @@ async fn ecpairing_empty_data_insufficient_gas() { ) .await .unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -52,8 +54,10 @@ async fn ecpairing_perturb_zeropoint_by_one() { async fn ecpairing_one_point_with_g1_zero() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -77,8 +81,10 @@ async fn ecpairing_one_point_with_g2_zero_and_g1_invalid() { async fn ecpairing_two_point_match_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -88,8 +94,10 @@ async fn ecpairing_two_point_match_1() { async fn ecpairing_two_point_fail_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -99,8 +107,10 @@ async fn ecpairing_two_point_fail_1() { async fn ecpairing_two_point_oog() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -110,8 +120,10 @@ async fn ecpairing_two_point_oog() { async fn ecpairing_three_point_fail_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f00cacf3523caf879d7d05e30549f1e6fdce364cbb8724b0329c6c2a39d4f018e0692e55db067300e6e3fe56218fa2f940054e57e7ef92bf7d475a9d8a8502fd200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f00cacf3523caf879d7d05e30549f1e6fdce364cbb8724b0329c6c2a39d4f018e0692e55db067300e6e3fe56218fa2f940054e57e7ef92bf7d475a9d8a8502fd200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -121,8 +133,10 @@ async fn ecpairing_three_point_fail_1() { async fn ecpairing_one_point_insufficient_gas() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -144,8 +158,10 @@ async fn ecpairing_empty_data() { ) .await .unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -155,8 +171,10 @@ async fn ecpairing_empty_data() { async fn ecpairing_two_point_match_4() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -173,8 +191,10 @@ async fn ecpairing_perturb_g2_by_one() { async fn ecpairing_three_point_match_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -184,8 +204,10 @@ async fn ecpairing_three_point_match_1() { async fn ecpairing_two_point_match_5() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -195,8 +217,10 @@ async fn ecpairing_two_point_match_5() { async fn ecpairing_two_point_match_2() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -206,8 +230,10 @@ async fn ecpairing_two_point_match_2() { async fn ecpairing_two_point_fail_2() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd03042700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002105384b6dd6c48634b9fe89cb3e19667c1fe6736c69df070d674c95a42b3b8242c0d8e67f0f2c14c43734b430d8be4265af8c4f7a67deb0b029fd2dff99cc6b9015eaec465d922580c7de5d4a5c26de75eaf2af6841b7412ef2eebd1e051076f1b4c21849e48de12d1bae2bad3299717aa8664ade430e19dec72a6e10a39b0ab").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd03042700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002105384b6dd6c48634b9fe89cb3e19667c1fe6736c69df070d674c95a42b3b8242c0d8e67f0f2c14c43734b430d8be4265af8c4f7a67deb0b029fd2dff99cc6b9015eaec465d922580c7de5d4a5c26de75eaf2af6841b7412ef2eebd1e051076f1b4c21849e48de12d1bae2bad3299717aa8664ade430e19dec72a6e10a39b0ab").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -217,8 +243,10 @@ async fn ecpairing_two_point_fail_2() { async fn ecpairing_two_points_with_one_g2_zero() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -249,8 +277,10 @@ async fn ecpairing_perturb_zeropoint_by_curve_order() { async fn ecpairing_one_point_with_g2_zero() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -274,8 +304,10 @@ async fn ecpairing_bad_length_193() { async fn ecpairing_two_point_match_3() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } @@ -285,8 +317,10 @@ async fn ecpairing_two_point_match_3() { async fn ecpairing_one_point_fail() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( - eth_response, era_response, + eth_response, era_output, "Puts the given data into the ECPAIRING precompile" ); } diff --git a/tests/tests/modexp_tests.rs b/tests/tests/modexp_tests.rs index 72430fb3..68e4ef73 100644 --- a/tests/tests/modexp_tests.rs +++ b/tests/tests/modexp_tests.rs @@ -1,1240 +1,1449 @@ use zksync_web3_rs::{types::Bytes, zks_utils::MODEXP_PRECOMPILE_ADDRESS}; +#[cfg(test)] mod test_utils; use test_utils::{era_call, eth_call}; +use crate::test_utils::{parse_call_result, write_modexp_gas_result}; + #[tokio::test] async fn modexp_0() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_1() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_2() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_3() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_4() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_5() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_6() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020038000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020038000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_7() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000080").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000080").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_8() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_9() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000101").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000101").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_10() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000304").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000304").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_11() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020004").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020004").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_12() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020300").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020300").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_13() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010304").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010304").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_14() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_15() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000203").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000203").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_16() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030006").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030006").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_17() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020306").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020306").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_18() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002020300").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002020300").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_19() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_20() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020203").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020203").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_21() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002023003").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002023003").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_22() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020230").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020230").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_23() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_24() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_25() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001001001010010").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001001001010010").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_26() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000064").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000064").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_27() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030006").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030006").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. #[tokio::test] async fn modexp_28() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(&[])) } #[tokio::test] async fn modexp_29() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_30() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_31() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010035ee4e488f45e64d2f07becd54646357381d32f30b74c299a8c25d5202c04938ef6c4764a04f10fc908b78c4486886000f6d290251a79681a83b950c7e5c37351").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010035ee4e488f45e64d2f07becd54646357381d32f30b74c299a8c25d5202c04938ef6c4764a04f10fc908b78c4486886000f6d290251a79681a83b950c7e5c37351").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_32() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000cd935b43e42204fcbfb734a6e27735e8e90204fcc1fd2727bb040f9eecb").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000cd935b43e42204fcbfb734a6e27735e8e90204fcc1fd2727bb040f9eecb").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_33() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060846813a8d2d451387340fa0597c6545ae63").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060846813a8d2d451387340fa0597c6545ae63").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_34() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d02534f82b1013f20d9c7d18d62cd95674d2e013f20d9c7d18d62cd95674d2f").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d02534f82b1013f20d9c7d18d62cd95674d2e013f20d9c7d18d62cd95674d2f").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_35() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120785e45de3d6be050ba3c4d33ff0bb2d010ace3b1dfe9c49f4c7a8075102fa19a86c010ace3b1dfe9c49f4c7a8075102fa19a86d").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120785e45de3d6be050ba3c4d33ff0bb2d010ace3b1dfe9c49f4c7a8075102fa19a86c010ace3b1dfe9c49f4c7a8075102fa19a86d").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. #[tokio::test] async fn modexp_36() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000ff2a1e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000ff2a1e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(&[])); } #[tokio::test] async fn modexp_37() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010001").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010001").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010001").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_tests_0() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_1() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_2() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_3() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_4() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_5() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_6() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_7() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_8() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_9() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_10() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1_048_578. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1_048_578. #[tokio::test] async fn modexp_tests_11() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 1_048_578])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_12() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_13() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_14() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_15() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_16() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_tests_17() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_18() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_19() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_20() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_21() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_22() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_23() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_24() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_25() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_26() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_27() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. #[tokio::test] async fn modexp_tests_28() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 1_048_578])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_29() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_30() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_31() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_32() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_33() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_tests_34() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_35() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_36() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_37() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_38() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_39() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_40() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_41() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_42() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_43() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_44() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_45() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. #[tokio::test] async fn modexp_tests_46() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 1_048_578])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_47() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_48() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_49() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_50() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_51() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_tests_52() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_53() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_54() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 16. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 16. #[tokio::test] async fn modexp_tests_55() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 16])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 16])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 32. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 32. #[tokio::test] async fn modexp_tests_56() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 32])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 32])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 64. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 64. #[tokio::test] async fn modexp_tests_57() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 64])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 64])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 100. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 100. #[tokio::test] async fn modexp_tests_58() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 100])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 100])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 128. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 128. #[tokio::test] async fn modexp_tests_59() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 128])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 128])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 4.097. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 4.097. #[tokio::test] async fn modexp_tests_60() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 4_097])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 4_097])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 #[tokio::test] async fn modexp_tests_61() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 1_048_578])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_62() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_63() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_64() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_65() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_66() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_tests_67() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_68() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_69() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_70() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_71() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_72() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_73() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_74() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_75() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_76() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_77() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. #[tokio::test] async fn modexp_tests_78() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 1_048_578])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_79() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_80() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_81() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_82() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_83() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_tests_84() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_85() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_86() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_87() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_88() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_89() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_90() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_91() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_92() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_93() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_94() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 #[tokio::test] async fn modexp_tests_95() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 1_048_578])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_96() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_97() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_98() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_99() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_tests_100() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); } #[tokio::test] async fn modexp_tests_101() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_102() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_103() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_104() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_105() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_106() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_107() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_108() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_109() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_110() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_111() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_112() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_tests_113() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 39.936. +// FIXME:This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 39.936. #[tokio::test] async fn modexp_tests_114() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000009c00").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000009c00").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 39_936])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 39_936])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 11.579. +// FIXME:This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 11.579. #[tokio::test] async fn modexp_tests_115() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000071140000000000000000000000000000000000000000000000000000000000002d3b").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000071140000000000000000000000000000000000000000000000000000000000002d3b").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 11_579])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 11_579])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. #[tokio::test] async fn modexp_tests_116() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 37_111])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 37_111])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. #[tokio::test] async fn modexp_tests_117() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000e7f00000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000e7f00000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 37_111])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 37_111])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 2.401. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 2.401. #[tokio::test] async fn modexp_tests_118() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000009610000000000000000000000000000000000000000000000000000000000000961").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000009610000000000000000000000000000000000000000000000000000000000000961").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 2_401])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 2_401])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 22000. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 22000. #[tokio::test] async fn modexp_tests_119() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000578b00000000000000000000000000000000000000000000000000000000000055f0").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000578b00000000000000000000000000000000000000000000000000000000000055f0").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 22000])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 22000])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. #[tokio::test] async fn modexp_tests_120() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(&[])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00` because of mod length being 1. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00` because of mod length being 1. #[tokio::test] async fn modexp_tests_121() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(&[0])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. #[tokio::test] async fn modexp_tests_122() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 37_111])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 37_111])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. #[tokio::test] async fn modexp_tests_123() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000001bd000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000001bd000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 97])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 97])); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. #[tokio::test] async fn modexp_tests_124() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 97])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 97])); } #[tokio::test] async fn modexp_tests_125() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000d7a1").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000d7a1").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 42.965 +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 42.965 #[tokio::test] async fn modexp_tests_126() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000a7d5").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000a7d5").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(vec![0; 42_965])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(vec![0; 42_965])); } #[tokio::test] async fn modexp_random_input_0() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } -// This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. +// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. #[tokio::test] async fn modexp_random_input_1() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000008000000000000000000000000000000000000000000000000000000000000400000000000000000000000a").unwrap()))).await.is_err()); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000008000000000000000000000000000000000000000000000000000000000000400000000000000000000000a").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[])); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(&[])); } -// This test fails on L1 with "out of gas" error and is reverted on L2 returning `0x00`. #[tokio::test] async fn modexp_random_input_2() { assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001147000000000000000000000000000000000000000000000000000000000061660350000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001147000000000000000000000000000000000000000000000000000000000061660350000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - assert_eq!(era_response, Bytes::from(&[0])); + assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001147000000000000000000000000000000000000000000000000000000000061660350000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.is_err()); } #[tokio::test] @@ -1253,33 +1462,43 @@ async fn modexp_edge_cases_1() { ) .await .unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_edge_cases_2() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_edge_cases_3() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000100").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000100").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_edge_cases_4() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001010200").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001010200").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } #[tokio::test] async fn modexp_edge_cases_5() { let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02f1").unwrap()))).await.unwrap(); let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02f1").unwrap()))).await.unwrap(); - assert_eq!(eth_response, era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_modexp_gas_result(gas_used); + assert_eq!(eth_response, era_output); } diff --git a/tests/tests/p256verify_tests.rs b/tests/tests/p256verify_tests.rs index fd68c662..4a2c5ed1 100644 --- a/tests/tests/p256verify_tests.rs +++ b/tests/tests/p256verify_tests.rs @@ -1,7 +1,7 @@ use zksync_web3_rs::types::{Address, Bytes, H160}; mod test_utils; -use test_utils::era_call; +use test_utils::{era_call, parse_call_result, write_p256verify_gas_result}; pub const P256VERIFTY_PRECOMPILE_ADDRESS: Address = H160([ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -27,7 +27,9 @@ async fn p256verify_valid_signature_one() { ) .await .unwrap(); - assert_eq!(era_response, Bytes::from(RESPONSE_VALID)) + let (era_output, gas_used) = parse_call_result(&era_response); + write_p256verify_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(RESPONSE_VALID)) } #[tokio::test] @@ -39,7 +41,9 @@ async fn p256verify_valid_signature_two() { ) .await .unwrap(); - assert_eq!(era_response, Bytes::from(RESPONSE_VALID)) + let (era_output, gas_used) = parse_call_result(&era_response); + write_p256verify_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(RESPONSE_VALID)) } #[tokio::test] @@ -51,7 +55,9 @@ async fn p256verify_invalid_signature() { ) .await .unwrap(); - assert_eq!(era_response, Bytes::from(RESPONSE_INVALID)) + let (era_output, gas_used) = parse_call_result(&era_response); + write_p256verify_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(RESPONSE_INVALID)) } #[tokio::test] @@ -79,6 +85,7 @@ async fn p256verify_invalid_s() { .err() .unwrap() .to_string(); + assert_eq!(era_response, EXECUTION_REVERTED) } @@ -93,6 +100,7 @@ async fn p256verify_public_key_inf() { .err() .unwrap() .to_string(); + assert_eq!(era_response, EXECUTION_REVERTED) } @@ -107,6 +115,7 @@ async fn p256verify_public_key_x_not_in_field() { .err() .unwrap() .to_string(); + assert_eq!(era_response, EXECUTION_REVERTED) } @@ -121,6 +130,7 @@ async fn p256verify_public_key_y_not_in_field() { .err() .unwrap() .to_string(); + assert_eq!(era_response, EXECUTION_REVERTED) } @@ -135,5 +145,6 @@ async fn p256verify_public_key_not_in_curve() { .err() .unwrap() .to_string(); + assert_eq!(era_response, EXECUTION_REVERTED) } diff --git a/tests/tests/secp256k1verify_tests.rs b/tests/tests/secp256k1verify_tests.rs index 31573663..c2eb02a5 100644 --- a/tests/tests/secp256k1verify_tests.rs +++ b/tests/tests/secp256k1verify_tests.rs @@ -1,13 +1,13 @@ use zksync_web3_rs::types::{Address, Bytes, H160}; +mod test_utils; +use test_utils::{era_call, parse_call_result, write_secp256k1verify_gas_result}; + pub const SECP256K1VERIFTY_PRECOMPILE_ADDRESS: Address = H160([ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, ]); -mod test_utils; -use test_utils::era_call; - const RESPONSE_VALID: [u8; 32] = [ 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, ]; @@ -27,7 +27,9 @@ async fn secp256k1verify_valid_signature_one() { ) .await .unwrap(); - assert_eq!(era_response, Bytes::from(RESPONSE_VALID)) + let (era_output, gas_used) = parse_call_result(&era_response); + write_secp256k1verify_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(RESPONSE_VALID)) } #[tokio::test] @@ -39,7 +41,9 @@ async fn secp256k1verify_valid_signature_two() { ) .await .unwrap(); - assert_eq!(era_response, Bytes::from(RESPONSE_VALID)) + let (era_output, gas_used) = parse_call_result(&era_response); + write_secp256k1verify_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(RESPONSE_VALID)) } #[tokio::test] @@ -51,7 +55,9 @@ async fn secp256k1verify_invalid_signature() { ) .await .unwrap(); - assert_eq!(era_response, Bytes::from(RESPONSE_INVALID)) + let (era_output, gas_used) = parse_call_result(&era_response); + write_secp256k1verify_gas_result(gas_used); + assert_eq!(era_output, Bytes::from(RESPONSE_INVALID)) } #[tokio::test] diff --git a/tests/tests/test_utils.rs b/tests/tests/test_utils.rs index 94176f03..ee3558fa 100644 --- a/tests/tests/test_utils.rs +++ b/tests/tests/test_utils.rs @@ -1,4 +1,4 @@ -use std::env; +use std::{env, fs::OpenOptions, io::Write}; use zksync_web3_rs::{ providers::{Http, Middleware, Provider, ProviderError}, types::{transaction::eip2718::TypedTransaction, Address, Bytes, Eip1559TransactionRequest}, @@ -9,6 +9,50 @@ static DEFAULT_L1_PROVIDER_URL: &str = "https://eth-mainnet.alchemyapi.io/v2/Lc7oIGYeL_QvInzI0Wiu_pOZZDEKBrdf"; static DEFAULT_L2_PROVIDER_URL: &str = "http://localhost:8011"; +pub fn parse_call_result(bytes: &[u8]) -> (Bytes, u32) { + let gas_used_bytes = bytes[0..4].to_vec(); + let output = bytes[4..].to_vec(); + let gas_used = u32::from_le_bytes(gas_used_bytes.try_into().unwrap()); + + (output.into(), gas_used) +} + +fn write_line_to_report(used_gas: u32, report_to_write: &str) { + let mut file = OpenOptions::new() + .append(true) + .open(report_to_write) + .unwrap(); + + let curr_thread = std::thread::current(); + let test_name = curr_thread.name().unwrap(); + + write!(file, "| {test_name} | {used_gas} | \n").unwrap(); +} + +pub fn write_modexp_gas_result(used_gas: u32) { + write_line_to_report(used_gas, "gas_reports/modexp_report.md"); +} + +pub fn write_ecadd_gas_result(used_gas: u32) { + write_line_to_report(used_gas, "gas_reports/ecadd_report.md"); +} + +pub fn write_ecmul_gas_result(used_gas: u32) { + write_line_to_report(used_gas, "gas_reports/ecmul_report.md"); +} + +pub fn write_ecpairing_gas_result(used_gas: u32) { + write_line_to_report(used_gas, "gas_reports/ecpairing_report.md"); +} + +pub fn write_p256verify_gas_result(used_gas: u32) { + write_line_to_report(used_gas, "gas_reports/p256verify_report.md"); +} + +pub fn write_secp256k1verify_gas_result(used_gas: u32) { + write_line_to_report(used_gas, "gas_reports/secp256k1verify_report.md"); +} + pub fn eth_provider() -> Provider { let url: String = env::var("ZKSYNC_WEB3_RS_L1_PROVIDER_URL").unwrap_or(DEFAULT_L1_PROVIDER_URL.to_owned()); From 7995789b6de5a3133184e25e3c724213bf55ad57 Mon Sep 17 00:00:00 2001 From: Joaquin Carletti Date: Fri, 27 Oct 2023 10:07:03 -0300 Subject: [PATCH 3/4] fix writeln --- tests/build.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/build.rs b/tests/build.rs index 5bfd7c94..68bfdeb7 100644 --- a/tests/build.rs +++ b/tests/build.rs @@ -4,7 +4,7 @@ use std::io::Write; fn main() { let directory = "gas_reports"; if !std::path::Path::new(&directory).exists() { - std::fs::create_dir(&directory).unwrap(); + std::fs::create_dir(directory).unwrap(); } let precompiles_report_list: Vec = vec![ @@ -27,7 +27,7 @@ fn main() { .open(file_path) .unwrap(); - write!(file, "| Test case | Gas used |\n").unwrap(); - write!(file, "| --------- | -------- |\n").unwrap(); + writeln!(file, "| Test case | Gas used |").unwrap(); + writeln!(file, "| --------- | -------- |").unwrap(); }); } From 73db39c1bb84bbea7c37bb533790b7b9dbb69e48 Mon Sep 17 00:00:00 2001 From: Joaquin Carletti Date: Tue, 31 Oct 2023 11:25:11 -0300 Subject: [PATCH 4/4] add gas cost tables --- .../test_results-checkpoint.ipynb | 236 ++ gas_reports.py | 6 +- scripts/verify_playground.py | 22 + submodules/era-test-node | 2 +- test_results.ipynb | 932 +++++ tests/build.rs | 7 +- tests/gas_reports/ecadd_report.csv | 1 + tests/gas_reports/ecmul_report.csv | 1 + tests/gas_reports/ecpairing_report.csv | 1 + tests/gas_reports/modexp_report.csv | 1 + tests/gas_reports/p256verify_report.csv | 1 + tests/gas_reports/secp256k1verify_report.csv | 1 + tests/gas_reports_2/ecadd_report.csv | 29 + tests/gas_reports_2/ecmul_report.csv | 119 + tests/gas_reports_2/ecpairing_report.csv | 18 + tests/gas_reports_2/modexp_report.csv | 1 + tests/gas_reports_2/p256verify_report.csv | 4 + .../gas_reports_2/secp256k1verify_report.csv | 4 + tests/gas_reports_3/ecadd_report.csv | 29 + tests/gas_reports_3/ecmul_report.csv | 119 + tests/gas_reports_3/ecpairing_report.csv | 18 + tests/gas_reports_3/modexp_report.csv | 1 + tests/gas_reports_3/p256verify_report.csv | 4 + .../gas_reports_3/secp256k1verify_report.csv | 4 + tests/gas_reports_s/ecadd_report.csv | 29 + tests/gas_reports_s/ecmul_report.csv | 119 + tests/gas_reports_s/ecpairing_report.csv | 18 + tests/gas_reports_s/modexp_report.csv | 1 + tests/gas_reports_s/p256verify_report.csv | 4 + .../gas_reports_s/secp256k1verify_report.csv | 4 + tests/gas_reports_z/ecadd_report.csv | 29 + tests/gas_reports_z/ecmul_report.csv | 119 + tests/gas_reports_z/ecpairing_report.csv | 18 + tests/gas_reports_z/modexp_report.csv | 1 + tests/gas_reports_z/p256verify_report.csv | 4 + .../gas_reports_z/secp256k1verify_report.csv | 4 + tests/tests/ecpairing_tests.rs | 53 +- tests/tests/modexp_tests.rs | 3008 ++++++++--------- tests/tests/secp256k1verify_tests.rs | 12 - tests/tests/test_utils.rs | 15 +- 40 files changed, 3450 insertions(+), 1549 deletions(-) create mode 100644 .ipynb_checkpoints/test_results-checkpoint.ipynb create mode 100644 scripts/verify_playground.py create mode 100644 test_results.ipynb create mode 100644 tests/gas_reports/ecadd_report.csv create mode 100644 tests/gas_reports/ecmul_report.csv create mode 100644 tests/gas_reports/ecpairing_report.csv create mode 100644 tests/gas_reports/modexp_report.csv create mode 100644 tests/gas_reports/p256verify_report.csv create mode 100644 tests/gas_reports/secp256k1verify_report.csv create mode 100644 tests/gas_reports_2/ecadd_report.csv create mode 100644 tests/gas_reports_2/ecmul_report.csv create mode 100644 tests/gas_reports_2/ecpairing_report.csv create mode 100644 tests/gas_reports_2/modexp_report.csv create mode 100644 tests/gas_reports_2/p256verify_report.csv create mode 100644 tests/gas_reports_2/secp256k1verify_report.csv create mode 100644 tests/gas_reports_3/ecadd_report.csv create mode 100644 tests/gas_reports_3/ecmul_report.csv create mode 100644 tests/gas_reports_3/ecpairing_report.csv create mode 100644 tests/gas_reports_3/modexp_report.csv create mode 100644 tests/gas_reports_3/p256verify_report.csv create mode 100644 tests/gas_reports_3/secp256k1verify_report.csv create mode 100644 tests/gas_reports_s/ecadd_report.csv create mode 100644 tests/gas_reports_s/ecmul_report.csv create mode 100644 tests/gas_reports_s/ecpairing_report.csv create mode 100644 tests/gas_reports_s/modexp_report.csv create mode 100644 tests/gas_reports_s/p256verify_report.csv create mode 100644 tests/gas_reports_s/secp256k1verify_report.csv create mode 100644 tests/gas_reports_z/ecadd_report.csv create mode 100644 tests/gas_reports_z/ecmul_report.csv create mode 100644 tests/gas_reports_z/ecpairing_report.csv create mode 100644 tests/gas_reports_z/modexp_report.csv create mode 100644 tests/gas_reports_z/p256verify_report.csv create mode 100644 tests/gas_reports_z/secp256k1verify_report.csv diff --git a/.ipynb_checkpoints/test_results-checkpoint.ipynb b/.ipynb_checkpoints/test_results-checkpoint.ipynb new file mode 100644 index 00000000..14ff84f0 --- /dev/null +++ b/.ipynb_checkpoints/test_results-checkpoint.ipynb @@ -0,0 +1,236 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 41, + "id": "2e8df45a-6df7-40c6-9daf-481e83094e56", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import glob" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "id": "7a26728e-ea2e-488f-849d-81d47a7b338a", + "metadata": {}, + "outputs": [], + "source": [ + "files = glob.glob('./tests/*/*.csv')\n", + "combined_df = pd.DataFrame()" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "id": "26550992-86e6-4e06-9eac-2f13cac64ea8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['./tests/gas_reports_2/modexp_report.csv',\n", + " './tests/gas_reports_2/ecadd_report.csv',\n", + " './tests/gas_reports_2/secp256k1verify_report.csv',\n", + " './tests/gas_reports_2/ecpairing_report.csv',\n", + " './tests/gas_reports_2/p256verify_report.csv',\n", + " './tests/gas_reports_2/ecmul_report.csv',\n", + " './tests/gas_reports_3/modexp_report.csv',\n", + " './tests/gas_reports_3/ecadd_report.csv',\n", + " './tests/gas_reports_3/secp256k1verify_report.csv',\n", + " './tests/gas_reports_3/ecpairing_report.csv',\n", + " './tests/gas_reports_3/p256verify_report.csv',\n", + " './tests/gas_reports_3/ecmul_report.csv']" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "files" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "id": "bc1f5c52-4184-46ed-a8a7-95612976c1eb", + "metadata": {}, + "outputs": [ + { + "ename": "KeyError", + "evalue": "'test_case'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m/var/folders/qq/tjw4v_0515s8j5vpc05g5hk80000gn/T/ipykernel_16452/1116867137.py\u001b[0m in \u001b[0;36m?\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfile\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mfiles\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0mdf\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfile\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mskipinitialspace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m'test'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'gas'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mcombined_df\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmerge\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcombined_df\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mon\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'test_case'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhow\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'outer'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/pandas/core/reshape/merge.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0mvalidate\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mvalidate\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 166\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 167\u001b[0m )\n\u001b[1;32m 168\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 169\u001b[0;31m op = _MergeOperation(\n\u001b[0m\u001b[1;32m 170\u001b[0m \u001b[0mleft_df\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 171\u001b[0m \u001b[0mright_df\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 172\u001b[0m \u001b[0mhow\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhow\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/pandas/core/reshape/merge.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, indicator, validate)\u001b[0m\n\u001b[1;32m 787\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mright_join_keys\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 788\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin_names\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 789\u001b[0m \u001b[0mleft_drop\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 790\u001b[0m \u001b[0mright_drop\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 791\u001b[0;31m ) = self._get_merge_keys()\n\u001b[0m\u001b[1;32m 792\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 793\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mleft_drop\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 794\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mleft\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_drop_labels_or_levels\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mleft_drop\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/pandas/core/reshape/merge.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1265\u001b[0m \u001b[0;31m# Then we're either Hashable or a wrong-length arraylike,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1266\u001b[0m \u001b[0;31m# the latter of which will raise\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1267\u001b[0m \u001b[0mrk\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcast\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mHashable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1268\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrk\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1269\u001b[0;31m \u001b[0mright_keys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_label_or_level_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1270\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1271\u001b[0m \u001b[0;31m# work-around for merge_asof(right_index=True)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1272\u001b[0m \u001b[0mright_keys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mright\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_values\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/opt/homebrew/lib/python3.11/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m?\u001b[0;34m(self, key, axis)\u001b[0m\n\u001b[1;32m 1840\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mother_axes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_values\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1841\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_is_level_reference\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1842\u001b[0m \u001b[0mvalues\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_level_values\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_values\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1843\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1844\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1845\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1846\u001b[0m \u001b[0;31m# Check for duplicates\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1847\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndim\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mKeyError\u001b[0m: 'test_case'" + ] + } + ], + "source": [ + "for file in files:\n", + " df = pd.read_csv(file, skipinitialspace=True)\n", + " df.columns = ['test', 'gas']\n", + " combined_df = pd.merge(combined_df, df, on='test', how='outer')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "99b29636-d67b-4210-b96c-00c831c40959", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
testgas
0ecmul_0_0_0_21000_9654546
1ecmul_0_0_0_21000_6454546
2ecmul_0_0_0_21000_054528
3ecmul_0_0_0_21000_4054546
4ecmul_0_0_0_21000_12854546
.........
113ecmul_7827_6598_9935_28000_128754734
114ecmul_7827_6598_9_21000_12896822
115ecmul_7827_6598_9_21000_9696822
116ecmul_7827_6598_9_28000_12896822
117ecmul_7827_6598_9_28000_9696822
\n", + "

118 rows × 2 columns

\n", + "
" + ], + "text/plain": [ + " test gas\n", + "0 ecmul_0_0_0_21000_96 54546\n", + "1 ecmul_0_0_0_21000_64 54546\n", + "2 ecmul_0_0_0_21000_0 54528\n", + "3 ecmul_0_0_0_21000_40 54546\n", + "4 ecmul_0_0_0_21000_128 54546\n", + ".. ... ...\n", + "113 ecmul_7827_6598_9935_28000_128 754734\n", + "114 ecmul_7827_6598_9_21000_128 96822\n", + "115 ecmul_7827_6598_9_21000_96 96822\n", + "116 ecmul_7827_6598_9_28000_128 96822\n", + "117 ecmul_7827_6598_9_28000_96 96822\n", + "\n", + "[118 rows x 2 columns]" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e363a524-74cc-4721-a2f4-4fd161388cf3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/gas_reports.py b/gas_reports.py index b44c6373..e14fba06 100755 --- a/gas_reports.py +++ b/gas_reports.py @@ -5,7 +5,7 @@ import time def main(): - optimization = ["2"] + optimization = ["z"] headers = { # Already added when you pass json= @@ -20,7 +20,7 @@ def main(): } for opt in optimization: - popen = subprocess.Popen(["make", "run", "OTP={opt}"]) + popen = subprocess.Popen(["make", "run", f"OPT={opt}"]) while True: try: response = requests.post('http://localhost:8011', headers=headers, json=json_data) @@ -31,6 +31,8 @@ def main(): time.sleep(5) subprocess.run(["make", "test"]) subprocess.run(["mv", "./tests/gas_reports", f"./tests/gas_reports_{opt}"]) + + popen.kill() if __name__ == '__main__': main() diff --git a/scripts/verify_playground.py b/scripts/verify_playground.py new file mode 100644 index 00000000..6116c1a6 --- /dev/null +++ b/scripts/verify_playground.py @@ -0,0 +1,22 @@ +t0 = "17e2abeac82f76497d4db6d47356d29014f743e7185cd518ed3680ab0c98855f" +t1 = "f43d8c4297bbbd84ad63da6edfa2bebc1fd103f32881337f3bbd16b9b3b9875a" + +t0 = "000" + bin(int(t0, 16))[2:] +t1 = bin(int(t1, 16))[2:] + +print(len(t0)) +print(len(t1)) + +print(t0) +print(t1) + +for i in range(len(t0)): + print((int(t0[i]) * 2) + int(t1[i])) + + +21:34:25 [INFO] d466d1ccec6839e2255966b7cbe9f7163c31fdfd39c74252489115c4815256ff +21:34:25 [INFO] a90158693a6dd13f31b3c5a45d7aadc393da920bfbc7b964bd2bc952fb239729 +21:34:25 [INFO] 35d402a40b6af63efda9830b825ceb1863cadbcd996e7d55020a874a5441f58b +21:34:25 [INFO] d466d1ccec6839e2255966b7cbe9f7163c31fdfd39c74252489115c4815256ff +21:34:25 [INFO] a90158693a6dd13f31b3c5a45d7aadc393da920bfbc7b964bd2bc952fb239729 +21:34:25 [INFO] 35d402a40b6af63efda9830b825ceb1863cadbcd996e7d55020a874a5441f58b diff --git a/submodules/era-test-node b/submodules/era-test-node index ee573fcc..b83c41a0 160000 --- a/submodules/era-test-node +++ b/submodules/era-test-node @@ -1 +1 @@ -Subproject commit ee573fccd0d22480f1686f076c6afffb080eb78d +Subproject commit b83c41a0a75d72c87f3743914664f591c5a93e52 diff --git a/test_results.ipynb b/test_results.ipynb new file mode 100644 index 00000000..a48f6c12 --- /dev/null +++ b/test_results.ipynb @@ -0,0 +1,932 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "2e8df45a-6df7-40c6-9daf-481e83094e56", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import numpy as np\n", + "import pandas as pd\n", + "import glob\n", + "\n", + "data = {}\n", + "precompiles = [\"ecadd\", \"ecmul\",\"ecpairing\", \"p256verify\", \"secp256k1verify\"]\n", + "optimizations = [2,3,\"s\",\"z\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "7a26728e-ea2e-488f-849d-81d47a7b338a", + "metadata": {}, + "outputs": [], + "source": [ + "for precompile in precompiles:\n", + " data[precompile] = pd.DataFrame(columns=['test', ''])\n", + " for optimization in optimizations:\n", + " file = f\"./tests/gas_reports_{optimization}/{precompile}_report.csv\"\n", + " df = pd.read_csv(file, skipinitialspace=True)\n", + " df.rename(columns = {'gas':f\"{optimization}\"}, inplace=True)\n", + " data[precompile] = pd.merge(data[precompile], df, on='test', how='outer')\n", + " data[precompile].drop([''], axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "472194b0-c923-4b8a-b06e-027d71f7713c", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAABKUAAASlCAYAAAB5vWpLAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACbi0lEQVR4nOzdd5gV5fk/4GdpS0fqUkTAXkEiEVGxoogIYolYIog9ikGJMRITEBvGQtCAEGMANaBYosagICKEr4oNxWhUlEiLUkWKKIvuzu8Pf5xkXVBWd+fAct/XNdfleeedmecM8uzyOTNzcpIkSQIAAAAAUlQh2wUAAAAAsP0RSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSkE5l5OTE9dee+13zrv22msjJyen7AsCICumT58eOTk5MX369GyXAkBEjB07NnJycmL+/PlbNL9ly5ZxzjnnlGlNkDahFAAAAACpq5TtAgAAAGB7c/bZZ8fpp58eubm5WzR/zpw5UaGC60ooX4RSAAAAkLKKFStGxYoVv3VOkiSxfv36qFat2haHV7AtEbNCGfnoo4/i3HPPjby8vMjNzY199tknRo8eXWTO+vXr49prr43dd989qlatGk2aNImTTz45/v3vf2fm3HbbbXHwwQdH/fr1o1q1anHAAQfEI488Uux4+fn5ccUVV0TDhg2jVq1a0b179/jPf/6zydqef/75+PGPfxxVq1aNXXbZJf74xz+W7psH2A6URp+fP39+5OTkxG233RYjRoyInXfeOapXrx7HHntsLFq0KJIkieuvvz523HHHqFatWpx44omxcuXKIsfY3LMDPXsE4Gul3a9///vfR4sWLaJatWpx+OGHx9tvv11kX//85z/jnHPOiZ133jmqVq0ajRs3jnPPPTc++eSTIvM29Uypli1bxgknnBCTJ0+Odu3aRbVq1TK/q3+zr2/c/oUXXoj+/ftHw4YNo0aNGnHSSSfF8uXLixyrsLAwrr322mjatGlUr149jjzyyHjnnXf8rCDrXCkFZWDp0qVx0EEHRU5OTvTt2zcaNmwYTz/9dJx33nmxZs2auPzyy6OgoCBOOOGEmDp1apx++unRr1+/WLt2bUyZMiXefvvt2GWXXSIi4o477oju3bvHWWedFRs2bIgHH3wwfvKTn8Tf//736Nq1a+aY559/fvzlL3+JM888Mw4++OB47rnniqzf6K233opjjz02GjZsGNdee2189dVXMWjQoMjLy0vt/ABs60qzz0dEjBs3LjZs2BCXXXZZrFy5Mm655ZY47bTT4qijjorp06fHr371q5g7d2784Q9/iCuvvLLYP6YA2LTS7tf33XdfrF27Ni699NJYv3593HHHHXHUUUfFW2+9lfl9esqUKfHhhx9Gnz59onHjxvGvf/0r7r777vjXv/4VL7300nd+udCcOXPijDPOiIsuuiguuOCC2GOPPb51/mWXXRZ169aNQYMGxfz582PYsGHRt2/fmDBhQmbOgAED4pZbbolu3bpF586d480334zOnTvH+vXrf8DZhVKQAKXuvPPOS5o0aZKsWLGiyPjpp5+e1KlTJ/n888+T0aNHJxGRDB06tNj2hYWFmf/+/PPPi6zbsGFDsu+++yZHHXVUZmz27NlJRCSXXHJJkblnnnlmEhHJoEGDMmM9evRIqlatmixYsCAz9s477yQVK1ZMtASALVNafX7evHlJRCQNGzZMVq1alVk/YMCAJCKSNm3aJF9++WVm/IwzzkiqVKmSrF+/PjP2zT6/UYsWLZLevXtnXk+bNi2JiGTatGnf810DbHtKu19Xq1Yt+c9//pNZ//LLLycRkVxxxRWZsW/+/p4kSfLAAw8kEZHMmDEjMzZmzJgkIpJ58+Zlxlq0aJFERDJp0qRi+/hmX9+4fadOnYr8++GKK65IKlasmPm5smTJkqRSpUpJjx49iuzv2muvTSKiyD4hbW7fg1KWJEk8+uij0a1bt0iSJFasWJFZOnfuHKtXr47XX389Hn300WjQoEFcdtllxfbxv5+eVKtWLfPfn376aaxevTo6duwYr7/+emb8qaeeioiIn//850X2c/nllxd5XVBQEJMnT44ePXrETjvtlBnfa6+9onPnzj/ofQNsL0q7z0dE/OQnP4k6depkXrdv3z4iIn76059GpUqVioxv2LAhPvroozJ6dwDlR1n06x49ekSzZs0yrw888MBo37595vfxiKK/v69fvz5WrFgRBx10UEREkd/hN6dVq1Yl+t38wgsvLFJnx44do6CgIBYsWBAREVOnTo2vvvoqLrnkkiLbber9Qtq261BqxowZ0a1bt2jatGnk5OTE448/XqLtr7322sjJySm21KhRo2wKZpuwfPnyWLVqVdx9993RsGHDIkufPn0iImLZsmXx73//O/bYY48i/9jYlL///e9x0EEHRdWqVaNevXrRsGHDGDlyZKxevTozZ8GCBVGhQoUilxZHRLFLfZcvXx5ffPFF7LbbbsWO812XBQPwtdLu8xFR5IOCiMgEVM2bN9/k+KeffloabwWgXCuLfr2p36N33333Is+FWrlyZfTr1y/y8vKiWrVq0bBhw2jVqlVERJHf4Tdn49wt9c2fIXXr1o2I//6s2BhO7brrrkXm1atXLzMXsmW7fqbUunXrok2bNnHuuefGySefXOLtr7zyyrj44ouLjB199NHx4x//uLRKZBtUWFgYEV9/ut27d+9NzmnduvUW7ev//u//onv37nHYYYfFXXfdFU2aNInKlSvHmDFjYvz48aVWMwBbrjT7/Eab+/alzY0nSfKd+ywoKChRDQDlTVn06y1x2mmnxYsvvhi//OUvY//994+aNWtGYWFhHHfccZmavs3/Xmm1JX7IzwrItu06lOrSpUt06dJls+vz8/PjmmuuiQceeCBWrVoV++67b/zud7+LI444IiIiatasGTVr1szMf/PNN+Odd96JUaNGlXXpbMU2fvtdQUFBdOrUabPzdtlll3j55Zfjyy+/jMqVK29yzqOPPhpVq1aNyZMnF/kK2DFjxhSZ16JFiygsLMx8yrPRnDlzitVWrVq1+OCDD4od65tzAdi00uzzpaFu3bqxatWqImMbNmyIxYsXl9kxAbYFZdGvN/V79Pvvvx8tW7aMiK+vTpo6dWoMHjw4Bg4c+K3bpaVFixYRETF37twiV2F98sknrrwl67br2/e+S9++fWPmzJnx4IMPxj//+c/4yU9+Escdd9xmG8o999wTu+++e3Ts2DHlStmaVKxYMU455ZR49NFHi309bERkvp71lFNOiRUrVsTw4cOLzdn4qUbFihUjJyenyKfd8+fPL3ar6cZw9c477ywyPmzYsGK1de7cOR5//PFYuHBhZvzdd9+NyZMnb/mbBNiOlWafLw277LJLzJgxo8jY3Xff7UopYLtXFv368ccfL/Jcv1deeSVefvnlzO/jG69a+uZ23/y9PE1HH310VKpUKUaOHFlkfFPvF9K2XV8p9W0WLlwYY8aMiYULF0bTpk0j4uvb9SZNmhRjxoyJm266qcj89evXx7hx4+Lqq6/ORrlsZW6++eaYNm1atG/fPi644ILYe++9Y+XKlfH666/Hs88+GytXroxevXrFfffdF/37949XXnklOnbsGOvWrYtnn302LrnkkjjxxBOja9euMXTo0DjuuOPizDPPjGXLlsWIESNi1113jX/+85+Z4+2///5xxhlnxF133RWrV6+Ogw8+OKZOnRpz584tVtvgwYNj0qRJ0bFjx7jkkkviq6++ij/84Q+xzz77FNknAJtXWn2+NJx//vlx8cUXxymnnBLHHHNMvPnmmzF58uRo0KBBqewfYFtW2v161113jUMPPTR+9rOfRX5+fgwbNizq168fV111VURE1K5dOw477LC45ZZb4ssvv4xmzZrFM888E/PmzcvWKYi8vLzo169f3H777dG9e/c47rjj4s0334ynn346GjRoUOxh7pAmodRmvPXWW1FQUBC77757kfH8/PyoX79+sfmPPfZYrF27drP3KrN9ycvLi1deeSWuu+66+Otf/xp33XVX1K9fP/bZZ5/43e9+FxFff4ry1FNPxY033hjjx4+PRx99NOrXrx+HHnpo7LfffhERcdRRR8Wf//znuPnmm+Pyyy+PVq1axe9+97uYP39+sQBp9OjR0bBhwxg3blw8/vjjcdRRR8XEiROLPSS3devWMXny5Ojfv38MHDgwdtxxxxg8eHAsXrxYKAWwhUqrz5eGCy64IObNmxd//vOfMx86TJkyJY4++uhSOwbAtqq0+3WvXr2iQoUKMWzYsFi2bFkceOCBMXz48GjSpElmzvjx4+Oyyy6LESNGRJIkceyxx8bTTz+dudghG373u99F9erV409/+lM8++yz0aFDh3jmmWfi0EMPjapVq2atLshJPP0sIr7+qs/HHnssevToEREREyZMiLPOOiv+9a9/FXtwXM2aNaNx48ZFxo4++uioXbt2PPbYY2mVDAAAQArmz58frVq1iltvvTWuvPLKbJdTKlatWhV169aNG264Ia655ppsl8N2ypVSm9G2bdsoKCiIZcuWfeczoubNmxfTpk2Lv/3tbylVBwAAAFvmiy++KPatfhufc7Xxi7wgG7brUOqzzz4r8sydefPmxezZs6NevXqx++67x1lnnRW9evWK22+/Pdq2bRvLly+PqVOnRuvWraNr166Z7UaPHh1NmjT51m/yAwAAgGyYMGFCjB07No4/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jRo1irvvvjsOOOCA6NmzZ1xzzTUxatSozW4zYMCAWL16dWZZtGhRmdYIQLr0eYDyTZ8HKL9K/EypKlWqxOeffx4REc8++2z06tUrIiLq1atXoktpGzRoEBUrVoylS5cWGV+6dGk0btx4k9s0adIkKleuHBUrVsyM7bXXXrFkyZLYsGFDVKlSpdg2ubm5kZubu8V1AbBt0ecByjd9HqD8KvGVUoceemj0798/rr/++njllVeia9euERHx/vvvx4477rjF+6lSpUoccMABMXXq1MxYYWFhTJ06NTp06LDJbQ455JCYO3duFBYWZsbef//9aNKkySYDKQAAAAC2TiUOpYYPHx6VKlWKRx55JEaOHBnNmjWLiIinn346jjvuuBLtq3///vGnP/0p7r333nj33XfjZz/7Waxbty7zbXy9evWKAQMGZOb/7Gc/i5UrV0a/fv3i/fffj4kTJ8ZNN90Ul156aUnfBgAAAABZVOLb93baaaf4+9//Xmz897//fYkP3rNnz1i+fHkMHDgwlixZEvvvv39MmjQp8/DzhQsXRoUK/83NmjdvHpMnT44rrrgiWrduHc2aNYt+/frFr371qxIfGwAAAIDsKXEo9b/Wr18fGzZsKDJWu3btEu2jb9++0bdv302umz59erGxDh06xEsvvVSiYwAAAACwdSnx7Xvr1q2Lvn37RqNGjaJGjRpRt27dIgsAAAAAfJcSh1JXXXVVPPfcczFy5MjIzc2Ne+65JwYPHhxNmzaN++67ryxqBAAAAKCcKfHte08++WTcd999ccQRR0SfPn2iY8eOseuuu0aLFi1i3LhxcdZZZ5VFnQAAAACUIyW+UmrlypWx8847R8TXz49auXJlREQceuihMWPGjNKtDgAAAIByqcSh1M477xzz5s2LiIg999wzHnrooYj4+gqqHXbYoVSLAwAAAKB8KnEo1adPn3jzzTcjIuLqq6+OESNGRNWqVeOKK66IX/7yl6VeIAAAAADlT4mfKXXFFVdk/rtTp07x3nvvxaxZs2LXXXeN1q1bl2pxAAAAAJRPJQ6lvqlFixbRokWL0qgFAAAAgO3EFodSX3zxRUydOjVOOOGEiIgYMGBA5OfnZ9ZXrFgxrr/++qhatWrpVwkAAABAubLFodS9994bEydOzIRSw4cPj3322SeqVasWERHvvfdeNG3atMjtfQAAAACwKVv8oPNx48bFhRdeWGRs/PjxMW3atJg2bVrceuutmW/iAwAAAIBvs8Wh1Ny5c2O//fbLvK5atWpUqPDfzQ888MB45513Src6AAAAAMqlLb59b9WqVUWeIbV8+fIi6wsLC4usBwAAAIDN2eIrpXbcccd4++23N7v+n//8Z+y4446lUhQAAAAA5dsWh1LHH398DBw4MNavX19s3RdffBGDBw+Orl27lmpxAAAAAJRPW3z73q9//et46KGHYo899oi+ffvG7rvvHhERc+bMieHDh8dXX30Vv/71r8usUAAAAADKjy0OpfLy8uLFF1+Mn/3sZ3H11VdHkiQREZGTkxPHHHNM3HXXXZGXl1dmhQIAAABQfmxxKBUR0apVq5g0aVKsXLky5s6dGxERu+66a9SrV69MigMAAACgfCpRKLVRvXr14sADDyztWgAAAADYTmzxg84BAAAAoLQIpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABInVAKAAAAgNQJpQAAAABI3VYRSo0YMSJatmwZVatWjfbt28crr7yyRds9+OCDkZOTEz169CjbAgEAAAAoVVkPpSZMmBD9+/ePQYMGxeuvvx5t2rSJzp07x7Jly751u/nz58eVV14ZHTt2TKlSAAAAAEpL1kOpoUOHxgUXXBB9+vSJvffeO0aNGhXVq1eP0aNHb3abgoKCOOuss2Lw4MGx8847p1gtAAAAAKUhq6HUhg0bYtasWdGpU6fMWIUKFaJTp04xc+bMzW533XXXRaNGjeK88877zmPk5+fHmjVriiwAlB/6PED5ps8D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1atXxyOPPBK9e/eOf/zjH7H33ntnu7RtXps2beLoo4+O/fbbLzp37hzHHntsnHrqqVG3bt1sl1bunHvuubF27dqYMmXKdvcDrDzR58uGPl929Pn06PPlgz5fNvT5sqPPp2d77/OulNrK9e3bN5544omYMWPGJu85pfR06tQpdtlll/jjH/+Y7VLKhSRJ4sUXX4xnnnkmHnvssViyZEm8/PLL/j8uRTfccEP8/ve/j1deeSV22WWXbJfD96TPp0efL136fNnT58sHfT49+nzp0ufLnj7v2/e2WkmSRN++feOxxx6L5557zl/8FBQWFkZ+fn62yyg3cnJy4pBDDonBgwfHG2+8EVWqVInHHnss22WVG48++mhcd9118dBDD223P8C2dfp8+vT50qXPly19ftunz6dPny9d+nzZ0ue/5va9rdSll14a48ePjyeeeCJq1aoVS5YsiYiIOnXqRLVq1bJc3bZvwIAB0aVLl9hpp51i7dq1MX78+Jg+fXpMnjw526WVCy+//HJMnTo1jj322GjUqFG8/PLLsXz58thrr72yXVq58Pbbb0evXr3iV7/6Veyzzz6Z/lClShUPT92G6PNlS58vW/p82dLnywd9vmzp82VLny9b+vz/SNgqRcQmlzFjxmS7tHLh3HPPTVq0aJFUqVIladiwYXL00UcnzzzzTLbLKjfeeeedpHPnzknDhg2T3NzcZPfdd0/+8Ic/ZLuscmPMmDGb7A+HH354tkujBPT5sqXPly19vmzp8+WDPl+29Pmypc+XLX3+vzxTCgAAAIDUeaYUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUpODaa6+N/fff/wftY/78+ZGTkxOzZ88ulZo254gjjojLL7+8TI8BUN7o8wDlmz4PZSMnSZIk20XA1mDRokUxaNCgmDRpUqxYsSKaNGkSPXr0iIEDB0b9+vW3eD85OTnx2GOPRY8ePTJjn332WeTn55doP99UUFAQy5cvjwYNGkSlSpW+9342mj59ehx55JHx6aefxg477JAZX7lyZVSuXDlq1ar1g48BsDXR57+mzwPllT7/NX2ebYkrpSAiPvzww2jXrl188MEH8cADD8TcuXNj1KhRMXXq1OjQoUOsXLnyB+2/Zs2aP+gHWERExYoVo3HjxqXyA+zb1KtXzw8woNzR5/9LnwfKI33+v/R5tikJkBx33HHJjjvumHz++edFxhcvXpxUr149ufjii5MkSZIWLVok1113XXL66acn1atXT5o2bZoMHz48M79FixZJRGSWFi1aJEmSJIMGDUratGmTmde7d+/kxBNPTG688cakUaNGSZ06dZLBgwcnX375ZXLllVcmdevWTZo1a5aMHj06s828efOSiEjeeOONzD7+91gbl2nTpiVJkiT33XdfcsABByQ1a9ZM8vLykjPOOCNZunRpkX3979K7d+8kSZLk8MMPT/r165c57sqVK5Ozzz472WGHHZJq1aolxx13XPL+++9n1o8ZMyapU6dOMmnSpGTPPfdMatSokXTu3Dn5+OOPf8gfCUCp0uf1eaB80+f1ebZNrpRiu7dy5cqYPHlyXHLJJVGtWrUi6xo3bhxnnXVWTJgwIZL/f6frrbfeGm3atIk33ngjrr766ujXr19MmTIlIiJeffXViIgYM2ZMLF68OPN6U5577rn4+OOPY8aMGTF06NAYNGhQnHDCCVG3bt14+eWX4+KLL46LLroo/vOf/2xy+zvuuCMWL16cWfr16xeNGjWKPffcMyIivvzyy7j++uvjzTffjMcffzzmz58f55xzTkRENG/ePB599NGIiJgzZ04sXrw47rjjjk0e55xzzonXXnst/va3v8XMmTMjSZI4/vjj48svv8zM+fzzz+O2226L+++/P2bMmBELFy6MK6+88rtOPUAq9Hl9Hijf9Hl9nm1YNhMx2Bq89NJLSUQkjz322CbXDx06NImIZOnSpUmLFi2S4447rsj6nj17Jl26dMm83tS+NvXJSosWLZKCgoLM2B577JF07Ngx8/qrr75KatSokTzwwANJkhT/ZOV/Pfroo0nVqlWT559/frPv89VXX00iIlm7dm2SJEkybdq0JCKSTz/9tMi8//1k5f33308iInnhhRcy61esWJFUq1Yteeihh5Ik+fqTlYhI5s6dm5kzYsSIJC8vb7O1AKRJn/+0yDx9Hihv9PlPi8zT59mWuFIK/r9kC5/536FDh2Kv33333RIfb5999okKFf77VzAvLy/222+/zOuKFStG/fr1Y9myZd+6nzfeeCPOPvvsGD58eBxyyCGZ8VmzZkW3bt1ip512ilq1asXhhx8eERELFy7c4hrffffdqFSpUrRv3z4zVr9+/dhjjz2KvOfq1avHLrvsknndpEmT76wbIG36fHH6PFCe6PPF6fNs7YRSbPd23XXXyMnJ2ewPonfffTfq1q0bDRs2LNXjVq5cucjrnJycTY4VFhZudh9LliyJ7t27x/nnnx/nnXdeZnzdunXRuXPnqF27dowbNy5effXVeOyxxyIiYsOGDaX4Lr62qbq39JcCgLKmz/9w+jywNdPnfzh9nmwRSrHdq1+/fhxzzDFx1113xRdffFFk3ZIlS2LcuHHRs2fPyMnJiYiIl156qcicl156Kfbaa6/M68qVK0dBQUGZ171+/fo48cQTY88994yhQ4cWWffee+/FJ598EjfffHN07Ngx9txzz2KfdFSpUiUi4ltr3WuvveKrr76Kl19+OTP2ySefxJw5c2LvvfcuxXcDUHb0eX0eKN/0eX2ebZdQCiJi+PDhkZ+fH507d44ZM2bEokWLYtKkSXHMMcdEs2bN4sYbb8zMfeGFF+KWW26J999/P0aMGBEPP/xw9OvXL7O+ZcuWMXXq1FiyZEl8+umnZVbzRRddFIsWLYo777wzli9fHkuWLIklS5bEhg0bYqeddooqVarEH/7wh/jwww/jb3/7W1x//fVFtm/RokXk5OTE3//+91i+fHl89tlnxY6x2267xYknnhgXXHBBPP/88/Hmm2/GT3/602jWrFmceOKJZfbeAEqbPq/PA+WbPq/Ps20SSkF83axfe+212HnnneO0006LXXbZJS688MI48sgjY+bMmVGvXr3M3F/84hfx2muvRdu2beOGG26IoUOHRufOnTPrb7/99pgyZUo0b9482rZtW2Y1/+Mf/4jFixfH3nvvHU2aNMksL774YjRs2DDGjh0bDz/8cOy9995x8803x2233VZk+2bNmsXgwYPj6quvjry8vOjbt+8mjzNmzJg44IAD4oQTTogOHTpEkiTx1FNPFbvEF2Brps/r80D5ps/r82ybchI3isIWa9myZVx++eVx+eWXZ7sUAMqAPg9QvunzsHVxpRQAAAAAqRNKAQAAAJA6t+8BAAAAkDpXSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUUMz06dMjJycnpk+fXmT8/vvvjz333DMqV64cO+ywQ1ZqA9hebOzFjzzySLZL+V6OOOKIOOKII4qMLV26NE499dSoX79+5OTkxLBhw7JSGwCwdRBKwRb6/PPPY8SIEXHsscdGkyZNolatWtG2bdsYOXJkFBQUFJk7f/78yMnJ2eTy4IMPFtt3YWFhjBw5Mvbff/+oVq1a1K9fP4466qh4880303p73+m9996Lc845J3bZZZf405/+FHfffXe2SwIoU4WFhTF27Njo3r17NG/ePGrUqBH77rtv3HDDDbF+/fpi8zfX92+++eZN7n/ChAnRoUOHqFGjRuywww5x8MEHx3PPPVfiOj/77LMYNGhQHHfccVGvXr3IycmJsWPHlng/abjiiiti8uTJMWDAgLj//vvjuOOOy3ZJAEAWVcp2AbCt+PDDD+Oyyy6Lo48+Ovr37x+1a9eOyZMnxyWXXBIvvfRS3HvvvcW2OeOMM+L4448vMtahQ4di884999wYN25c9OrVK/r27Rvr1q2LN954I5YtW1Zm7+fbHHbYYfHFF19ElSpVMmPTp0+PwsLCuOOOO2LXXXfNSl0Aafr888+jT58+cdBBB8XFF18cjRo1ipkzZ8agQYNi6tSp8dxzz0VOTk6RbY455pjo1atXkbG2bdsW2/e1114b1113XZx66qlxzjnnxJdffhlvv/12fPTRRyWuc8WKFXHdddfFTjvtFG3atCl2lWu2PPPMM8XGnnvuuTjxxBPjyiuvzEJFAMDWRigFW6hx48bx1ltvxT777JMZu+iii+Lcc8+NMWPGxG9/+9tiYc2PfvSj+OlPf/qt+33ooYfi3nvvjb/+9a9x0kknlUntW2r9+vVRpUqVqFChQlStWrXIuo0Bmdv2gO1FlSpV4oUXXoiDDz44M3bBBRdEy5YtM8FUp06dimyz++67f2fff+mll+K6666L22+/Pa644oofXGeTJk1i8eLF0bhx43jttdfixz/+8Q/e5w/x+eefR/Xq1Yt8sLHRsmXL/BwBADLcvgfx9SfWOTk58d5778Vpp50WtWvXjvr160e/fv0yt2g0aNCgSCC10cYg6d13393kvtetWxcbNmzY7LGHDh0aBx54YJx00klRWFgY69atKzbntddei5ycnE1ejTV58uTIycmJv//975mxjz76KM4999zIy8uL3Nzc2GeffWL06NFFttv4rJIHH3wwfvOb30SzZs2ievXqsWbNmmLPlNr4D7CIiIYNG0ZOTk4MGjQoWrZsGSeeeGKxmtavXx916tSJiy66aLPvG+B/rV27Ni6//PJo2bJl5ObmRqNGjeKYY46J119/PTPn5ZdfjuOOOy7q1KkT1atXj8MPPzxeeOGFYvv66KOP4rzzzoumTZtGbm5utGrVKn72s59levHYsWMjJycnZsyYERdddFHUr18/ateuHb169YpPP/00s58qVaoUCaQ2+q6+/8UXX2zy9r6Nhg0bFo0bN45+/fpFkiTx2WefbdlJioj8/Pw44YQTok6dOvHiiy9GRERubm40btz4O7c94YQTYuedd97kug4dOkS7du2KjP3lL3+JAw44IKpVqxb16tWL008/PRYtWlRkzhFHHBH77rtvzJo1Kw477LCoXr16/PrXv86s2/hMqY3nPEmSGDFiRObWxjFjxkROTk688cYbxWq66aabomLFit/r6jEAYNsglIL/cdppp8X69etjyJAhcfzxx8edd94ZF1544bdus2TJkoj4OrT6psGDB0fNmjWjatWq8eMf/7jYrQxr1qyJV155JX784x/Hr3/966hTp07UrFkzdt5553jooYcy89q1a1dsbKMJEyZE3bp1o3PnzhHx9UNkDzrooHj22Wejb9++mdvtzjvvvE0+UPb666+PiRMnxpVXXhk33XTTJj/ZHjZsWOYfYSNHjoz7778/TjnllPjpT38aTz/9dKxcubLI/CeffDLWrFnznVcLAGx08cUXx8iRI+OUU06Ju+66K6688sqoVq1aJvh57rnn4rDDDos1a9bEoEGD4qabbopVq1bFUUcdFa+88kpmPx9//HEceOCB8eCDD0bPnj3jzjvvjLPPPjv+8Y9/xOeff17kmH379o133303rr322ujVq1eMGzcuevToEUmSfGut39b3x44dGzVq1Ihq1arF3nvvHePHjy82Z+rUqfHjH/847rzzzmjYsGHUqlUrmjRpEsOHD//W437xxRfRrVu3ePHFF+PZZ5/dZGD2bXr27Bnz5s2LV199tcj4ggUL4qWXXorTTz89M3bjjTdGr169YrfddouhQ4fG5ZdfHlOnTo3DDjssVq1aVWT7Tz75JLp06RL7779/DBs2LI488shixz7ssMPi/vvvj4ivb3G8//774/77749TTz01qlWrFuPGjSu2zbhx4+KII46IZs2aleh9AgDbkARIBg0alERE0r179yLjl1xySRIRyZtvvrnJ7fLz85O99947adWqVfLll19mxhcsWJAce+yxyciRI5O//e1vybBhw5KddtopqVChQvL3v/89M+/1119PIiKpX79+kpeXl9x1113JuHHjkgMPPDDJyclJnn766czcAQMGJJUrV05WrlxZ5Pg77LBDcu6552bGzjvvvKRJkybJihUritR6+umnJ3Xq1Ek+//zzJEmSZNq0aUlEJDvvvHNmbKON66ZNm1bsHC1fvjwzNmfOnCQikpEjRxbZvnv37knLli2TwsLCTZ43gG+qU6dOcumll25yXWFhYbLbbrslnTt3LtJXPv/886RVq1bJMccckxnr1atXUqFCheTVV1/d5H6SJEnGjBmTRERywAEHJBs2bMisv+WWW5KISJ544olvrbVTp05J7dq1k08//bTI+MEHH5wMGzYseeKJJ5KRI0cm++67bxIRyV133ZWZs3Llykzfr1mzZnLrrbcmEyZMSI477rgkIpJRo0Zl5m7sxQ8//HCydu3a5PDDD08aNGiQvPHGG5ut7dVXX00iIhkzZkyxdatXr05yc3OTX/ziF0XGb7nlliQnJydZsGBBkiRJMn/+/KRixYrJjTfeWGTeW2+9lVSqVKnI+OGHH16s7v9dd/jhhxcZi4hif85nnHFG0rRp06SgoCAztvHn46beBwBQfgilIPlv4DJ58uQi4++++24SEcmQIUM2ud0FF1yQREQyceLE7zzGJ598kuTl5SV77LFHZmzGjBlJRCQRkbz00kuZ8bVr1yYNGjRIDjnkkMzY7Nmzk4hI7rnnnszYk08+WaTuwsLCZIcddkguvPDCZPny5UWWjf8Ie/7555Mk+e8/dgYPHlys1i0NpZIkSdq3b58ceuihRd5n5cqVk2uuueY7zwnARi1atEjatWuXfPTRR8XWbQwo7r333mK97fzzz09yc3OTgoKCpKCgIKldu3Zy4oknfuuxNvbDP/7xj0XG165dm1SqVCm56KKLNrvtjTfeWCxo2pz8/Pxk3333TXbYYYdM+L9w4cJM33/wwQczcwsKCpK999472XHHHTNjG3vxPffck3To0CHJy8tL3n777W895reFUkmSJD169EiaN29eJNw74IADkg4dOmReDx06NMnJyUk++OCDYud7r732Sjp16pSZe/jhhye5ublJfn5+sWNtaSj19NNPJxGRPPvss5mxX/ziF0m1atWSNWvWfOv7BQC2bW7fg/+x2267FXm9yy67RIUKFWL+/PnF5t56663xpz/9Ka6//vpi37C3KfXq1Ys+ffrEnDlz4j//+U9ERFSrVi0iIlq1ahXt27fPzK1Zs2Z069YtXnnllfjqq68iIqJNmzax5557xoQJEzLzJkyYEA0aNIijjjoqIiKWL18eq1atirvvvjsaNmxYZOnTp09ERLFv9GvVqtV31v5tevXqFS+88EIsWLAgIiIefvjh+PLLL+Pss8/+QfsFti+33HJLvP3229G8efM48MAD49prr40PP/wwIiI++OCDiIjo3bt3sd52zz33RH5+fqxevTqWL18ea9asiX333XeLjvnNnl+zZs1o0qTJJnt+xNc99ze/+U2cd9558bOf/ew791+lSpXo27dvrFq1KmbNmhUR/+37lStXjlNPPTUzt0KFCtGzZ8/4z3/+EwsXLiyyn8svvzxeffXVePbZZzf5bMOS6NmzZyxatChmzpwZERH//ve/Y9asWdGzZ8/MnA8++CCSJInddtut2Pl+9913i/0cadas2SZv/d5SxxxzTDRp0iRzC19hYWE88MADceKJJ0atWrW+934BgK3fdh1KzZgxI7p16xZNmzaNnJycePzxx0u0/caHY39zqVGjRtkUTOq++VXfG40dOzZ+9atfxcUXXxy/+c1vtnh/zZs3j4jIPIOpadOmERGRl5dXbG6jRo3iyy+/LPLg8549e8a0adNixYoVkZ+fH3/729/ilFNOiUqVvv4izcLCwoiI+OlPfxpTpkzZ5HLIIYcUOc7GfyB9X6effnpUrlw584+Jv/zlL9GuXbvYY489ftB+ge3LaaedFh9++GH84Q9/iKZNm8att94a++yzTzz99NOZ3nbrrbdutrfVrFmzTOubMmVK9OrVK7p27RqjRo3a4u2+2ffr1asXVatWjfr160fFihWLzG3UqFFERJGHrUdEnHjiiZEkSdx8882Zc/F9devWLapXr555RuFDDz0UFSpUiJ/85CeZOYWFhZGTkxOTJk3a5Ln+4x//WGSfP/TnSMWKFePMM8+MRx99NNavXx/Tpk2Ljz/+2HMJAWA7UCnbBWTTunXrok2bNnHuuefGySefXOLtr7zyyrj44ouLjB199NFZ/ypmvr8PPvigyJVDc+fOjcLCwmjZsmVm7Iknnojzzz8/Tj755BgxYkSJ9r/xU/+GDRtGxNehVOPGjTf5zUIff/xxVK1atcinxD179ozBgwfHo48+Gnl5ebFmzZoiD6bd+MDcgoKCYl9TXlbq1asXXbt2jXHjxsVZZ50VL7zwwiYfqA7wXZo0aRKXXHJJXHLJJbFs2bL40Y9+FDfeeGP8/ve/j4iI2rVrf2tva9iwYdSuXTvefvvtLTreBx98UOSh3J999lksXry42NWvL7/8cpx00knRrl27eOihhzIfBGyJb/b9ChUqxP777x+vvvpqbNiwocgVRh9//HGRuRv16NEjjj322DjnnHOiVq1aMXLkyC0+/jfVqFEjTjjhhHj44Ydj6NChMWHChOjYsWPmQ5KIr68STpIkWrVqFbvvvvv3PlZJ9OrVK26//fZ48skn4+mnn46GDRtmvsADACi/tusrpbp06RI33HBD5lvFvik/Pz+uvPLKaNasWdSoUSPat28f06dPz6yvWbNmNG7cOLMsXbo03nnnnTjvvPNSegeUtm+GTH/4wx8i4uv/VyK+vrru9NNPj8MOOyzGjRsXFSps+q/Q8uXLi4199NFHMXr06GjdunU0adIkM77xVoopU6ZkxlasWBFPPPFEHHXUUUWOsddee8V+++0XEyZMiAkTJkSTJk3isMMOy6yvWLFinHLKKfHoo49u8h9lm6qrNJx99tnxzjvvxC9/+cuoWLFikaAM4LsUFBTE6tWri4w1atQomjZtGvn5+XHAAQfELrvsErfddlt89tlnxbbf2NsqVKgQPXr0iCeffDJee+21YvOSb3yr3t133x1ffvll5vXIkSPjq6++yvT8iIh33303unbtGi1btoy///3vm70qaFP9de3atTFs2LBo0KBBHHDAAZnxnj17RkFBQdx7772ZsfXr18e4ceNi7733LhIQbdSrV6+48847Y9SoUfGrX/1qkzVsqZ49e8bHH38c99xzT7z55ptFbt2LiDj55JOjYsWKMXjw4GLnLEmS+OSTT37Q8TeldevW0bp167jnnnvi0UcfjdNPP71E4R8AsG3y0/5b9O3bN95555148MEHo2nTpvHYY4/FcccdF2+99Vax51BERNxzzz2x++67R8eOHbNQLaVh3rx50b179zjuuONi5syZ8Ze//CXOPPPMaNOmTSxYsCC6d+8eOTk5ceqpp8bDDz9cZNuNv1BHRFx11VXx73//O44++uho2rRpzJ8/P/74xz/GunXr4o477iiy3YABA+Khhx6KU045Jfr37x916tSJUaNGxZdffhk33XRTsRp79uwZAwcOjKpVq8Z5551XLBi7+eabY9q0adG+ffu44IILYu+9946VK1fG66+/Hs8++2zmFpLS1LVr16hfv348/PDD0aVLl8wtKABbYu3atbHjjjvGqaeeGm3atImaNWvGs88+G6+++mrcfvvtUaFChbjnnnuiS5cusc8++0SfPn2iWbNm8dFHH8W0adOidu3a8eSTT0ZExE033RTPPPNMHH744XHhhRfGXnvtFYsXL46HH344nn/++dhhhx0yx92wYUMcffTRcdppp8WcOXPirrvuikMPPTS6d++eqatz587x6aefxi9/+cuYOHFikbp32WWX6NChQ0R8/aHG448/Ht26dYuddtopFi9eHKNHj46FCxfG/fffX+SKqIsuuijuueeeuPTSS+P999+PnXbaKe6///5YsGBB5n1sSt++fWPNmjVxzTXXRJ06deLXv/51Zt3w4cNj1apVmautnnzyyczzCy+77LKoU6dOZu7xxx8ftWrViiuvvDLzYcY339cNN9wQAwYMiPnz50ePHj2iVq1aMW/evHjsscfiwgsvjCuvvHKL/3y3VK9evTL7deseAGwnsvmU9a1JRCSPPfZY5vWCBQuSihUrFvsWoKOPPjoZMGBAse2/+OKLpG7dusnvfve7si6VMrDxm+Xeeeed5NRTT01q1aqV1K1bN+nbt2/yxRdfJEny329B2twyaNCgzP7Gjx+fHHbYYUnDhg2TSpUqJQ0aNEhOOumkZNasWZs8/r///e/kpJNOSmrXrp1Uq1YtOeqoo5JXXnllk3M/+OCDzDE3fpPeNy1dujS59NJLk+bNmyeVK1dOGjdunBx99NHJ3XffnZnzv181/k0l+fa9jS655JIkIpLx48dvcj3A5uTn5ye//OUvkzZt2iS1atVKatSokbRp06bYN9y98cYbycknn5zUr18/yc3NTVq0aJGcdtppydSpU4vMW7BgQdKrV6+kYcOGSW5ubrLzzjsnl156aeYb4jZ++94//vGP5MILL0zq1q2b1KxZMznrrLOSTz75JLOfefPmfWvf7927d2buM888kxxzzDFJ48aNk8qVKyc77LBDcuyxxxarbaOlS5cmvXv3TurVq5fk5uYm7du3TyZNmlRkzub69FVXXZVERDJ8+PDMWIsWLTZb57x584od/6yzzkoiosg36X3To48+mhx66KFJjRo1kho1aiR77rlncumllyZz5szJzDn88MOTffbZZ5Pbb+m37220ePHipGLFisnuu+++2ZoAgPIlJ0m+cV32dionJycee+yx6NGjR0RETJw4MU444YRiDy3Pz8+Pk08+ucg3oEVEPPDAA9GrV6/4z3/+s8mHVrN1u/baa2Pw4MGxfPnyaNCgQbbL2SZdccUV8ec//zmWLFkS1atXz3Y5AJs1duzY6NOnT7z66qvRrl27bJfD/7dixYpo0qRJDBw4MH77299muxwAIAVu39uMzz77LCpWrBizZs0q9u04m/qGn3vuuSdOOOEEgRTbpfXr18df/vKXOOWUUwRSAHwvY8eOjYKCgjj77LOzXQoAkBKh1Ga0bds2CgoKYtmyZd/5jKh58+bFtGnT4m9/+1tK1cHWYdmyZfHss8/GI488Ep988kn069cv2yUBsI157rnn4p133okbb7wxevToUeQbbwGA8m27DqU+++yzmDt3bub1vHnzYvbs2VGvXr3Yfffd46yzzsp8RXHbtm1j+fLlMXXq1GjdunV07do1s93o0aOjSZMmRb6tB7YH77zzTpx11lnRqFGjuPPOO2P//ffPdkkAbGOuu+66ePHFF+OQQw7JfOstALB92K6fKTV9+vQ48sgji4337t07xo4dG19++WXccMMNcd9998VHH30UDRo0iIMOOigGDx4c++23X0REFBYWRosWLaJXr15x4403pv0WAAAAALZJ23UoBQAAAEB2VMh2AQAAAABsf7a7Z0oVFhbGxx9/HLVq1YqcnJxslwOw3UiSJNauXRtNmzaNChXK7jMRfR4gO/R5gPKtLPr8dhdKffzxx9G8efNslwGw3Vq0aFHsuOOOZbZ/fR4gu/R5gPKtNPv8dhdK1apVKyK+Pom1a9fOcjUA2481a9ZE8+bNM324rOjzANmhzwOUb2XR57e7UGrjJb61a9f2QwwgC8r6Vgt9HiC79HmA8q00+7wHnQMAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEAAACQOqEUAAAAAKkTSgEA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H23bto2BAwdGRMTixYszAVVERKtWrWLixIkxZcqUaNOmTdx+++1xzz33ROfOnbNSPwAAAADfT1afKXXEEUdEkiSbXT927NhNbvPGG2+UYVUAAAAAlLVt6plSAAAAAJQPQikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1QikAAAAAUieUAgAAACB1WQ+lRowYES1btoyqVatG+/bt45VXXvnW+cOGDYs99tgjqlWrFs2bN48rrrgi1q9fn1K1AAAAAJSGSt9no8LCwpg7d24sW7YsCgsLi6w77LDDtng/EyZMiP79+8eoUaOiffv2MWzYsOjcuXPMmTMnGjVqVGz++PHj4+qrr47Ro0fHwQcfHO+//36cc845kZOTE0OHDv0+bwUAAACALChxKPXSSy/FmWeeGQsWLIgkSYqsy8nJiYKCgi3e19ChQ+OCCy6IPn36RETEqFGjYuLEiTF69Oi4+uqri81/8cUX45BDDokzzzwzIiJatmwZZ5xxRrz88sslfRsAAAAAZFGJb9+7+OKLo127dvH222/HypUr49NPP80sK1eu3OL9bNiwIWbNmhWdOnX6bzEVKkSnTp1i5syZm9zm4IMPjlmzZmVu8fvw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+ctfxp/+9Ke47rrr4rzzzsv4vQEAAADInYxDqf9r3bp1UVlZWWuscePGW3z+gAEDYsWKFTFixIioqKiIbt26xbRp02oefr5kyZKoV+/vi7natGkT06dPjwsuuCC6dOkSZWVlMXTo0Ljkkku+y8cAAAAAIGUFSZIkmZywZs2auOSSS+LBBx+MTz/9dKP9VVVVdVZcNqxevTqaNGkSq1atyihAA+C7Sav/6vMAuaHPA+S3bPTfjJ8pdfHFF8fTTz8dt9xySxQXF8ftt98eV111Vey2225x77331klRAAAAAOS3jG/f+5//+Z+499574wc/+EEMHjw4evfuHe3bt4+2bdvGfffdFyeffHI26gQAAAAgj2S8UmrlypWx1157RcTXz49auXJlREQccsghMWfOnLqtDgAAAIC8lHEotddee8UHH3wQEREdOnSIBx98MCK+XkHVtGnTOi0OAAAAgPyUcSg1ePDgePXVVyMiYvjw4TFhwoQoKSmJCy64IC666KI6LxAAAACA/JPxM6UuuOCCmn/u27dvvPPOOzF//vxo3759dOnSpU6LAwAAACA/ZRxK/aO2bdtG27Zt66IWAAAAAHYQWxxKffnllzFz5sw45phjIiLi0ksvjfXr19fsLywsjFGjRkVJSUndVwkAAABAXtniUOqee+6JJ554oiaUGj9+fBxwwAGx0047RUTEO++8E7vttlut2/sAAAAAYFO2+EHn9913X5x11lm1xu6///6YNWtWzJo1K37729/WfBMfAAAAAHybLQ6l3nvvvejcuXPN65KSkqhX7++n9+zZM9566626rQ4AAACAvLTFt+99/vnntZ4htWLFilr7q6ura+0HAAAAgM3Z4pVSu+++e7zxxhub3f/aa6/F7rvvXidFAQAAAJDftjiUOuqoo2LEiBGxbt26jfZ9+eWXcdVVV8XRRx9dp8UBAAAAkJ+2+Pa9yy67LB588MHYb7/94txzz4199903IiIWLVoU48ePjw0bNsRll12WtUIBAAAAyB9bHEqVlpbG3Llz4+yzz47hw4dHkiQREVFQUBCHH354/P73v4/S0tKsFQoAAABA/tjiUCoiYs8994xp06bFypUr47333ouIiPbt20fz5s2zUhwAAAAA+SmjUOobzZs3j549e9Z1LQAAAADsILb4QecAAAAAUFeEUgAAAACkTigFAAAAQOqE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kjr+zlYAAAAA+Cdy+kwpAAAAAHZMQikAAAAAUieUAgAAACB1QikAAAAAUieU2kaNHj06/uVf/iUaNWoULVu2jP79+8eiRYtyXVbeuOWWW6JLly7RuHHjaNy4cZSXl8cf//jHXJcF7ED0+ezS52H7NmHChGjXrl2UlJREr1694sUXX/zW4x966KHo0KFDlJSUROfOnWPq1KkpVZquTObltttui969e0ezZs2iWbNm0bdv3386j9uzTH9mvjFp0qQoKCiI/v37Z7fAHMl0Xj7//PMYMmRItG7dOoqLi2PffffNyz9Pmc7LuHHjYr/99ouddtop2rRpExdccEGsW7cupWrTM2fOnDj22GNjt912i4KCgnj00Uf/6TmzZ8+O73//+1FcXBzt27ePu+++O6P3FEpto5555pkYMmRIPP/88/Hkk0/GV199FUcccUSsWbMm16Xlhd133z3GjBkT8+fPj5dffjl++MMfxvHHHx9vvvlmrksDdhD6fHbp87D9mjx5cgwbNixGjhwZr7zySnTt2jX69esXH3/88SaPnzt3bpx00klx+umnx4IFC6J///7Rv3//eOONN1KuPLsynZfZs2fHSSedFLNmzYp58+ZFmzZt4ogjjoiPPvoo5cqzL9O5+cbixYvjwgsvjN69e6dUaboynZfKyso4/PDDY/HixfHwww/HokWL4rbbbouysrKUK8+uTOfl/vvvj+HDh8fIkSPj7bffjjvuuCMmT54cl112WcqVZ9+aNWuia9euMWHChC06/oMPPoijjz46+vTpEwsXLozzzz8/zjjjjJg+ffqWv2nCduHjjz9OIiJ55plncl1K3mrWrFly++2357qMvPHQQw8lnTp1SkpKSpLmzZsnhx12WPK3v/0t12XlhQ8++CCJiI22Qw89NNel8R3o89mnz9ctfT57dvQ+37Nnz2TIkCE1r6uqqpLddtstGT169CaP/+lPf5ocffTRtcZ69eqV/PznP89qnWnLdF7+0YYNG5JGjRol99xzT7ZKzJmtmZsNGzYkBx10UHL77bcngwYNSo4//vgUKk1XpvNyyy23JHvttVdSWVmZVok5kem8DBkyJPnhD39Ya2zYsGHJwQcfnNU6cy0ikilTpnzrMRdffHFywAEH1BobMGBA0q9fvy1+HyulthOrVq2KiIjmzZvnuJL8U1VVFZMmTYo1a9ZEeXl5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I49ERMSiRYti2bJlcdNNN23yfU499dR4+eWX47HHHot58+ZFkiRx1FFHxVdffVVzzNq1a+OGG26IP/zhDzFnzpxYsmRJXHjhhf9s6gFSoc/r8wDANiqBHdzzzz+fREQyZcqUTe4fO3ZsEhHJ8uXLk7Zt2yZHHnlkrf0DBgxIfvSjH9W83tS1Ro4cmXTt2rXm9aBBg5K2bdsmVVVVNWP77bdf0rt375rXGzZsSL73ve8lDzzwQJIkSfLBBx8kEZEsWLBgoxofeeSRpKSkJHn22Wc3+zlfeumlJCKSL774IkmSJJk1a1YSEclnn31W67hDDz00GTp0aJIkSfLuu+8mEZE899xzNfs/+eSTZKeddkoefPDBJEmS5K677koiInnvvfdqjpkwYUJSWlq62VoA0qTPf1brOH0eANhWWCkF/79kC5/5X15evtHrt99+O+P3O+CAA6Jevb//ESwtLY3OnTvXvC4sLIxddtml5laMzVmwYEGccsopMX78+Dj44INrxufPnx/HHnts7LHHHtGoUaM49NBDIyJiyZIlW1zj22+/HfXr149evXrVjO2yyy6x33771frMDRs2jL333rvmdevWrf9p3QBp0+c3ps8DALkklGKH1759+ygoKNjsLxxvv/12NGvWLHbdddc6fd8GDRrUel1QULDJserq6s1eo6KiIo477rg444wz4vTTT68ZX7NmTfTr1y8aN24c9913X7z00ksxZcqUiIiorKysw0/xtU3VvaW//AFkmz7/3enzAEA2CKXY4e2yyy5x+OGHx+9///v48ssva+2rqKiI++67LwYMGBAFBQUREfH888/XOub555+P/fffv+Z1gwYNoqqqKut1r1u3Lo4//vjo0KFDjB07tta+d955Jz799NMYM2ZM9O7dOzp06LDR/9EuKiqKiPjWWvfff//YsGFDvPDCCzVjn376aSxatCg6duxYh58GIHv0eX0eANg2CaUgIsaPHx/r16+Pfv36xZw5c2Lp0qUxbdq0OPzww6OsrCyuvfbammOfe+65uP766+Pdd9+NCRMmxEMPPRRDhw6t2d+uXbuYOXNmVFRUxGeffZa1mn/+85/H0qVL43e/+12sWLEiKioqoqKiIiorK2OPPfaIoqKiuPnmm+P999+Pxx57LEaNGlXr/LZt20ZBQUE8/vjjsWLFivjb3/620Xvss88+cfzxx8eZZ54Zzz77bLz66qvxH//xH1FWVhbHH3981j4bQF3T5/V5AGDbI5SC+Pov5S+//HLstdde8dOf/jT23nvvOOuss6JPnz4xb968aN68ec2xv/rVr+Lll1+OAw88MK655poYO3Zs9OvXr2b/jTfeGE8++WS0adMmDjzwwKzV/Mwzz8SyZcuiY8eO0bp165pt7ty5seuuu8bdd98dDz30UHTs2DHGjBkTN9xwQ63zy8rK4qqrrorhw4dHaWlpnHvuuZt8n7vuuiu6d+8exxxzTJSXl0eSJDF16tSNbuUA2Jbp8/o8ALDtKUg8EAC2WLt27eL888+P888/P9elAJAF+jwAQHqslAIAAAAgdUIpAAAAAFLn9j0AAAAAUmelFAAAAACpE0oBAAAAkDqhFAAAAACpE0oBAAAAkDqhFAAAAACpE0oBAAAAkDqhFAAAAACpE0oBAAAAkLr/D5iCVR6LQsAKAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "fig, axes = plt.subplots(2, 3, figsize=(12, 12), sharey=True)\n", + "\n", + "for i, precompile in enumerate(precompiles):\n", + " means = data[precompile][['2', '3', 's', 'z']].mean()\n", + "\n", + " row = i // 3\n", + " col = i % 3\n", + "\n", + " means.plot(kind='bar', ax=axes[row, col])\n", + " axes[row, col].set_title(f'{precompile}')\n", + " axes[row, col].set_xlabel('Optimization')\n", + " axes[row, col].set_ylabel('Gas cost mean')\n", + " axes[row, col].tick_params(axis='x', rotation=0)\n", + "\n", + "plt.tight_layout()\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "df3229ba-24dc-4120-9c24-1beab1d208b7", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
test23sz
0ecmul_0_0_0_21000_9654546545465406653840
1ecmul_0_0_0_21000_12854546545465406653840
2ecmul_0_0_0_28000_12854546545465406653840
3ecmul_0_0_0_28000_054528545285404853822
4ecmul_0_0_0_21000_054528545285404853822
..................
113ecmul_7827_6598_9_28000_9696822968229624698462
114ecmul_7827_6598_9935_28000_967547347547347344781060454
115ecmul_7827_6598_9_21000_12896822968229624698462
116ecmul_7827_6598_9_21000_9696822968229624698462
117ecmul_7827_6598_9_28000_12896822968229624698462
\n", + "

118 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " test 2 3 s z\n", + "0 ecmul_0_0_0_21000_96 54546 54546 54066 53840\n", + "1 ecmul_0_0_0_21000_128 54546 54546 54066 53840\n", + "2 ecmul_0_0_0_28000_128 54546 54546 54066 53840\n", + "3 ecmul_0_0_0_28000_0 54528 54528 54048 53822\n", + "4 ecmul_0_0_0_21000_0 54528 54528 54048 53822\n", + ".. ... ... ... ... ...\n", + "113 ecmul_7827_6598_9_28000_96 96822 96822 96246 98462\n", + "114 ecmul_7827_6598_9935_28000_96 754734 754734 734478 1060454\n", + "115 ecmul_7827_6598_9_21000_128 96822 96822 96246 98462\n", + "116 ecmul_7827_6598_9_21000_96 96822 96822 96246 98462\n", + "117 ecmul_7827_6598_9_28000_128 96822 96822 96246 98462\n", + "\n", + "[118 rows x 5 columns]" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"ecmul\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "c419afe7-54a5-4873-8c1b-8e24c60d821b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAD1FklEQVR4nOzdeXhU5dk/8O+ZfUsySchOSNiE4L60FHdfwYAb0FYLoojgLr+CKBa1Kku1FhUFcW3fQqtgrUspRQsCvkpZREFFpYCILIFksu+T2ef3x1nIkHWSMzPJ5Pu5rlwkc86c587kJMx9zvPctxAMBoMgIiIiIiIiItVpYh0AERERERERUbxi0k1EREREREQUIUy6iYiIiIiIiCKESTcRERERERFRhDDpJiIiIiIiIooQJt1EREREREREEcKkm4iIiIiIiChCmHQTERERERERRQiTbiIiIiIiIqIIYdJNRERELRw8eBBXXXUVkpKSIAgC1qxZE+uQVDdt2jTYbLZYh0FERHGOSTcREcW1w4cPY+bMmTjttNNgsVhgsVgwYsQI3Hffffjmm29iEtOhQ4dw1113YdCgQTCZTEhMTMRFF12EpUuXoqmpSfXxnE4n5s+fj08++aTTz7n11lvx7bff4sknn8Qbb7yBCy64QPW4ZEeOHIEgCG1+PP300xEbuytWrlzZbrzyR35+virjbd++HfPnz0dNTY0qxyMioujSxToAIiKiSFm3bh1+9atfQafTYcqUKTj77LOh0Wiwf/9+vP/++3jllVdw+PBh5OXlRS2mDz74ADfccAOMRiOmTp2KM844Ax6PB1u3bsXcuXOxd+9evP7666qO6XQ6sWDBAgDA5Zdf3uH+TU1N2LFjBx599FHMnDlT1VjaM3nyZFx99dUtHj/33HOjFkNnXHrppXjjjTdCHrv99tvx05/+FHfeeafymFp30bdv344FCxZg2rRpsNvtqhyTiIiih0k3ERHFpUOHDmHSpEnIy8vD5s2bkZWVFbL9D3/4A15++WVoNNGb9HX48GElpo8//jgkpvvuuw8//PADPvjgg6jF05by8nIAUDXBa2xshNVqbXef8847DzfffLNqY0bKoEGDMGjQoJDH7r77bgwaNKhXxE9ERNHF6eVERBSXFi9ejMbGRqxYsaJFwg0AOp0Ov/71r5Gbm6s89s0332DatGnKtO/MzExMnz4dlZWVIc+tr6/H7NmzkZ+fD6PRiPT0dIwZMwZffvllhzE1NDTgf//3f1uNaciQIZg1a5bytc/nw6JFizB48GAYjUbk5+fjkUcegdvtDnnerl27UFhYiH79+sFsNmPgwIGYPn06AHHqdlpaGgBgwYIFytTn+fPntxrj/PnzlTv/c+fObTFN+quvvsK4ceOQmJgIm82GK6+8Ep999lnIMeTp159++inuvfdepKeno3///u2+Np31z3/+E9dccw2ys7NhNBoxePBgLFq0CH6/v8W+O3fuxNVXX43k5GRYrVacddZZWLp0aYv9Tpw4gQkTJsBmsyEtLQ0PPvhgq8cL14kTJzB9+nRkZGTAaDTi9NNPx5///OcW+7344os4/fTTYbFYkJycjAsuuACrV68GIP485s6dCwAYOHCg8vM7cuRIt+MjIqLo4J1uIiKKS+vWrcOQIUMwcuTITj9n48aN+PHHH3HbbbchMzNTmeq9d+9efPbZZxAEAYB4V/Pdd9/FzJkzMWLECFRWVmLr1q3Yt28fzjvvvDaP/69//QuDBg3ChRde2Kl4br/9dvzlL3/BL3/5SzzwwAPYuXMnfv/732Pfvn34xz/+AQAoKyvDVVddhbS0NMybNw92ux1HjhzB+++/DwBIS0vDK6+8gnvuuQcTJ07Ez3/+cwDAWWed1eqYP//5z2G323H//fcr073ladJ79+7FJZdcgsTERDz00EPQ6/V47bXXcPnll+PTTz9t8Vrfe++9SEtLw+OPP47GxsYOv1+n04mKiooWj9vtduh04luWlStXwmazYc6cObDZbPj444/x+OOPo66uDs8884zynI0bN+Laa69FVlYWZs2ahczMTOzbtw/r1q0LubDh9/tRWFiIkSNH4tlnn8WmTZvw3HPPYfDgwbjnnns6jLktpaWl+NnPfgZBEDBz5kykpaXh3//+N2bMmIG6ujrMnj0bAPDHP/4Rv/71r/HLX/4Ss2bNgsvlwjfffIOdO3fipptuws9//nN8//33eOutt/D888+jX79+AKBcSCEiol4gSEREFGdqa2uDAIITJkxosa26ujpYXl6ufDidTmVb889lb731VhBAcMuWLcpjSUlJwfvuu69LMY0fP75T+3/99ddBAMHbb7895PEHH3wwCCD48ccfB4PBYPAf//hHEEDwiy++aPNY5eXlQQDBJ554olNj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AFx11VXIzMzERRddhIyMDOzbtw/Lly/HNddco9QmOP/88wEAjz76KCZNmgS9Xo/rrrtOScaJiKiHi1XZdCIiomj44Ycfgvfcc09wyJAhQZPJFDSbzcHhw4cH77777uDXX38dsu/x48eDEydODNrt9mBSUlLwhhtuCBYXF4e023K73cG5c+cGzz777GBCQkLQarUGzz777ODLL7/c6Zi+//774B133BHMz88PGgyGYEJCQvCiiy4Kvvjii0rbq2AwGPR6vcEFCxYEBw4cGNTr9cHc3Nzgww8/HLLPl19+GZw8eXJwwIABQaPRGExPTw9ee+21wV27doWMuX379uD5558fNBgMHbYPa6tlmDxeYWFh0GazBS0WS/CKK64Ibt++PWQfuWVYe23MWhuvrY/mrbi2bdsW/NnPfhY0m83B7Ozs4EMPPRTcsGFDEEDw//7v/0KOu3Xr1uCYMWOUn9NZZ50VfPHFF5Xtt956a9BqtbaI54knngiG+xbp1JZhwWAwWFpaGrzvvvuCubm5Qb1eH8zMzAxeeeWVwddff13Z57XXXgteeumlwdTU1KDRaAwOHjw4OHfu3GBtbW3IsRYtWhTMyckJajQatg8jIuplhGAwCvOsiIiIiIiIiPogrukmIiIiIiIiihAm3UREREREREQRwqSbiIiIiIiIKEKYdBMRERERERFFCJNuIiIiIiIioghh0k1EREREREQUIbpYBxAvAoEAiouLkZCQAEEQYh0OERERERERRVAwGER9fT2ys7Oh0bR9P5tJt0qKi4uRm5sb6zCIiIiIiIgoioqKitC/f/82tzPpVklCQgIA8QVPTEyMcTREREREREQUSXV1dcjNzVVywbYw6VaJPKU8MTGRSTcREREREVEf0dHyYhZSIyIiIiIiIooQJt1EREREREREEcKkm4iIiIiIiChCuKY7yvx+P7xeb6zDoDhiMBjabVFARERERESxw6Q7SoLBIBwOB2pqamIdCsUZjUaDgQMHwmAwxDoUIiIiIiI6BZPuKJET7vT0dFgslg4r3BF1RiAQQHFxMUpKSjBgwACeV0REREREPQyT7ijw+/1Kwp2amhrrcCjOpKWlobi4GD6fD3q9PtbhEBERERFRM1wIGgXyGm6LxRLjSCgeydPK/X5/jCMhIiIiIqJTMemOIk79pUjgeUVERERE1HMx6SYiIiIiIiKKECbdFHPz58/HOeec061jHDlyBIIg4Ouvv1YlprZcfvnlmD17dkTHICIiIiKi+MGkmzpUVFSE6dOnIzs7GwaDAXl5eZg1axYqKyvDPpYgCFizZk3IYw8++CA2b97crRhzc3NRUlKCM844o1vHkX3yyScQBKFFi7f3338fixYtUmWMtuzZsweTJ09Gbm4uzGYzCgoKsHTp0oiOSUREREREkcHq5dSuH3/8EaNGjcJpp52Gt956CwMHDsTevXsxd+5c/Pvf/8Znn32GlJSUbo1hs9lgs9m6dQytVovMzMxuHaMzuvu9dsbu3buRnp6ON998E7m5udi+fTvuvPNOaLVazJw5M+LjExERERGReninm9p13333wWAw4KOPPsJll12GAQMGYNy4cdi0aRNOnDiBRx99VNk3Pz8fixYtwuTJk2G1WpGTk4OXXnopZDsATJw4EYIgKF+fOr182rRpmDBhAp566ilkZGTAbrdj4cKF8Pl8mDt3LlJSUtC/f3+sWLFCec6p08unTZsGQRBafHzyyScAgDfeeAMXXHABEhISkJmZiZtuugllZWXKsa644goAQHJyMgRBwLRp0wC0nF5eXV2NqVOnIjk5GRaLBePGjcPBgweV7StXroTdbseGDRtQUFAAm82GsWPHoqSkpM3XfPr06Vi6dCkuu+wyDBo0CDfffDNuu+02vP/++536mRERERERUc/BpDtGgsEgnB5f1D+CwWCnY6yqqsKGDRtw7733wmw2h2zLzMzElClT8Pbbb4cc85lnnsHZZ5+Nr776CvPmzcOsWbOwceNGAMAXX3wBAFixYgVKSkqUr1vz8ccfo7i4GFu2bMGSJUvwxBNP4Nprr0VycjJ27tyJu+++G3fddReOHz/e6vOXLl2KkpIS5WPWrFlIT0/H8OHDAYht3BYtWoQ9e/ZgzZo1OHLkiJJY5+bm4r333gMAHDhwACUlJW1O7542bRp27dqFtWvXYseOHQgGg7j66quVNnEA4HQ68eyzz+KNN97Ali1bcOzYMTz44IPtvfQt1NbWRuUuOxERERERqYvTy2OkyevHiMc3RH3c/y4shMXQuR/7wYMHEQwGUVBQ0Or2goICVFdXo7y8HOnp6QCAiy66CPPmzQMAnHbaadi2bRuef/55jBkzBmlpaQAAu93e4VTwlJQULFu2DBqNBsOGDcPixYvhdDrxyCOPAAAefvhhPP3009i6dSsmTZrU4vlJSUlISkoCIK7Dfu2117Bp0yZl3OnTpyv7Dho0CMuWLcNPfvITNDQ0wGazKQlueno67HZ7m6/P2rVrsW3bNlx44YUAgFWrViE3Nxdr1qzBDTfcAEBM8F999VUMHjwYADBz5kwsXLiw3e+/ue3bt+Ptt9/GBx980OnnEBERERFRz8A73dShcO6Ojxo1qsXX+/btC3vM008/HRrNydMzIyMDZ555pvK1VqtFamqqMiW8LV999RVuueUWLF++HBdddJHy+O7du3HddddhwIABSEhIwGWXXQYAOHbsWKdj3LdvH3Q6HUaOHKk8lpqaimHDhoV8zxaLRUm4ASArK6vDuGXfffcdxo8fjyeeeAJXXXVVp2MjIiIiIqKegXe6Y8Ss1+K/CwtjMm5nDRkyBIIgYN++fZg4cWKL7fv27UNycrJyB1tNer0+5GtBEFp9LBAItHkMh8OB66+/HrfffjtmzJihPN7Y2IjCwkIUFhZi1apVSEtLw7Fjx1BYWAiPx6PuN4LWv5fOXMj473//iyuvvBJ33nknfvvb36oeFxERERERRR6T7hgRBKHT07xjJTU1FWPGjMHLL7+M+++/P2Rdt8PhwKpVqzB16lQIgqA8/tlnn4Uc47PPPguZnq7X6+H3+yMeu8vlwvjx4zF8+HAsWbIkZNv+/ftRWVmJp59+Grm5uQCAXbt2hexjMBgAoN1YCwoK4PP5sHPnTmV6eWVlJQ4cOIARI0Z0K/69e/fif/7nf3DrrbfiySef7NaxiIiIiIgodji9nNq1fPlyuN1uFBYWYsuWLSgqKsL69esxZswY5OTktEgIt23bhsWLF+P777/HSy+9hHfeeQezZs1Stufn52Pz5s1wOByorq6OWNx33XUXioqKsGzZMpSXl8PhcMDhcMDj8WDAgAEwGAx48cUX8eOPP2Lt2rUtem/n5eVBEASsW7cO5eXlaGhoaDHG0KFDMX78eNxxxx3YunUr9uzZg5tvvhk5OTkYP358l2P/7rvvcMUVV+Cqq67CnDlzlNjLy8u7fEwiIiIiIoqNnn2rlWJu6NCh2LVrF5544gnceOONqKqqQmZmJiZMmIAnnniiRUXtBx54ALt27cKCBQuQmJiIJUuWoLDw5DT65557DnPmzMEf//hH5OTk4MiRIxGJ+9NPP0VJSUmLO87/93//h8svvxwrV67EI488gmXLluG8887Ds88+i+uvv17ZLycnBwsWLMC8efNw2223YerUqVi5cmWLcVasWIFZs2bh2muvhcfjwaWXXooPP/ywxZTycLz77rsoLy/Hm2++iTfffFN5PC8vL2KvFxEREVFXvPHh0/jixEd48qb3kWC1xzqcuOXzefHQymtR7q+MdShRd/NZc1A46qZYh9EtQjCcKlnUprq6OiQlJaG2thaJiYkh21wuFw4fPoyBAwfCZDLFKMLIy8/Px+zZs0P6WFPk9ZXzi4iIiHqeia+fhR+MQTzYbxJuvebRWIcTt9ZvX4W5B5+OdRgx8Zv0m3HzuN/EOoxWtZcDNsc73URERERE1CX1Gj8ADaobS2MdSlwrrykCAGR4A7g64fLYBhNl5552ZaxD6DYm3URERERE1CVOqUJUo6c2toHEuTqXOK28X8CAOb96KcbRULiYdJNquN6YiIiIqO/w+bxo0IhdbBq9dTGOJr7Vu6oAAKZg1+sGUeywejkREREREYXNUXUCQal1bJO/McbRxDendFHDLBhjHAl1Be90ExERERFR2MoqjiKnIojTTgTRNIxJdyQ5vQ246PsALir3oNz1YqzDiaqk8dfDkJcX6zC6hUk3ERERERGFraK2GLdv8OP0Y8Aqa1Osw4lrpoo6zFgbAFCHih0vxzqcqDKfey6TbiIiIiIi6nuqG0qRLi3lNjZ4YxtMnNPXuQAAbosOmRNujHE00aXPyox1CN3GpJuIiIiIiMJW6yzHQDEXhM4diG0wcU7jFi9qONMTkPn4YzGOhsLFQmpERERERBS2hqYqWN3i51pPMLbBxDmNR7qoYbXENhDqEibdFHPz58/HOeec061jHDlyBIIg4Ouvv1YlprZcfvnlmD17dkTHICIiIuoNXPVV0Ei5tt7NpDuSdC4x6dYkJMY4EuoKJt3UoaKiIkyfPh3Z2dkwGAzIy8vDrFmzUFlZGfaxBEHAmjVrQh578MEHsXnz5m7FmJubi5KSEpxxxhndOo7sk08+gSAIqKmpCXn8/fffx6JFi1QZoy2VlZUYO3YssrOzYTQakZubi5kzZ6Kujv0viYiIqOfwN5x8b2J0C3C5nTGMJr7ppZkEhuTUGEdCXcGkm9r1448/4oILLsDBgwfx1ltv4YcffsCrr76KzZs3Y9SoUaiqqur2GDabDamp3fsDotVqkZmZCZ0usmUKUlJSkJCQENExNBoNxo8fj7Vr1+L777/HypUrsWnTJtx9990RHZeIiIgoHAFng/K5xQWUVh6PYTTxK+D3Q+8W+6GbU9JjHA11BZNuatd9990Hg8GAjz76CJdddhkGDBiAcePGYdOmTThx4gQeffRRZd/8/HwsWrQIkydPhtVqRU5ODl566aWQ7QAwceJECIKgfH3q9PJp06ZhwoQJeOqpp5CRkQG73Y6FCxfC5/Nh7ty5SElJQf/+/bFixQrlOadOL582bRoEQWjx8cknnwAA3njjDVxwwQVISEhAZmYmbrrpJpSVlSnHuuKKKwAAycnJEAQB06ZNA9Byenl1dTWmTp2K5ORkWCwWjBs3DgcPHlS2r1y5Ena7HRs2bEBBQQFsNhvGjh2LkpKSNl/z5ORk3HPPPbjggguQl5eHK6+8Evfeey/+85//dOpnRkRERBQVLpfyqdUFlFUXxTCY+FVe44BFWjufkNE/tsFQlzDpjpVgEPA0Rv8j2Pn1NlVVVdiwYQPuvfdemM3mkG2ZmZmYMmUK3n77bQSbHfOZZ57B2Wefja+++grz5s3DrFmzsHHjRgDAF198AQBYsWIFSkpKlK9b8/HHH6O4uBhbtmzBkiVL8MQTT+Daa69FcnIydu7cibvvvht33XUXjh9v/Yrq0qVLUVJSonzMmjUL6enpGD58OADA6/Vi0aJF2LNnD9asWYMjR44oiXVubi7ee+89AMCBAwdQUlKCpUuXtjrOtGnTsGvXLqxduxY7duxAMBjE1VdfDa/3ZNsMp9OJZ599Fm+88Qa2bNmCY8eO4cEHH2zvpQ9RXFyM999/H5dddlmnn0NEREQUaRrXyfc7NlcQlbWOGEYTv0qriiC3Qbem9f72WX0RW4bFitcJPJUd/XEfKQYM1k7tevDgQQSDQRQUFLS6vaCgANXV1SgvL0d6ujjV5aKLLsK8efMAAKeddhq2bduG559/HmPGjEFaWhoAwG63IzOz/T8YKSkpWLZsGTQaDYYNG4bFixfD6XTikUceAQA8/PDDePrpp7F161ZMmjSpxfOTkpKQlJQEQFyH/dprr2HTpk3KuNOnT1f2HTRoEJYtW4af/OQnaGhogM1mQ0pKCgAgPT0ddru9zddn7dq12LZtGy688EIAwKpVq5Cbm4s1a9bghhtuACAm+K+++ioGDx4MAJg5cyYWLlzY7vcPAJMnT8Y///lPNDU14brrrsOf/vSnDp9DREREFC1at0/53OoCjtcz6Y6EiurjsLrEm1y6JHtsg6Eu4Z1u6lAwjLvjo0aNavH1vn37wh7z9NNPh0Zz8vTMyMjAmWeeqXyt1WqRmpqqTAlvy1dffYVbbrkFy5cvx0UXXaQ8vnv3blx33XUYMGAAEhISlLvIx44d63SM+/btg06nw8iRI5XHUlNTMWzYsJDv2WKxKAk3AGRlZXUYNwA8//zz+PLLL/HPf/4Thw4dwpw5czodGxEREVGkaZr15ra6gXpnRQyjiV9V9aUnW7MlsXp5b8Q73bGit4h3nWMxbicNGTIEgiBg3759mDhxYovt+/btQ3JysnIHW016vT7ka0EQWn0sEAigLQ6HA9dffz1uv/12zJgxQ3m8sbERhYWFKCwsxKpVq5CWloZjx46hsLAQHo9H3W8ErX8vnbmQkZmZiczMTAwfPhwpKSm45JJL8NhjjyErK0v1GImIiIjCpW/Wm9viBuqc4Xe2oY7VNJYhV1o+r01k0t0bMemOFUHo9DTvWElNTcWYMWPw8ssv4/777w9Z1+1wOLBq1SpMnToVgiAoj3/22Wchx/jss89Cpqfr9Xr4/f6Ix+5yuTB+/HgMHz4cS5YsCdm2f/9+VFZW4umnn0Zubi4AYNeuXSH7GAwGAGg31oKCAvh8PuzcuVOZXl5ZWYkDBw5gxIgRan47ysUFt9ut6nGJiIiIukqsqH0y8fbVd7+rDbXU0FQJq5R0a5h090qcXk7tWr58OdxuNwoLC7FlyxYUFRVh/fr1GDNmDHJycvDkk0+G7L9t2zYsXrwY33//PV566SW88847mDVrlrI9Pz8fmzdvhsPhQHV1dcTivuuuu1BUVIRly5ahvLwcDocDDocDHo8HAwYMgMFgwIsvvogff/wRa9eubdF7Oy8vD4IgYN26dSgvL0dDQ0OLMYYOHYrx48fjjjvuwNatW7Fnzx7cfPPNyMnJwfjx47sc+4cffogVK1bgu+++w5EjR/DBBx/g7rvvxkUXXaRUfCciIiKKpfrGGphOuRfga9a3m9Tjqq+CVrq2wTvdvROTbmrX0KFDsWvXLgwaNAg33ngjBg8ejDvvvBNXXHEFduzYoRQckz3wwAPYtWsXzj33XPzud7/DkiVLUFhYqGx/7rnnsHHjRuTm5uLcc8+NWNyffvopSkpKMGLECGRlZSkf27dvR1paGlauXIl33nkHI0aMwNNPP41nn3025Pk5OTlYsGAB5s2bh4yMDMycObPVcVasWIHzzz8f1157LUaNGoVgMIgPP/ywxZTycJjNZvzxj3/ExRdfjIKCAtx///24/vrrsW7dui4fk4iIiEhNJRXHlLuvsmCTMzbBxDlfYy0AwK8FBJMpxtFQVwjBcKpkUZvq6uqQlJSE2tpaJJ5yBcrlcuHw4cMYOHAgTHH8i5Kfn4/Zs2eH9LGmyOsr5xcRERH1HNv3/Btlc+Zg2ImTj737cysee2pX20+iLln41GW44a9laLJocd6X38U6HGqmvRywOd7pJiIiIiKisFTUFit3uoNSeR/B7W37CdR1TeIL7TWxHFdvxaSbiIiIiIjCUttQriTdbrvYHUfrjnyx3L5IcInddfwWQ4wjoa7i5RJSzZEjR2IdAhERERFFQW1ThZJ0+/olA9VO6Nxtt3KlrtO6fQCAgMXcwZ7UU/FONxERERERhcXZWAmDdGNbyEwHAGg9LBUVCVqPeDFDsCXEOBLqqpgm3fX19Zg9ezby8vJgNptx4YUX4osvvlC2B4NBPP7448jKyoLZbMbo0aNx8ODBkGNUVVVhypQpSExMhN1ux4wZM1q0d/rmm29wySWXwGQyITc3F4sXL24RyzvvvIPhw4fDZDLhzDPPxIcffhiZb5qIiIgAAJU1Djz0v9dgw47VsQ6F4kxp5QnM/d9rsPGzt2MdStzy1omtXwMCYMrJBQAY3AICfk4xV5s8g0CXlBTjSKirYpp033777di4cSPeeOMNfPvtt7jqqqswevRonDghlkFcvHgxli1bhldffRU7d+6E1WpFYWEhXK6T/QmmTJmCvXv3YuPGjVi3bh22bNmCO++8U9leV1eHq666Cnl5edi9ezeeeeYZzJ8/H6+//rqyz/bt2zF58mTMmDEDX331FSZMmIAJEybgu+9YHZCIiChSVm9ajH/rjuHNb5bEOhSKM29t/gPW647hzT3PdrwzdUmwoR4A4DFqYMvIAQCY3UCdszqWYcUlg9QP3ZicFttAqMtilnQ3NTXhvffew+LFi3HppZdiyJAhmD9/PoYMGYJXXnkFwWAQL7zwAn77299i/PjxOOuss/DXv/4VxcXFWLNmDQBg3759WL9+Pf70pz9h5MiRuPjii/Hiiy/ib3/7G4qLiwEAq1atgsfjwZ///GecfvrpmDRpEn79619jyZKT/8EvXboUY8eOxdy5c1FQUIBFixbhvPPOw/Lly2Px0hAREfUJDVUn8P/W+pFe5Op4Z6IwOCuL8f/W+pHGcytigq4mAIDXpEVSRn8AgMUFlFYUxTKsuONyO2Fwi+XhbWlZMY6GuipmSbfP54Pf72/RV9hsNmPr1q04fPgwHA4HRo8erWxLSkrCyJEjsWPHDgDAjh07YLfbccEFFyj7jB49GhqNBjt37lT2ufTSS2EwnKz2V1hYiAMHDqC6ulrZp/k48j7yOERERKS+fvtKccneIC7axemopK60/eK5NWq3L9ahxC1BmnnqMxugsycDAGyuIMqqmXSrqaTimFKwLikzN7bBUJfFLOlOSEjAqFGjsGjRIhQXF8Pv9+PNN9/Ejh07UFJSAofDAQDIyMgIeV5GRoayzeFwID09PWS7TqdDSkpKyD6tHUPe1t4+8vbWuN1u1NXVhXwQERFR52kanQAAc1OMA6G4o2kUsxQzb3RHjMYlV9Q2QZuUCACwuoCqurbfP1P4yquOw+oSC9QZU/vFOBrqqpiu6X7jjTcQDAaRk5MDo9GIZcuWYfLkydBoen5R9d///vdISkpSPnJzeeWpq+bPn49zzjmnW8c4cuQIBEHA119/rUpMbbn88ssxe/bsiI5BRNRXaJvE3rMWF+DzeWMcDcUTnXRumV1gYa8IUXpyWy3QJIhVta0uoLqxNIZRxZ+K2mJYpTXd2sTE2AZDXRbT7Hbw4MH49NNP0dDQgKKiInz++efwer0YNGgQMjMzAQClpaG/uKWlpcq2zMxMlJWVhWz3+XyoqqoK2ae1Y8jb2ttH3t6ahx9+GLW1tcpHUVH8TqUpKirC9OnTkZ2dDYPBgLy8PMyaNQuVlZVhH0sQBGVNvuzBBx/E5s2buxVjbm4uSkpKcMYZZ3TrOLJPPvkEgiCgpqYm5PH3338fixYtUmUMIqK+Tie9abe6gBKuAyUVyeeWxQWU1/DOayTI7cG0iUnQSlW1rS6gvjH894fUtprGUmV6OZPu3qtH3FK2Wq3IyspCdXU1NmzYgPHjx2PgwIHIzMwMScbq6uqwc+dOjBo1CgAwatQo1NTUYPfu3co+H3/8MQKBAEaOHKnss2XLFni9J6+gb9y4EcOGDUNycrKyz6lJ38aNG5VxWmM0GpGYmBjyEY9+/PFHXHDBBTh48CDeeust/PDDD3j11VexefNmjBo1ClVVVd0ew2azITU1tVvH0Gq1yMzMhE6n63Y87UlJSUFCAnskEhGpQe+Skm43UFp2JLbBUFwxSC2WbC6gtPxwjKOJT3q3mHQbklOVZFAbBFwNTLrVVNtYAZuUdGsS2TKst4pp0r1hwwasX78ehw8fxsaNG3HFFVdg+PDhuO222yAIAmbPno3f/e53WLt2Lb799ltMnToV2dnZmDBhAgCgoKAAY8eOxR133IHPP/8c27Ztw8yZMzFp0iRkZ2cDAG666SYYDAbMmDEDe/fuxdtvv42lS5dizpw5ShyzZs3C+vXr8dxzz2H//v2YP38+du3ahZkzZ8biZelR7rvvPhgMBnz00Ue47LLLMGDAAIwbNw6bNm3CiRMn8Oijjyr75ufnY9GiRZg8eTKsVitycnLw0ksvhWwHgIkTJ0IQBOXrU6eXT5s2DRMmTMBTTz2FjIwM2O12LFy4ED6fD3PnzkVKSgr69++PFStWKM85dXr5tGnTIAhCi49PPvkEgLi04YILLkBCQgIyMzNx0003KbMmjhw5giuuuAIAkJycDEEQMG3aNAAtp5dXV1dj6tSpSE5OhsViwbhx40J6ya9cuRJ2ux0bNmxAQUEBbDYbxo4di5KSkjZf8+rqakyZMgVpaWkwm80YOnRoyPdKRBQvDNKbdgCoLDnYzp5E4TFIa2A1QaCs+FCMo4k/Ab9fqahtScmAYDLBL2UV3vraGEYWfxobK2GQ6gFqE3njp7eKadJdW1uL++67D8OHD8fUqVNx8cUXY8OGDdDr9QCAhx56CP/v//0/3HnnnfjJT36ChoYGrF+/PqTi+apVqzB8+HBceeWVuPrqq3HxxReH9OBOSkrCRx99hMOHD+P888/HAw88gMcffzykl/eFF16I1atX4/XXX8fZZ5+Nd999F2vWrFFtqnJrgsEgnF5n1D+CwWDHwUmqqqqwYcMG3HvvvTCbzSHbMjMzMWXKFLz99tshx3zmmWdw9tln46uvvsK8efMwa9YsbNy4EQDwxRdfAABWrFiBkpIS5evWfPzxxyguLsaWLVuwZMkSPPHEE7j22muRnJyMnTt34u6778Zdd92F48ePt/r8pUuXoqSkRPmYNWsW0tPTMXz4cACA1+vFokWLsGfPHqxZswZHjhxREuvc3Fy89957AIADBw6gpKQES5cubXWcadOmYdeuXVi7di127NiBYDCIq6++OmRmhdPpxLPPPos33ngDW7ZswbFjx/Dggw+2+b0/9thj+O9//4t///vf2LdvH1555RX068fCGUQUf0zNilw1lHF6OanH5D75eV3p0dgFEqfKaxywSK9xYlYuBEGAxySmFUFnfQwjiz++OrHbUhCAxmaLbTDUZZGdi9uBG2+8ETfeeGOb2wVBwMKFC7Fw4cI290lJScHq1avbHeess87Cf/7zn3b3ueGGG3DDDTe0H7CKmnxNGLl6ZNTGk+28aScsekun9j148CCCwSAKCgpa3V5QUIDq6mqUl5crVeQvuugizJs3DwBw2mmnYdu2bXj++ecxZswYpKWlAQDsdnu76+UB8ee6bNkyaDQaDBs2DIsXL4bT6cQjjzwCQFxT//TTT2Pr1q2YNGlSi+fLBe4AcR32a6+9hk2bNinjTp8+Xdl30KBBWLZsmXJhx2azISUlBQCQnp4Ou93e5uuzdu1abNu2DRdeeCEA8SJQbm4u1qxZo5xPXq8Xr776KgYPHgwAmDlzZrvn9LFjx3DuuecqrfDkGQFERPHE5/PC3Cwxaqoqa3tnojB4PG5Yml3Qaarmmm61lVYeVSpqW/uJ7608Jh3MTg+CTrYjUJOvUeyQ5DYJEHpBsWlqHX9y1KFw7o6fug5+1KhR2LdvX9hjnn766SFV7DMyMnDmmWcqX2u1WqSmprYopHeqr776CrfccguWL1+Oiy66SHl89+7duO666zBgwAAkJCTgsssuAyAmvJ21b98+6HQ6pX4AAKSmpmLYsGEh37PFYlESbgDIyspqN+577rkHf/vb33DOOefgoYcewvbt2zsdExFRb1FWXawUBwIATy3XgZI6SiqOwtYs7/NU89xSW0XNyd9fXZIdAOA3GwAAgssTo6jilFNsreg1xvReKXUTf3oxYtaZsfOmnTEZt7OGDBkCQRCwb98+TJw4scX2ffv2ITk5WbmDrSZ5iYFMEIRWHwsEAm0ew+Fw4Prrr8ftt9+OGTNmKI83NjaisLAQhYWFWLVqFdLS0nDs2DEUFhbC41H/P4rW4m7vQsa4ceNw9OhRfPjhh9i4cSOuvPJK3HfffXj22WdVj42IKFYcZUdC7kYGG+piFwzFlRLHD0hq1oEu0MA1xmqrrHMgQ66oLfXoDljMABqg8bD9n6pc4pQgn1nfwY7Uk/FOd4wIggCL3hL1D0EQOh1jamoqxowZg5dffhlNTaFThRwOB1atWoVf/epXIcf87LPPQvb77LPPQqan6/V6+KPQL9PlcmH8+PEYPnw4lixZErJt//79qKysxNNPP41LLrkEw4cPb3Hn2WAQr9a2F2tBQQF8Ph927jx58aSyshIHDhzAiBEjuhV/Wloabr31Vrz55pt44YUXQuoUEBHFg8riH0LehAQbnTGLheJLTUlotfJgQ2OMIolftc7yFm2sBJsVAKBzt31DhMKndYkXMQIWUwd7Uk/GpJvatXz5crjdbhQWFmLLli0oKirC+vXrMWbMGOTk5ODJJ58M2X/btm1YvHgxvv/+e7z00kt45513MGvWLGV7fn4+Nm/eDIfDgerq6ojFfdddd6GoqAjLli1DeXk5HA4HHA4HPB4PBgwYAIPBgBdffBE//vgj1q5d26L3dl5eHgRBwLp161BeXo6GhoYWYwwdOhTjx4/HHXfcga1bt2LPnj24+eabkZOTg/Hjx3c59scffxz//Oc/8cMPP2Dv3r1Yt25dm+vqiYh6q/pTCqdpm1xt7EkUnlPPLQ3PLdXVN5TDIk0O1Eg1dLTSNHOti0m3mrRuqXS5tXM1mahnYtJN7Ro6dCh27dqFQYMG4cYbb8TgwYNx55134oorrsCOHTuUgmOyBx54ALt27cK5556L3/3ud1iyZAkKCwuV7c899xw2btyI3NxcnHvuuRGL+9NPP0VJSQlGjBiBrKws5WP79u1IS0vDypUr8c4772DEiBF4+umnW0zdzsnJwYIFCzBv3jxkZGS02T5uxYoVOP/883Httddi1KhRCAaD+PDDD1tMKQ+HwWDAww8/jLPOOguXXnoptFot/va3v3X5eEREPVFTZWhxK/luDlF3uapDZ69pm7jGWG3e+pM3TrRSRW2DPRUAoOfLrSqtR2p/l5AY40ioO4RgOFWyqE11dXVISkpCbW0tEhNDfylcLhcOHz6MgQMHhrQ7izf5+fmYPXt2SB9riry+cn4RUXxZ8bsb8LM3v1O+/nqEBpPf3xvDiChe/PmJCRj19gHl6y/P0GLKu9+18wwK11NLrsbE1w/Doxdw9rf/BQDsf/ZJBP/0JracLmDG23ug03ENshqW3VyAMbuAhqsvxk+W/DHW4dAp2ssBm+OdbiIiIoq6QH1o4TS9m/cASB3BhtA+0QZOd1ZdsFFcdif35gYAe1YuAMDqAhxVJ2ISV7wJ+P3Qu8XaSebUjBhHQ93BpJuIiIiiTn7THpBqcRpdTLpJJVKLJb98bvGCjvpc4jp5n+nk3WyL1K/b6g6irKqo1adReGobqmAWi5cjMbN/bIOhbmHLMFLNkSNHYh0CERH1Epom8Z1kfaIGSbUBmNwxDojihrbZuWWvDcDIc0t1ci9uv8WoPCa3DrO6gIrq4zGJK94UVxxVqsQnpufENhjqFt7pJiIioqjTSYXTnHaxFoXFBThdbO1E3adzidWenclmAOK55fEw81aT1i22VA1azScfSzyZdFc3lMYkrnhTUXMCNmkWkM6eHONoqDuYdBMREVHU6Vzim3ZfutgFw+YCissOt/cUok6Rzy1/ulhN2+oCSiuPxTKkuKOVenELtgTlMU2zpLvWWR6TuOJNVV0JLNL1Im1iQvs7U4/GpJuIiIiiTilulZEufu0DHI5DMYyI4oVBWsOtyRLXGJs9QInjx1iGFHf0UtKtk3pzAyfvdBt9gLOhMhZhxZ2axnLYpOnlmnYqY1PPx6SbiIiIok5OjPRZOUrBq9piJkbUfSZpOq6+/wDlsaoSnltq0kt3X00p6cpjGpsNcsk6d11V9IOKQ/WNFSfvdCclxTYY6hYm3URERBR1ZunujS0jB03ism40VhTHLiCKG3JRvqSsPDilOl8N5aymrRanqxFGj3ilzJaWpTwuaDTwGMXH/Q11rT6XwuOqOzljQJvA6eW9GZNuIiIiiiqX26m0wUnOGgi39EbdVc3iS9Q9tQ1VsDaJnyf3HwK3STy3mqp4bqmltLJIeY2TMgeEbPOYtOInThZFVIO/vgYA4NELEPT69nemHo1JN8Xc/Pnzcc4553TrGEeOHIEgCPj6669Viaktl19+OWbPnh3RMYiI4l1JxTHYpDftGfkFcJvEtyO+uprYBUVxoaTsiNJiKWPAULikCzq+Wk53Vktp1TFYpSn8ptR+Idt8ZikxbHJFO6y4FHA2AAA8JqZsvR1/gtShoqIiTJ8+HdnZ2TAYDMjLy8OsWbNQWRl+kQxBELBmzZqQxx588EFs3ry5WzHm5uaipKQEZ5xxRreOI/vkk08gCAJqampCHn///fexaNEiVcYgIuqrSh2HYBS7OsGSlgGvdHcs2FAfw6goHpSdOAittLDYkJIKr1k8twKc7qyaqloHrEpF7dDiXn6zOJ9fcHujHVZ8ahKvTvpMuhgHQt3FpJva9eOPP+KCCy7AwYMH8dZbb+GHH37Aq6++is2bN2PUqFGoqur+lWObzYbU1NRuHUOr1SIzMxM6XWT/KKWkpCCBa2qIiLql6oRYpTwgiMWXfGaDuEF6g0nUVXWlRwEAHh2gMZngM4l3XgUnzy21VDc4lNkEpybdsFrEx92+KEcVnzQuD4CTFzOo92LSTe267777YDAY8NFHH+Gyyy7DgAEDMG7cOGzatAknTpzAo48+quybn5+PRYsWYfLkybBarcjJycFLL70Ush0AJk6cCEEQlK9PnV4+bdo0TJgwAU899RQyMjJgt9uxcOFC+Hw+zJ07FykpKejfvz9WrFihPOfU6eXTpk2DIAgtPj755BMAwBtvvIELLrgACQkJyMzMxE033YSysjLlWFdccQUAIDk5GYIgYNq0aQBaTi+vrq7G1KlTkZycDIvFgnHjxuHgwYPK9pUrV8Jut2PDhg0oKCiAzWbD2LFjUVJS0uZr3lHsRES9nVwwrckoFl8KWMQ3lNomdyzDojjQWH4CgHhuAYDfIlbpE5yc7qyWusYKJenWJIZW1BYSxCRcJ7UUo+6RL14ErOYYR0LdxaQ7RoLBIAJOZ9Q/gsFgx8FJqqqqsGHDBtx7770wm0N/2TMzMzFlyhS8/fbbIcd85plncPbZZ+Orr77CvHnzMGvWLGzcuBEA8MUXXwAAVqxYgZKSEuXr1nz88ccoLi7Gli1bsGTJEjzxxBO49tprkZycjJ07d+Luu+/GXXfdhePHj7f6/KVLl6KkpET5mDVrFtLT0zF8+HAAgNfrxaJFi7Bnzx6sWbMGR44cURLr3NxcvPfeewCAAwcOoKSkBEuXLm11nGnTpmHXrl1Yu3YtduzYgWAwiKuvvhpe78lpVU6nE88++yzeeOMNbNmyBceOHcODDz7Y5vfeUexERL1dU5UDAOCSilzBagUA6Fy8O0bd466pEP+Vzq2gRbzzynNLPU31FcoUfm1i6Ow/fVKy+K+78+83qW1a6eKFxmqLcSTUXVwgECPBpiYcOO/8qI877MvdEKT/gDpy8OBBBINBFBQUtLq9oKAA1dXVKC8vR3q62Kfxoosuwrx58wAAp512GrZt24bnn38eY8aMQVpaGgDAbrcjMzOz3bFTUlKwbNkyaDQaDBs2DIsXL4bT6cQjjzwCAHj44Yfx9NNPY+vWrZg0aVKL5yclJSFJ6mf4/vvv47XXXsOmTZuUcadPn67sO2jQICxbtgw/+clP0NDQAJvNhpSUFABAeno67HZ7m6/P2rVrsW3bNlx44YUAgFWrViE3Nxdr1qzBDTfcAEBM8F999VUMHjwYADBz5kwsXLiwze+9o9iJiHo7pSKvVORKvlumd/HuGHWPcm5Jhafk6c96tz9WIcUdb101AMCnBQSTKWSbWerbrXcLUY8rHskzBrRJ9tgGQt3GO93UoXDujo8aNarF1/v27Qt7zNNPPx0azcnTMyMjA2eeeabytVarRWpqqjIlvC1fffUVbrnlFixfvhwXXXSR8vju3btx3XXXYcCAAUhISMBll10GADh27FinY9y3bx90Oh1GjhypPJaamophw4aFfM8Wi0VJuAEgKyurw7jbi52IqLcL1IsF0zxScSCDXazrYeCUVOqmYINY7dkrnVu6JPEiOu+8qifQKP3+GjUQhNDk2pbZH4DYK72+sSbaocUdvbTixpjSr/0dqcfjne4YEcxmDPtyd0zG7awhQ4ZAEATs27cPEydObLF93759SE5OVu5gq0l/Si9CQRBafSwQaPsNmsPhwPXXX4/bb78dM2bMUB5vbGxEYWEhCgsLsWrVKqSlpeHYsWMoLCyEx+NR9xtB699LRxcy2oqdiCguNDkBnGwvZE7NAgCYuOyWukkumCYX5zOnirPETC4m3WoJSr+/3lYqaidnDoADgNUltgZMsNqjG1wc8XjcMHoEAEFY+2XFOhzqJibdMSIIQqenecdKamoqxowZg5dffhn3339/yLpuh8OBVatWYerUqSFXOT/77LOQY3z22Wch09P1ej38/shP8XK5XBg/fjyGDx+OJUuWhGzbv38/Kisr8fTTTyM3NxcAsGvXrpB9DAbxP+v2Yi0oKIDP58POnTuV6eWVlZU4cOAARowYEZHYiYjigdYp3r7xSwXU7Fl5AMSkO+D3Q6PVxiw26t20UrVnufBUQrr4/zwv6KhHcIm/v0pP7mb0yeKabqs7iIqaEzgt76yoxhZPSqtOwCKdt/LfSOq9OL2c2rV8+XK43W4UFhZiy5YtKCoqwvr16zFmzBjk5OTgySefDNl/27ZtWLx4Mb7//nu89NJLeOeddzBr1ixle35+PjZv3gyHw4Hq6uqIxX3XXXehqKgIy5YtQ3l5ORwOBxwOBzweDwYMGACDwYAXX3wRP/74I9auXdui93ZeXh4EQcC6detQXl6OBmm6WnNDhw7F+PHjcccdd2Dr1q3Ys2cPbr75ZuTk5GD8+PERiZ2IKB4o7YSkAmqp/YeKX7qA2obut6KkvksumCZIhadS+ovLuywuTndWi8YlFosNWEwttslr6K0uoKK2OKpxxZvSymOwSTM0LP0yYhwNdReTbmrX0KFDsWvXLgwaNAg33ngjBg8ejDvvvBNXXHEFduzYoRQckz3wwAPYtWsXzj33XPzud7/DkiVLUFhYqGx/7rnnsHHjRuTm5uLcc8+NWNyffvopSkpKMGLECGRlZSkf27dvR1paGlauXIl33nkHI0aMwNNPP41nn3025Pk5OTlYsGAB5s2bh4yMDMycObPVcVasWIHzzz8f1157LUaNGoVgMIgPP/ywxZRytWInIooHepc4i0iTIBZQ69d/EADxjfqJ0h9iFhf1fnIxPm2iHQCQMeA0AIDNBRSXH45VWHFFJxels7WsqK2Rkm6bC6htKI9mWHGnsq64WT/0hPZ3ph6P08upQ3l5eVi5cmWn9k1MTMTf//73Nrdfd911uO6660Iemz9/PubPn6983dpYrfWoPnLkiPJ5fn5+yDrp5ttaM3nyZEyePDnksVPXWT/22GN47LHH2o0jOTkZf/3rX9scZ9q0aUorMtmECRPaXdPdUexERL2dQSpqpbeLF2510pRUDYDS4kPAaaPaeipRu4zSuWVIFgtPGVPFIn26AFBe8iOG5Ufugn9foZVeY63Ukztkm5R0W9xAnbMiqnHFm+r6UgxU+qG3fK2pd+GdbiIiIooquaiVRSpypTEa4ZFuA9Q4jsYqLIoDJqnaszVNLDwlmM3wSSUCakt4p1sNeo90YcOe0mKbtlly6KrtuFMLta22sezknW6plSz1Xky6iYiIKKrkxCgxI1d5rElaHtpU5YhBRBQPAn4/zErhKXHJgiAIaBLr9aGhgmuMuyvg98Mg9eC29MtssV3Q6+GRVtjJPdOpa5rqKqCVJkZqeae71+P0clINp0UTEVFHahuqYBW7OiE1d6jyuMskIKkhCE8Np6RS15RVF8MmnVvp0lpuQDy3EpxBuKu5xri7quvLlQsbiRn9W93HY9TC4PXD30oRWuo8T71YVNKvAQRTy6J11LvwTjcRERFFTUnZEWXKZFruEOVxr1GcA+yvq4lBVBQPHI5DMImFtWHPGqA87jGJb3d9dZHrmtJXOCqPwyotD2kr6Vb6d7uaohVWXAo01AMA3CZNSHte6p2YdEdRe8WziLqK5xUR9SYVxT8oUyYNKanK416z9Ea9sTEGUVE8qDh+EAAQAKCz25XHPVISGGzkndfuKq8ugk26aKazJ7e6j99iAHCynzd1TdAp/i30mrQxjoTUwKQ7CuT2UU6nM8aRUDyS+3drtfyjTEQ9X43jCADAowM0zaZM+s3SG/Um3h2jrqkvKwIAuEyAoDn5FtdvFt+HCU6eW91VXV8Ki5RLt9XGKmgWf681Us906hr5ooXP1PU2tNRzcE13FGi1WtjtdpSViVUcLRYLp4mQKgKBAMrLy2GxWKDT8deZiHo+uZiVyxj6eMBiBlAHbZM3+kFRXHBVlwKAUjhNFrCYADRA2+SJflBxprqhDIOUNlZtVNROsAEoP9nPm7pE4xL/FornL/V2fJceJZmZYoVHOfEmUotGo8GAAQN4IYeIegWPVMzKZQr9myXYbABKoePdMeoiT02l+K8pdCKnYLUBqOC5pYLG+jIYpJdRm9R6RW1tgpiM69xc/tYdWumiRdBmjXEkpAYm3VEiCAKysrKQnp4Or5dX8Uk9BoMBGg1XihBR7yC3ETo1MdImiutDDe5AtEOiOBGsrwMAeE5ZA6tJtAMA9Dy3us1dJ1bUDgLQWFtPBk3J/QCc7OdNXaOTzletje3C4gGT7ijTarVce0tERH1WUGojpFQ4lhilN+pGF9+oU9cohafMoWtgDXb53GLS3V3yRTO3UQhZN9+c3L/b4BYQ8Puh4fveLtFJFy309pQYR0Jq4O0xIiIiihq5UJpcOE1mS88BABhZ8Ji6SOMUT55Tzy1rWhYAnltqkC9snDqboLkkqV2bxQWU1ziiElc8MrjFJTjmfhkxjoTUwKSbiIiIokYuZnVqcSB7Zj4A8Y26z8dlWBQ+nUsqlGa1hDyemJkHADC7gICfxb26pUmsouYztz1Z1tZPvMhhcwVRWlUUlbDiTW1DFcxSwbpE6YIk9W5MuomIiChqlGJWVlvI42n5p4kPuwBH1Yloh0VxQOcSE2rBFtrKKn3AUADiuVVZVxr1uOKJRrqw4Tcb29xHl2wHIF5Aq6g+Ho2w4k5p5TFYpUJ08swB6t2YdBMREVHUyMWstEn2kMftWeLdSJMXKCs5FO2wKA4YpCRFlxS6BjY5eyAAwOoGSkqPRDusuKJxixfNgqfMJgjZJ1Es/GVzAVX1vMjRFWXVxbBKd7oNyVzTHQ+YdBMREVHUyImRUSpuJdMkJEAuc1VR/EOUo6J4IBfhM6WGroHV2+3K5xUnDkYzpLgjV9Q+dTZBc9oksWWY1QXUNDDp7orK2pNJtyah7deaeg8m3URERBQ1JumNpEUqbiUTNBq4pGXe9WVcB0rhM0mF0hLS+4c8Luj1cEm11eocR6McVXyRZ6roEpPa3EcrJYnaINBUVx6VuOJNbWOZknTLFzGod2PSTURERFER8PuV4kBJUuG05lzSMlFXdVn0gqK44HI7YRUL4yMle1DL7dK55azmndfu0Eu16kyp6W3uI5jN8EsZhkfq603hqasrhVEqf6FNZJ/ueMCkm4iIiKKivMah3L3JGDCsxXa3SXxb4q2pjGZYFAeKy48q51Z6fkGL7S753Krmndeu8njcMEptrKxp2W3uJwiC8rvsa6iNSmzxxlsr/g0MAtDYbO3vTL0Ck24iIiKKitLSQ7BId8rs2Xkttsu9fwMNddEMi+JA2YmD0IpLumFLz2yx3SMlgX6eW11WWnkMFunCRnJWy9/f5rxGqY+30xnhqOKTTzpP3UYBgobpWjzgT5GIiIiiovz4yQJpumbFrWQ+k9j7V2jkG3UKT/UJseK9RwdoTKYW2+VzCw0N0QwrrpRWnYBNKlZn6ZfR7r4+s178ROrrTeEJNNYDOHmxiHo//iSJiIgoKurKjwEAmoyAoNW22O43i8mShm/UKUzOimIAQFPLfBvAyb7SmiZ3tEKKOxW1J5oV92p/nbHfIr3eUl9vCpNTLFDgNeljHAiphUk3ERERRYWrUixiJRe1OlXQagYAaF2+aIVEccJVI67VdhuFVrcHpL7SWiaBXVbTUAqrdM2iozZWQYv0env4u9wVgls8TwNmQ4wjIbUw6SYiIqKo8NRUADhZ1OpUmgTx7pmeSTeFyVcrVsl2t3FuCVIxKr3LH7WY4k1tQzksUtLdURsrOSnXuQKRDisuad1eAEBAuhBJvR+TbiIiIooKuUCat43ESJeUAgDQu4NRi4niQ1Baq+01tVy2AAC6pGQAJ/tMU/hcNSdb+Wk7uNOtt0u/yx7+LneFTjpPBVv7rzP1HjFNuv1+Px577DEMHDgQZrMZgwcPxqJFixAMnvwFnTZtGgRBCPkYO3ZsyHGqqqowZcoUJCYmwm63Y8aMGWg4pVDGN998g0suuQQmkwm5ublYvHhxi3jeeecdDB8+HCaTCWeeeSY+/PDDyHzjREREfVCwsRFA2+sUzVJxJpOLb9QpTFKVbF8b03FNyWkAACPPrS7z1lcDADx6QNC3v9ZYfr31XELfJTrpwqMusf0ZBdR7xDTp/sMf/oBXXnkFy5cvx759+/CHP/wBixcvxosvvhiy39ixY1FSUqJ8vPXWWyHbp0yZgr1792Ljxo1Yt24dtmzZgjvvvFPZXldXh6uuugp5eXnYvXs3nnnmGcyfPx+vv/66ss/27dsxefJkzJgxA1999RUmTJiACRMm4Lvvvovsi0BERNRHyAXS5KJWp7Kl9QcAmPhGncKkbZLWwFpar6RmTc8BwHOrO+R2ax5j67MJmkvMkH+XBbjc7EYQLnm2jyklLcaRkFp0sRx8+/btGD9+PK655hoAQH5+Pt566y18/vnnIfsZjUZkZrbsuQgA+/btw/r16/HFF1/gggsuAAC8+OKLuPrqq/Hss88iOzsbq1atgsfjwZ///GcYDAacfvrp+Prrr7FkyRIlOV+6dCnGjh2LuXPnAgAWLVqEjRs3Yvny5Xj11Vcj9RIQERH1GdomcZ1isI11iik5g+EBYHEBTlcjLCZrFKOj3kznEs8tWFs/Z5KzByEAwOwCfD4vdDpWhQ6XIFfUNnecdNuz81AGwOoKoqTiGAbmDI9wdPHD5/PCKF0csvbLim0wpJqY3um+8MILsXnzZnz//fcAgD179mDr1q0YN25cyH6ffPIJ0tPTMWzYMNxzzz2orKxUtu3YsQN2u11JuAFg9OjR0Gg02Llzp7LPpZdeCoPh5JSjwsJCHDhwANXV1co+o0ePDhm3sLAQO3bsUPebJiIi6qP0brGIVVvrFDPyTgMAWF1ASdnhqMVFvZ9eKtilSWh9Om5mnpj02VxASUVR1OKKKy5xporP1HFFbVNKPwDiBbTyquMRDSveVNQ4YHGLVfiTsvJiHA2pJaZ3uufNm4e6ujoMHz4cWq0Wfr8fTz75JKZMmaLsM3bsWPz85z/HwIEDcejQITzyyCMYN24cduzYAa1WC4fDgfT09JDj6nQ6pKSkwOFwAAAcDgcGDhwYsk9GRoayLTk5GQ6HQ3ms+T7yMU7ldrvhdp+co1RXV9f1F4KIiKgPMEiJkS7J3up2S5o4q00XAEqLD2LwgDOiFRr1ckZpOq4+ObXV7bZMcXq5wQc4ig8gN3NQ1GKLF3Irv7am8DenSRQ7EdhcQEVtcUTjijeOyqOwSrUHEjKyYxwNqSWmSfff//53rFq1CqtXr1amfM+ePRvZ2dm49dZbAQCTJk1S9j/zzDNx1llnYfDgwfjkk09w5ZVXxip0/P73v8eCBQtiNj4REVFvY1DWKWa0ul0wmeDVAno/UFPCO93UeXKBtLam42qsVvgFQBsEqosPA+dFM7r4oJVmqsDW8bIPuaWY1QUcbSyNZFhxp6KmBFZxUgG00sUL6v1iOr187ty5mDdvHiZNmoQzzzwTt9xyC+6//378/ve/b/M5gwYNQr9+/fDDDz8AADIzM1FWVhayj8/nQ1VVlbIOPDMzE6Wlob/w8tcd7dPWWvKHH34YtbW1ykdREacqERERtccsvZG0pvdvdbsgCGiSbqI1VvDuGHWefG4lpg9odXvzc6uhnNOdu0LnEWeqaBM6TgTllmJGH1BXy6Q7HFV1JbBJ57OmE6819Q4xTbqdTic0mtAQtFotAoG2eygeP34clZWVyMoSr2SOGjUKNTU12L17t7LPxx9/jEAggJEjRyr7bNmyBV6vV9ln48aNGDZsGJKTk5V9Nm/eHDLWxo0bMWrUqFbjMBqNSExMDPkgIiKi1nk8biUxSs0e2OZ+bqO4ltFdVdbmPkTN1dRXKElKP6kuQGtc0rnVVMUksCvkitp6e+tT+JvTJCRAbs7mqq2IYFTxp66xHBZpBas2iflFvIhp0n3dddfhySefxAcffIAjR47gH//4B5YsWYKJEycCABoaGjB37lx89tlnOHLkCDZv3ozx48djyJAhKCwsBAAUFBRg7NixuOOOO/D5559j27ZtmDlzJiZNmoTsbHEdxE033QSDwYAZM2Zg7969ePvtt7F06VLMmTNHiWXWrFlYv349nnvuOezfvx/z58/Hrl27MHPmzOi/MERERHHGUXFUSYwy8ke0uZ/bJL418dfXRCEqigclxYdgku6rpOe2nXR7TGLS7aurikZYcccgFfey9mt9FmhzgkajXEDj73J4mqpPXnCUZwxQ7xfTpPvFF1/EL3/5S9x7770oKCjAgw8+iLvuuguLFi0CIN71/uabb3D99dfjtNNOw4wZM3D++efjP//5D4zGkz0+V61aheHDh+PKK6/E1VdfjYsvvjikB3dSUhI++ugjHD58GOeffz4eeOABPP744yG9vC+88EKsXr0ar7/+Os4++2y8++67WLNmDc44g0VciIiIuqvUcQh6aUmoNa3tN+1ek9iOKFBfH42wKA6UnzgIAAgAMEgzGFvj4bnVZbUNVcpMlYSM1peHnMojX0Br4OsdDm+9eFHIqwMEQ8eV4ql3iGkhtYSEBLzwwgt44YUXWt1uNpuxYcOGDo+TkpKC1atXt7vPWWedhf/85z/t7nPDDTfghhtu6HA8IiIiCk/V8UOwAfBrAI3V0uZ+PrMBgAdCU1PUYqPerd5xDGkAmkziHda2+Mx6AF7A6YxabPHCUX4UVml6uT2r9XXzp/KadECtH3Dxdzkc/kaxI5I864fiA3+aREREFHENFWLxKqdJLGrVFrkdkabJ3eY+RM01VpYAAFzG9vfzm+VzyxXpkOJOec0JpaK2ITmlU8/xm8W7tAJ/l8MSbGwEIF20oLjBpJuIiIgiziUVRpPXebbJKrYj0kk9gYk64q0pB9CJO4PSDAueW+GrrHOE3cYqYDGL+7u8HexJzQku8SKFz6SPcSSkJibdREREFHFeqXiV29R+0q1NEPv76l1tdzIhas5XVwvg5BritmgS5XPLH/GY4k1N/cmkW9PJpFuw2QAAOg9f73BoXB4AJ2f9UHxg0k1EREQRF6xvAHCymFVb5HZEBjeTbuqkRvHc6mg6rj5JLLJmcAfb3Y9aaqwtg1Z62Tp7p1u+gKbj6x0WnVuuONl27QvqfZh0ExERUcQJTnGdos/cfjVei9SOyMRlt9RJGqd4svjN7S/qNqWI55bRxSQwXB6p17ZPCwimzt2BNaaIF9D0TLrDopMuOHZ2RgH1Dky6iYiIKOLkwmiBDhKjhMw8AFDaExF1RF4zHLCa290vMTMXAGBiXa+w+RqkKfxGod1CiM1ZUrMAAAY3EPBzinlnyTMD9EmdK1hHvQOTbiIiIoo4rVy8SiqU1pb03NPE3dxATX1FpMOiOCAXRhNsCe3u1y9nMADA2gQ0Otk7OhzBxs4tD2lObi1mcQuobaiKSFzxyCBdFDKnZsY2EFIVk24iIiKKOL20TlGT0P6UybTcIQAAixs4UXIo4nFR72eQiu7pEu3t7pc2YBgAwOoCjpfy3AqHILVZ84ZRUTspQ5xZYHUFUVxxNCJxxRunqxEmtziTIDEjJ8bRkJqYdBMREVHEyeto9cmp7e6nT05WPq84cTCiMVF8MErTcY3Jae3uZ+onbtcAqChm0h0OQa6o3UFNhuZ0drGQmtUFVNSciEhc8cZRfgRW6W9lclZ+bIMhVTHpJiIiooiTEyNzSka7+wk6HVzS+/o6B++OUcfkonu29PbvDGqMRrilAue1JYcjHFV80brFKfzBMCpqyy3arC6gqq4kInHFm9LqIqU1mzG1/QuU1Lsw6SYiIqKIkwujJUhTTtvTJBVHbqzkG3VqX8Dvh0U6t+xZAzvc3yWdWw0VvPMaDrmNVUfr5pvTJolLScT6DKURiSveVNU5YAuzHzr1Dky6iYiIKKIanfVKYtSv/9AO93eZxDWNnhoWUqP2lVadUO4MZg4s6HB/5dyqLo9kWHFHJxX30iUlt79jM9qEkwl6U02Z2iHFpZr6Ulik17qz/dCpd2DSTURERBF1vPSQknRn5A3vcH+vUayQ7K+vjWRYFAdKjx+AVmoDnZyd3+H+HqP41tdXXxO5oOKQQVoeYkrp1+nnCAYDPNJ0fndtZSTCijsNNaXQiXUBmXTHGSbdREREFFEVx79X3nAYUzruPes1i+/UhcbGCEZF8aDy+A8AAI8O0JhMHe4vn1vBhoaIxhVPfD6v0saqo3Xzp/KYxN/8QAMvoHWGW5rd49cAgrn9vvPUuzDpJiIiooiqdRwBALj14t2vjvhN4j6CsymSYVEcaCg7DuBkHYCO+KSWVzy3Oq+suliZwm/PHBDWc71SX++gkxfQOsPXUA0AcBsFCIIQ42hITUy6iYiIKKIaK4sBAE3Gzu0fsIp3eLRN3kiFRHHCVSUW6HIZO5egBJVzyxOxmOJNWVURrNKd7oQwe0crfb2lPt/UvkCjOAPDI12soPjBpJuIiIgiyi0VrXKbOpcYCVYbAEDv8kUsJooP3toqAJ0/tyCdWzo3z63OKq8+Wawu3HXGAYt4pU3r4kWOTpFmYHhNuhgHQmpj0k1EREQR5asT13PK6zs7orOL67717kDEYqL4EGioA3ByGnNHtFLvaIPLH7GY4k11fWmX21jJfb21br7enaGRLk4EzJ2cFkS9BpNuIiIiiqhgYz0AwNPJuzcGu1gh2ShVTCZqi+B0Aji5VrsjensqAMDg4rnVWbW1DhikiQHh3unW2MT9mXR3jsYjvtDyEhuKH0y6iYiIKKI0TvE2md/ccRE14GSFZBOXgVIHNE5xsbHf0rlKatZ+4rlldEcspLjjlnpsBwFobLawnquX+nrreQGtU3TSDAwhzNeZej4m3URERBRRGqloVaCTiVFyVj4AwOwS2xURtUXrks4PaRpzR+xZeQAAiwsI+Hn3tTO89dK6eaMAQRNe6mDqlw4ASssxap98cUKXaI9tIKQ6Jt1EREQUUTqpIFpn796k5Q0DAFhdQGnViYjFRb2fXrozqEno3LTntAGnARDPrer68ojFFU8CDfLykPDThgRlZoEAj4eZd0f0HjHpNib3i3EkpDYm3URERBRRctEqjVTEqiPJ2QPF5/mB0pIfIhYX9X7yun+9VHyvI6k5gwAAJi9QUnIoYnHFFamidlfaWCXniL/LVleQF9A6EPD7YZSW1FjTw2vNRj0fk24iIiKKKIOUGBntaZ3aX2O1wC91gKo6waSb2maUCqKZUjI7tb/ObodcE7+S51anCK7wajI0Z03LEP91AaWVx1SNK95U1pXCIk0GsGfmxjYYUh2TbiIiIooouSCapV9Wp/YXBAFN0vLvhrLjEYqK4oFZOrcSMzqXpAgaDVzSuVXrOBqhqOKLRlo3HzB3riZDyHOlaf9WN1BZV6xqXPGmtLIIFuV87h/bYEh1TLqJiIgoYgJ+P8zS3Zskadp4Z7hM4q1uV1VpJMKiOOByO2GVkpTUnMGdf57UArmpyhGBqOKP0u7LZg3/uUlS0u0Cquv4erenoqZY6Yeus9tjGgupj0k3ERERRUx1fbmSGKXnDun089xS0u2prYxEWBQHiksOwSQVL88cdHqnn+eSCoJ5aioiEVbc0bvFCfnaTtZkaE7u660LAPU1TLrbU1lXovyt1CaF/1pTz8akm4iIiCKmpOQHJTEK526k1ygWbQrU10ciLIoD5UUHAAABAJbU9E4/T67C7a+vi0RYcUcnVdQ22FPDfq5gNsMvZRueGlaLb09dbSmMYqMHaBMSYhsMqY5JNxEREUVMRdFBAGJipAvj7o3XrBc/cTZGICqKB9XFhwEATSaE1T/aZ5LOrcaGSIQVd4zS8hBzSkbYzxUEAW6jOGvFW1+tZlhxp6lanAkQBKBh0h13mHQTERFRxNSVFgEIPzHym8WFt9om9val1jkrSgBAKbrXWXIVbo3TpXZIcafRWQ+TS0yaEzO7VtxLnlkQ4EWOdnnrxIsSbqMQ1t9K6h34EyUiIqKIcVaJiZFcvKrTrBYAgLbJq3JEFC/c1WXiv9Kd1M4KWqRzy8VzqyMlFUdhlVr+pWR1vhBic16TTvzE6VQrrLjkbxCXO3jCPJ+pd2DSTURERBHjkwqhuU3hveUQpOmVerlyMtEp/HU1AE7eSe20BBsAQO/iudWR8prjSnEvY2r4a7qBk7NWBBdnrbRLWkrjkS9SUFxh0k1EREQR46+vBRB+YqRPSgEAGFxB1WOi+CBPV/aGmaToEpMBnKzKTW1r3sZKI1UiD1fAIs7/17h8aoUVl4Qm8YWWlz9QfGHSTURERBETbBTv3njl4lWdZErNBAAYmXRTGzTOJgDhJynmFLHSOc+tjtXWl8Ii3aDWdjHpFmzizAKdm0l3ezQuDwAgYA53LQ71Bky6iYiIKGLkYlUBS3iJUUJ6DgDAxBmp1AZtk5SkWMxhPc/Kc6vTGqtP9tbuatKtTRC7FujcvMjRHq1HWu5gs8Y2EIoIJt1EREQUMXKxqoBUvKqzUrLFnt5WF+ByswATtaSTpyuHmaSk5AwCAFhcgM/HYmrt8dRUiP/qAUEf3mwVmSG5n/gvk+526VzicgdNQtcublDPxqSbiIiIIkYuViVPMe2szIEFAMTEqLjsiNphURwwSEmKNsEe1vPSBwwHIF7QKak8rnZYccXfINZkcBu7njJY+klLRTizoF16j3hRQq5nQfGFSTcRERFFjJwYhftG0pImvlHXACgr2q92WBQHjFIhNKN0J7WzkrJyAQC6AFB+/HvV44onJ4vVabt8DHvmAADidP7ahipV4opHBumihLlfemwDoYhg0k1EREQRI08pNaWE90ZSYzDALRWlri4+rHZYFAdMUlVtS7+ssJ4nmEzwSjlkZfEhlaOKM1JF7XArxDeXnJ0HQJxZUFp5TJWw4o3L7YTJLfbnTkjrH+NoKBKYdBMREVHEmKXEyJqWHfZzm8ROQ3BWlqgYEcUL+dxKyhoY1vMEQVDOrYYyTi9vj0YqVue3dL2itj5ZnOVicwFl1cWqxBVvyqtOwCpV00/JCe98pt6BSTcRERFFhM/nhVmaMpnSf3DYz3ebxDs/rqpSNcOiOFBdVw6rlHSnDTgt7Oe7jPK55ehgz75N65YKzYVZIT7kGFLVc4sbqKxl0t0aR9Ux5Xy2cHp5XGLSTURERBFRUnkcNrGVMjIGDAv7+W6T+DbFX1+jYlQUDxzH9kMrFcPO7NK5JSbdvrpqNcOKOzqPuG5e6EZFbTnpNnmBulrOWmlNZa1DSbo1iUmxDYYigkk3ERERRURp0QElMUrMGhD2871GceFtoKFBzbAoDlQc/wEA4NEBOmv4fY3lNcqBhjpV44o3eqkmgy7R3uVjaBISIDcLc3JmQauqaothlWYFaRMTYhsMRQSTbiIiIoqIaqlIlVcLaEymsJ/vsxgAAIKzSdW4qPerKxULcjnDP60AAD6T1HO6kedWe+SkO9wK8c0JGg3c0pJwby2rl7emqfrkxQh5ZgDFFybdREREFBEN5ScAdD0xCljEJ2qb2OCXQjVVikmKu4v1veTCYDy32hbw+5Xe2rb07lXUlvt8extquhlVfHLVlAMQZ24IBkOMo6FIYNJNREREESEXqZLXz4ZNmjasc/nUConihKemAsDJdf9hs1oAAFqXV62Q4k5lXamyzji5C8tDmlP6fDc6uxlVfJLrVnT5byX1eEy6iYiIKCLkIlVuY9feSGqldaR6V0CtkChOBOrFtdieLibdmgSxWJXe5VctpnhTUnEMFinpTszo3p1uZTq/y9XNqOKT3ynWrZDrWFD8YdJNREREESEXqZKLVoXLaE8V/3Uz6aZTNDYCaJbMhclgF3tHG9zBDvbsuyprTsAm5cg6u71bx5KXimhcnm5GFaekuhVec9fOZ+r5mHQTERFRRAgN4htJXxffSJr7ZQEAjLw5RqfQOMWTwm/u2qJuU2qG+K+LSXdbKmtLlOnl2qTutbEKStP5dW4uFWmNRqot4DdzPXe8YtJNREREEaFxyW8ku5YYJaaL60gtTLrpFPJabDmZC5d8bplYR61NDTUOpeWfNqF7baw0NvH5Wjen87dGI12MCFrMMY6EIoVJNxEREUWErkkqUtWFPsoAkJZ3GgDA4gZq6ivUCovigLwWW7B1LRlM7T8EAGB1AU5Xo2pxxRNXdRkAwK8BBHP3kkF9UjIAwMCLHK3Su7t3PlPPF9Ok2+/347HHHsPAgQNhNpsxePBgLFq0CMHgyak+wWAQjz/+OLKysmA2mzF69GgcPHgw5DhVVVWYMmUKEhMTYbfbMWPGDDQ0NITs88033+CSSy6ByWRCbm4uFi9e3CKed955B8OHD4fJZMKZZ56JDz/8MDLfOBERUR+gk95IahK61nc2rf9QAIDJC5QU/6BaXNT7GaXiejopmQtXZt5wAOIFnRLHIdXiiiceqae2yyRAELpXVVuezs819K3TSa+LTioeSfEnpkn3H/7wB7zyyitYvnw59u3bhz/84Q9YvHgxXnzxRWWfxYsXY9myZXj11Vexc+dOWK1WFBYWwtWs+uGUKVOwd+9ebNy4EevWrcOWLVtw5513Ktvr6upw1VVXIS8vD7t378YzzzyD+fPn4/XXX1f22b59OyZPnowZM2bgq6++woQJEzBhwgR899130XkxiIiI4oz8BlsvFUQL+/nJyZBLqFUcZ9JNJxmlc8uUktGl55v6pSmflxUdUCWmeBNorAcAeIzdTxcS0rIBiPUZfD62aTuV/LfSkNy1v5XU88U06d6+fTvGjx+Pa665Bvn5+fjlL3+Jq666Cp9//jkA8S73Cy+8gN/+9rcYP348zjrrLPz1r39FcXEx1qxZAwDYt28f1q9fjz/96U8YOXIkLr74Yrz44ov429/+huLiYgDAqlWr4PF48Oc//xmnn346Jk2ahF//+tdYsmSJEsvSpUsxduxYzJ07FwUFBVi0aBHOO+88LF++POqvCxERUTyQi1SZU9O79HxBo0GTWPQYdaVH1QqL4oBJuvdiS8vp0vMFnQ5NUs2qGscRdYKKM8Emcdp9V7sPNJecMxCAOLOgosbR7ePFG6M07d4mXZyg+BPTpPvCCy/E5s2b8f333wMA9uzZg61bt2LcuHEAgMOHD8PhcGD06NHKc5KSkjBy5Ejs2LEDALBjxw7Y7XZccMEFyj6jR4+GRqPBzp07lX0uvfRSGAwnKwIWFhbiwIEDqK6uVvZpPo68jzwOERERhces9PjN6/IxXFINNmdFiQoRUTwI+P1KVe3U/oO7fByXdEGnsbxYhajij6ZJfJF9KlTUTswQL47YXICjkhfQmqupr1D+ViZldf1vJfVs3b901Q3z5s1DXV0dhg8fDq1WC7/fjyeffBJTpkwBADgc4pWwjIzQqUMZGRnKNofDgfT00CvoOp0OKSkpIfsMHDiwxTHkbcnJyXA4HO2Ocyq32w23+2Q1iLq6urC+dyIionjmdDXCIv03mZrTncRIA9QG4KlhITUSlZYdhUmaoZyRX9Dl47hMAlAXhKe6XKXI4otGrhAv9dju1rESxboOVhdQUcMLaM2VVhQpF5FSmHTHrZje6f773/+OVatWYfXq1fjyyy/xl7/8Bc8++yz+8pe/xDKsTvn973+PpKQk5SM3NzfWIREREfUYJY5DStKd2Y3EyGsS36r46mvVCIviQMnRfQCAAIDkbiQp8lplb32NClHFH7kQYle7DzSnlZJusxuoquHMgubKqotglf5W6uxdKwxIPV9Mk+65c+di3rx5mDRpEs4880zccsstuP/++/H73/8eAJCZmQkAKC0tDXleaWmpsi0zMxNlZWUh230+H6qqqkL2ae0Yzcdoax95+6kefvhh1NbWKh9FRUVhf/9ERETxqnlxKlNqvy4fR15PKjQ2dLAn9RU1J8Rq400mcd1/VylrlRt4brVG5xbLGMoJc3fIx9AAaKzmne7mqmpLlDvd2qTuv9bUM8U06XY6ndCc8sdSq9UiEBB/yQcOHIjMzExs3rxZ2V5XV4edO3di1KhRAIBRo0ahpqYGu3fvVvb5+OOPEQgEMHLkSGWfLVu2wOs9WS1x48aNGDZsGJKTk5V9mo8j7yOPcyqj0YjExMSQDyIiIhLJxamaDGLRqq7yS+tJBaergz2pr2goPwEASpG9rlLOraam7oYUl052H+j6RTOZYDDAI/0ZkPt/k6i2+gR0UpsGbQL7dMermCbd1113HZ588kl88MEHOHLkCP7xj39gyZIlmDhxIgBAEATMnj0bv/vd77B27Vp8++23mDp1KrKzszFhwgQAQEFBAcaOHYs77rgDn3/+ObZt24aZM2di0qRJyM4WKwDedNNNMBgMmDFjBvbu3Yu3334bS5cuxZw5c5RYZs2ahfXr1+O5557D/v37MX/+fOzatQszZ86M+utCRETU28nFqbqbGAWsFgCA1sU2QyRyV4lJm9vYvd7RAWmtsrbJ0+2Y4pFBmvLc1e4Dp5J/Xj5O5w/hqhJrCvg1gGCxxDgaipSYFlJ78cUX8dhjj+Hee+9FWVkZsrOzcdddd+Hxxx9X9nnooYfQ2NiIO++8EzU1Nbj44ouxfv16mEwn/xdftWoVZs6ciSuvvBIajQa/+MUvsGzZMmV7UlISPvroI9x33304//zz0a9fPzz++OMhvbwvvPBCrF69Gr/97W/xyCOPYOjQoVizZg3OOOOM6LwYREREcUQuTuU2dS8xEqw2AIDe5et2TBQfvHVVAAC3qZv3jqw2AOXQ8dxqweV2wiQl3UkZA1Q5ptekBRp9Sv9vEsnns8soQBC69/eSeq6YJt0JCQl44YUX8MILL7S5jyAIWLhwIRYuXNjmPikpKVi9enW7Y5111ln4z3/+0+4+N9xwA2644YZ29yEiIqKO+aW7WZ5uJka6JHEZmN4V6G5IFCeC0hpsr0nbreNok5IAAAaXv9sxxZvSyuPKOmO5x3Z3ecw6AD7A6VTlePHC3yAWiZQL+1F84k+XiIiIVBeQEyNj967vG5PTxH+l9aVEaGwEAPhM+m4dxpAkrlU2unhunaq08piSdFtS01Q5ZsAkraF3sT5Dc0GneD539yIS9WxMuomIiEh1cnEqn1SsqqusaVkAABPfp5NEJ63BDnSzf7Q1Taz9Y3R3O6S4U1nXvKJ2kirHDFjMAE72/yZJk/hCd/dvJfVsTLqJiIhIdXJxqmA3E6Pk7MEAAIsLCPg5DZgArbwG22br1nGSpB7fFl7QaaGmpgRG6WVWo2UYAAg2sd+33s2lIs3JRSK7exGJejYm3URERKQ6nUqJUcaAYQAAqwsorTrR3bAoDshrsDW27iWDaQOGAxCT7uq68m7HFU8aK8Ve2gEAmm7+Dsu0iXYAJ/t/k0jrlv5WWlm5PJ4x6SYiIiLVGaTCZ9qE7k1NtWeLdyO1QaD0+IFux0W9n0FK2gzJqd06TnruEPE4fqC46PtuxxVPPLUVAAC3ERA06qQLBrv489KzPkMI+c6/JkGdGQXUMzHpJiIiItUZXXJi1K9bx9FZrfBK9YWqTvzY3bAoDsjr+80pmd06jjYhAX6pQ1PliYPdjCq++OtqAHS/+0Bz1n5ifQauoQ+ll14PvT0ltoFQRDHpJiIiItXJb6wtqVndPpZTWupYX3qs28ei3k9eg52Y2b3+0YIgKOdWreNoN6OKLwGn2H3AY1SvonZSRn8AgMkNOF2Nqh23tzNId/7NKRkxjoQiiUk3ERERqU5OjOzZ+d0+ltsk3o50VZd2+1jUuzW5GpVzKy13WLeP55KS7qYqnlshlO4D3WvL1lxKjlgU0eYCHOVHVDtub+bzeZULlInSRQmKT0y6iYiISFXVdeVKYtQv97RuH89tFJNub21Vt49FvVvJsQPQSkuCM/OHd/t4bmn6tKemotvHiidal9h9wG82qnZMY6q41MTqAkqri1Q7bm/mqDqhtGZLyRkY22Aooph0ExERkaocxw/CIHX3yhjQ/aTbYxKnuAbq67t9LOrdyo/tBwB4dIAlqftrYL1G8a1woKGu28eKJxqp+0BQ6q2tBm1iAgAx6a6qLVHtuL1ZWVURrNKdbpvUN57iE5NuIiIiUlX5cbEStF8Qi1V1lzLF1cl1oH1djbT22qlSS2OvfG41NKhzwDihc8tt2br/+yuT+33rAkBtJdv/AUBF9XHlTrc2idXL4xmTbiIiIlJVnVTwzGkSi1V1V0Ca4qpxsuxxX+esKAYAuFSa9RwwGwAAmiaXOgeME3JxL12SXbVjChYL/FLm0cT6DACAmppimLzi5/JFCYpPTLqJiIhIVc5KB4CTRaq6K2i1AgB0Lq86B6ReS157LRfX666AxQIA0Dbx3GpOTrpNyWmqHVMQBKU+g6emUrXj9maN0t9KANDYbDGMhCKNSTcRERGpSn5D7Vapx688xVUvTXmlvstfXwvg5Dr/7hKk5Q96F88tWcDvh0GaVGJVeZ2xnHT7GmtVPW5v5aktByDO3BC06rVno56HSTcRERGpKtAgJ0bqvM3Q28WCWfLdN+rDpLXXPpNOlcPpEpMBAAZ3QJXjxYPahipYpKRbjZZ/zXmln1uwkWvoAcBbXwMAcBuZksU7/oSJiIhIXQ1iwTO1EiNjSob4r4tJd1+ncYprr/3SWuzuMqWmA+C51Zyj8tjJNlZZeaoe22cSC9cJTq6hB4Bgg9iRwcOkO+7xJ0xERESqkotSqdXjNzEjFwBg5vv0Pk/bJPaPDqjUysrWLwcAYGKNPkVFzcne0Tp7sqrH9lukoohSH/A+z+kE0KxDA8UtJt1ERESkKjkxCkpFqrorJWcwAMDiAjweZkd9mU7qHw2Vik41P7d8PhZTA4DK6hNK72jV21hZpcJ1bp+6x+2lBJf4Qqs1c4N6LibdREREpCql4JlKiVFm/ggAgMUDFDsOqXJM6p2MLnHttT5RnTuw6XnDAIhJd2nlcVWO2dvVV53soa1NUK9PNwAICWISr+caegCAVrqIFFRp5gb1XEy6iYiISFUGOTFKSlHleLa0DOXz0mP7VTkm9U5yMT2DSq2s7NnimmUNgNKiA6ocs7dzVZUBADw6QDCoewfWkCReLNGxKCIAQCddoBRs6l7coJ6HSTcRERGpSk6MjCnqJEaCTocm6b1/reOwKsek3kle12/rp04rK43BALe0nLbqBGdRAIC3vhqAer3QmzOliIXr2IlApJdeB21iUowjoUhj0k1ERESqUhKjtBzVjtlkEv9tLC9W7ZjU+1ikcyspe6Bqx2yS6v01lnN6OQD46+sAqNfyrzlben8AYuG6gJ+90eWLDyaVLlBSz8Wkm4iIiFQT8PuVpDsle5Bqx5Xvurmqy1U7JvUu1VUlMEm1zjLyClQ7rks6t5oqy1Q7Zq8mVdT2GtVp+dec3ILM4gYq60pVP35vY5CKuFtTs2IbCEUck24iIiJSTWnlcaXdkFykSg1uqY+tv65atWNS7+I4vA8AEACQkTtUtePKF3R8dVWqHbM3E6SWf74IVNROyhTb/1ldQGllkerH703qG2uUC5SJKvdDp56HSTcRERGppuTYfuXNRXKOelOAvSYtACDQ0KDaMal3qTh+EIC41ECrV6+vsdck3tENNNSpdszeTO6hHbCYVD+2LlkspGZ1AeXVfXs6f0nFMdikpLtff/VmBVHPxKSbiIiIVFMtFaNy68UiVWqR+9gKzibVjkm9S32ZmKQ5Vc4FfSYxgRekadV9nc4jVdS2WlU/ttyCzOQFqqr7dn2GipoTsEj90A3J6nR6oJ6LSTcRERGppkEqRiUXp1JLwCpmWtomt7oHpl6jqdIBAHAb1a2qLd/R1Tp5bgGATuqhrU1Qv6K2plnf78bKEtWP35tUVhcrhQG1iYmxDYYijkk3ERERqcZVJRZHcqndbshiAwDoXD51j0u9hrdWXHOteisrqwUAoOW5BQAwuMSK2voI3H0VtFq4pAtyruq+XUitvuK4kohpmHTHPSbdREREpJpIJUZyH1uDdBeO+h55zbW8vl8tQoKY8OhdbGEFnKyobUnNjMjx5ZkKvvqaiBy/t2iqEavle3XqLsWhnolJNxEREakm0FAPAPAa1U2M9PZ+AACji0l3XyU0imuu5TXYajEkpYr/8oIOfD4vTNKU5wSpp7baPEa5KGLfLlznqa0AALhUXi5BPROTbiIiIlKNXIxK7XZDln5iH1sjl932WRqplVXAom7BAFNqhvivS9XD9kqOqhNKy7/UCFXU9pql/t99vHCdfNHBbWI61hfwp0xERESq0UiFzgJmdROjpIwBAKD0taW+R9fkBQAELepW1U7KFM8tEy/ooKziqNLGypaWHZEx/CbxgpymjxdFDDY0AgB8Uss6im9MuomIiEg1cmIEm0XV4/bLGwZA7O9bU1+p6rGpdzBIa66FZhWw1ZCSMwSAeG653H377mvzNlbapMgU9wpazAAAjdsbkeP3FoJLvLqh9nIJ6pmYdBMREZFq9G4pMbKp+4Y9c8Bp4vH9gOP496oem3oHg1usqi2vwVZLZv5wAGLv6OLiQ6oeu7epqTwOnbS0PVJtrASb3Imgbxeu07jEiw5yyzqKb0y6iYiISDVyoTODXd3ESJ+YBJ/0rqXy+EFVj029g0lqZWVKSVf1uJbUdMgl1MqK9ql67N7GWSX2zvZrAMFsjsgYcjKv7+OF63RuqUWdVd1ZQdQzMekmIiIi1ciFzuTiVGoRBAFN0jLxOscxVY9NvYO8nj9BWt+vFkGjQZN0s7Gm+Iiqx+5tPDVyRW3xdy4SDPY0AIDeE4zI8XsLnXTRQZPAHt19AZNuIiIiUo2cGCVm5Kp+bJeUGDVWOlQ/NvVsXq8HFrmqds5g1Y8vJ93OymLVj92b+OprAUS2oraln3hBrq93ItAryyVSYhwJRQOTbiIiIlKFx+NulhgNUf34LikRkO/GUd9RduIHaKUbo5n5Baof3y31SnZXl6t+7N4k0FgPAPCatBEbQ74gZ+rjheuM7sgsl6CeiUk3ERERqaK45AeYpILE6RFIjLxS0u2X7sZR31F29AAAwKMDktNyVD++Rz636mpUP3ZvIjQ1AYhsRe1+/aVq8W6gtPJ4xMbpyQJ+v3KnPxKzgqjnYdJNREREqig9JhahCgCw9VN3TTcAeOV+to0Nqh+berbqkh8BAM4IFXqWzy25d3JfJbg8AAC/2RCxMSxp4t8Gqwsoqy6K2Dg9WXmNA1ZpVlBKzsDYBkNRwaSbiIiIVFFbcgSAuD5W0Kj/FsNvFiupaZwu1Y9NPZuzXFxr7TJG5vhykinf6e2rdE1iRe1gBCtqy9XLLS6gsrokYuP0ZKVVRUrSnZCu/swN6nmYdBMREZEqGqTEqClCdyODFrGFkVa6G0d9h0taa+0yRaaidkA+t5r69rml84i9s+Ve2pGgkZJuDYDa8r7ZiaCiWdKtT06ObTAUFUy6iYiISBXuGjExkotSqU1OBPQuf0SOTz2Xr64awMm116qzWgEAOpcvMsfvJeSK2vrEyCWCGoMBHmmliKuqb3YiqK48AZ3Uply+80/xjUk3ERERqUIuQhWpxEgntdYxSP1tqe8INohVtX3yun6V6RLtAACDq2+fWwYp6TYmp0V0HPnCnKu2b3YiaKw4AQDwawDBErmp/NRzMOkmIiIiVciJkTdCiZHRLiYCRlcwIsennkvTGNmq2obkfgAAYx+/oCNX1Lb2y4roOPKFuUBD3+xE4JEuNriMgCBEZmYQ9SxMuomIiEgVglNMjPymyFQ+tqZnAwBM7ogcnnowea21vPZabdZ+0rnVh2v01TZUwSx9//YIV9T2GMU+4IGGvtmJwCstl3AbmYr1FfxJExERkSqUxMgamUpqydliImBpEvvcUt8hr7UWbNaIHD8xKx8AlKSzLyqtPA6b9P33yxkU0bF8ZnHGgtDUN1/wgNT20GvSxjgSihYm3URERKQKpQiVNTKJUcaAYQAAsxsoqzwRkTGoZ5LXWmsSkiJyfPncsrqA6rryiIzR05VVH4dFmkViSE6J6FgBuf1fX+1E0OQEELkaBdTzMOkmIiIiVcgFzrQRqnycki3efdMAKCvaH5ExqGeS11pHqsBX+oDTAADaIOA41jfPraqq4zB5xc8jXVFb7gOudffNavGaJvHqht8cocbz1OOEnXT/9a9/hdvdcjGVx+PBX//6V1WCIiIiot7HKN2NNNhTI3J8rdkEl1RHq/LE4YiMQT2TvNbanJoZkePrrFZ4pZm+FccPRWSMnq6hvAgAEACgSUiI6FiaBDGp1/fRwnVal3h1I1I1CqjnCTvpvu2221Bb27LSYH19PW677TZVgiIiIqLeR658bIlg5eMmabl4fdnRiI1BPY9FLvCVFbkCX07p3Kor7ZvnlqtanFbvMQKCJrKTYeU+4HJf8L5GJ11sEGy2GEdC0RL2b1QwGGy1tP3x48eRlBTeOpv8/HwIgtDi47777gMAXH755S223X333SHHOHbsGK655hpYLBakp6dj7ty58PlCp6p88sknOO+882A0GjFkyBCsXLmyRSwvvfQS8vPzYTKZMHLkSHz++edhfS9ERER9nZIYZeZHbAylv29VWcTGoJ6lsb5GmfbcL/e0iI3jkpLupqrSiI3Rk3lrKwEALmPkW1iZUtIBnOwL3tfId/h1YeZO1Ht1evX+ueeeqyS+V155JXS6k0/1+/04fPgwxo4dG9bgX3zxBfzNqo9+9913GDNmDG644QblsTvuuAMLFy5UvrY0ayDv9/txzTXXIDMzE9u3b0dJSQmmTp0KvV6Pp556CgBw+PBhXHPNNbj77ruxatUqbN68GbfffjuysrJQWFgIAHj77bcxZ84cvPrqqxg5ciReeOEFFBYW4sCBA0hPTw/reyIiIuqLauorlaQ7dUDkEiO3SQAQhLe2KmJjUM/iOLwXgDjtOStveMTGEds3BeCp7puF1PwN9QBO9tCOpIT0HAB9t0WbfLHBaI9MjQLqeTqddE+YMAEA8PXXX6OwsBC2ZtMhDAYD8vPz8Ytf/CKswdPSQk+0p59+GoMHD8Zll12mPGaxWJCZ2fr6nY8++gj//e9/sWnTJmRkZOCcc87BokWL8Jvf/Abz58+HwWDAq6++ioEDB+K5554DABQUFGDr1q14/vnnlaR7yZIluOOOO5Tp8a+++io++OAD/PnPf8a8efPC+p6IiIj6IsexA9BJyzMzI5h0e0xaAAEEG+oiNgb1LBUnfkAixOnfZnPkpuN6TWLSHeir55azEQDgM0a+orY9Kx8NACxuoKa+AvaEfhEfsyeRl+JYI7gUh3qWTv9WPfHEEwDEKeGTJk2C0ahutT2Px4M333wTc+bMCZm+vmrVKrz55pvIzMzEddddh8cee0y5271jxw6ceeaZyMjIUPYvLCzEPffcg7179+Lcc8/Fjh07MHr06JCxCgsLMXv2bGXc3bt34+GHH1a2azQajB49Gjt27FD1eyQiIopXlScOIgWAVwvobZErwuQz6QF4gUZnxMagnqXWcRSJOLmeP1K8Zj0AH9DYGNmBeii5Z7bPbIj4WKk5A8Wk2wWUVhT1qaTb5XbCLCXd9qy82AZDURP2paz/+Z//QXl5Ofr37w8A+Pzzz7F69WqMGDECd955Z5cDWbNmDWpqajBt2jTlsZtuugl5eXnIzs7GN998g9/85jc4cOAA3n//fQCAw+EISbgBKF87HI5296mrq0NTUxOqq6vh9/tb3Wf//rZbRrjd7pAq7nV1ffSqKBEREYA6xzGkQLwb2VrtF7UELCYATmibWnZSofjUVCG+p3NFuLtSwGQE0ASNs2/Oeda65YraEb66AUCfLBZSs7mAsqpjGDbw3IiP2VOUVByDVV6K039wbIOhqAk76b7ppptw55134pZbboHD4cDo0aNxxhlnYNWqVXA4HHj88ce7FMj//u//Yty4ccjOzlYea57En3nmmcjKysKVV16JQ4cOYfDg2J6kv//977FgwYKYxkBERNRTNFZKiVGE36+L/X2rlJY7FP88NRXivxFeaxywmgHU9NlzS+eSChFbrREfS+4DrgsA1RXHIz5eT1JedVxJus2pXNPdV4T91+u7777DT3/6UwDA3//+d5x55pnYvn07Vq1a1WpV8M44evQoNm3ahNtvv73d/UaOHAkA+OGHHwAAmZmZKC0NrTApfy2vA29rn8TERJjNZvTr1w9arbbVfdpaSw4ADz/8MGpra5WPoqKiTnynRERE8ckrJUZiMarI0dqk/r4ufwd7UrwI1IuzCSOddAvSsgh9U988t+Q2VnJCHEmCxQK/NCGmvrJvJd0VlUVKNf5ovNbUM4T918vr9SrruTdt2oTrr78eADB8+HCUlJR0KYgVK1YgPT0d11xzTbv7ff311wCArCyx6MCoUaPw7bffoqzsZNuQjRs3IjExESNGjFD22bx5c8hxNm7ciFGjRgEQi8Cdf/75IfsEAgFs3rxZ2ac1RqMRiYmJIR9ERER9lb++FoBcjCpydHZxWqrB1TdbDfVJDQ0A5PX8kaNLks4tKfnsa+SK2oak1IiPJQiCMivGXdW3qsU3VJy8UadJiFz9C+pZwv6f8fTTT8err76K//znP9i4caPSJqy4uBipqeH/kgYCAaxYsQK33nprSBuyQ4cOYdGiRdi9ezeOHDmCtWvXYurUqbj00ktx1llnAQCuuuoqjBgxArfccgv27NmDDRs24Le//S3uu+8+5cLA3XffjR9//BEPPfQQ9u/fj5dffhl///vfcf/99ytjzZkzB3/84x/xl7/8Bfv27cM999yDxsZGpZo5ERERdUCqfOw1RbbysTlFrMFi6qP9ffsijbR+3x/hAl8m6dwy9tFzyyCVSTD3a3ump5rkWTG++uqojNdTOKvEm4UuAyBotTGOhqIl7P8Z//CHP2DixIl45plncOutt+Lss88GAKxdu1aZdh6OTZs24dixY5g+fXrI4waDAZs2bcILL7yAxsZG5Obm4he/+AV++9vfKvtotVqsW7cO99xzD0aNGgWr1Ypbb701pK/3wIED8cEHH+D+++/H0qVL0b9/f/zpT39S2oUBwK9+9SuUl5fj8ccfh8PhwDnnnIP169e3KK5GRERErROk4lN+c2SrXdkyBgDou/19+yJdk0f8ROpeEym2tL7bOzrg98MkJd2Jaf2jMqZX6osu9wfvKzy14lIclylyBSep5wk76b788stRUVGBuro6JEuVBwGx6JmlC38Mr7rqKgSDLa8o5ubm4tNPP+3w+Xl5efjwww87jPmrr75qd5+ZM2di5syZHY5HRERELcmJUdBijug4KTmDEQBgdQEejxsGQ4RLWlPMKev3I9iKDgBSc8QivRaXmIRq+tBdyLLq4pMVtXOjU6zYa9YB8CmzZPoKpUZBhOtfUM/SpZ+2VquFz+fD1q1bsXXrVpSXlyM/Px/p6elqx0dERES9gE5KjIQIr1HMzhdrthh9gKPkh4iORT2DvMZan5TcwZ7dk5E/DABg8QCl5cciOlZPU1ZVpCTdiek5URlTnhUj9LH2f8EoLcWhniXspLuxsRHTp09HVlYWLr30Ulx66aXIzs7GjBkz4HQ6IxEjERER9XBGOTFKjGxiZEvLRECalVlWdCCiY1HPYJSK5hmTI3tzJzkrX/m89Nj+iI7V05RVFsEs5b46uz0qY8r9wLVyq7K+okleihPZwoDUs4SddM+ZMweffvop/vWvf6GmpgY1NTX45z//iU8//RQPPPBAJGIkIiKiHk6pfBzhxEjQaOCUZpRXnzgc0bGoZzBLd2DlNdeRIuh0aJJqtVWdOBTRsXqa2vIiJSmIVhsrwWoDAOjcfSvp1rrEpTh+synGkVA0hT2v4b333sO7776Lyy+/XHns6quvhtlsxo033ohXXnlFzfiIiIioF5ATo4QoTE11mQCbC2isLI74WBRbwWAQFuncSs6J/Fpjpwkwe4CGsr7VO9op/S55dIBgiGyVeJk2MQkAoO9jLdp08p19a2QLA1LPEvadbqfT2WpV7/T0dE4vJyIi6oMCfr+SGNmzB0Z8PJdRnF/uri6L+FgUW9WOY9BK9XYz8oZHfDy3VFHa1cfOLXeNVFHbGL2K2ga72GrY0MdatOncYv0LbUJSjCOhaAo76R41ahSeeOIJuFwn+yk0NTVhwYIFGDVqlKrBERERUc9XUVUMi7QeNGPAsIiP5zFJ/X3raiI+FsVWyeH/AhDvwGZkRv6Cjls+t2qrIj5WT+KvrwUAeKLYxsrSLwsAYOxbddSUiwyRLgxIPUvY08uXLl2KwsJC9O/fX+nRvWfPHphMJmzYsEH1AImIiKhncxz9L+SSQClRuNPtNWkB+BGs71v9ffui6uIfkQqg0YSotPBSzq0+1js60Ch+vx5T9NqkJWXkIgDA5AZ8Pi90ur5RWEy+yGBObTlzmOJX2En3GWecgYMHD2LVqlXYv1+s7Dh58mRMmTIFZnNke3MSERFRz1N54jAyATQZAK0x8n2z/WYDAA8EZ1PEx6LYqi8tQioAV5TasftNegAeoI8tmZR/l3ym6CW+/foPRhkAqwtwVJ1A//T8qI0dKwG/X0m6bVFqzUY9Q5caxFksFtxxxx1qx0JERES9UH3ZUTHpjlIx3oDFDKAB2iZPdAakmJHXVruiNO3ZbzECaITG2bfOLcElZoIBc5SubgBIyMhRku6yqqI+kXTXNlQpS3FScwbFNhiKqk6v6d69ezeuuOIK1NXVtdhWW1uLK664Anv27FE1OCIiIur53FFOjGC1Auh7rYb6InlttbyOP+KUc8sbnfF6CPl3KWiJ3qxVuTWZyQtUlB+N2rixVFxxFFa5Gn+zvvAU/zr9F+y5557D//zP/yCxld59SUlJGDNmDJ555hlVgyMiIqKez1dTDQDwRKnysTbRDgAwuPxRGY9iJyCtrfZGaa2xxia+z+1r55ZO+n4FW0LUxtQknByrrrwoauPGUkVVkdLpQW+3xzQWiq5OJ907d+7E+PHj29x+3XXXYfv27aoERURERL1HoEGcBRetIkwGewoAwOjqW62G+iJNo7jW2B+ltcZKGytX3+odrZcqauuiWFFb0GrhklqCN1WVRm3cWKotO6YkX5oktgzrSzqddJ84cQIJCW1f/bLZbCgpKVElKCIiIupFGsWiU9FKjCz9sgH0vVZDfZGmSbwtGLBEp2CAKTUTAGB0dbBjnDFKSbcxuV9Ux5WXpHhqy6M6bqw0VBQDEFvgaQyGGEdD0dTppDstLQ0HDhxoc/v+/fvRr190f1GJiIgo9jRSESZ/lBKjpMwBAKBM06T4pWuS1xpbojKefG6Z+9gFHaWidlp2VMf1GKW+6FKf8HjnrhEvLrijV6+OeohOJ92jR4/Gk08+2eq2YDCIJ598EqNHj1YtMCIiIuoddE1S0SlrdBKjfrnDxeFcQF19VVTGpNiQ11ZrE6MzFTc1ZzAA8dxyu/vGVR2nq1G5yGDPzI/q2PJa/WBjY1THjRVvnVj/wm2MUmFA6jE6/RP/7W9/i2+//RYjR47E3//+d+zZswd79uzB22+/jZEjR+K7777Do48+GslYiYiIqAfSS4mRJqFlsdVIyMoXk25NECgp2h+VMSk2jG5xbbU+KTUq42XkjxDH8wMlJw5GZcxYc5QfUSpq98uNbhsruS+43Cc83gUaxcKA0ap/QT1Hp5PuwYMHY9OmTWhsbMSkSZNw3nnn4bzzzsPkyZPhdDqxceNGDBkyJJKxEhERUQ9kkNaD6pNSojOeLQEenfh55fEfojImxYZJSgYt0lrrSLOmpMEnvTsuPbYvKmPGWln1cSXpNvfLiOrYAYs4z1peohL3nGL9C59JF+NAKNrC+olfcMEF+O677/D111/j4MGDCAaDOO2003DOOedEKDwiIiLq6UxSFXFTSvTesDcZAYMPqHP0jf6+fZVZSgYTMgZEZTxBEOA0AYlOoK7kSFTGjLWq8qNIkoq1a9spmhwJ4lr9Kmj7SIs2pf6FmUXU+pouXWY555xzmGgTERERgOgnRgDQZAKSGoHGSkfUxqTo8jY5YZLKBfTrPzRq47qMYtLdUF4ctTFjqaH8BADArwGEKBWsk8lLUvTuvpF0a11SYcAo1b+gnoOr+ImIiKjLPB43LNLM0BSpCFU0uE3iWxhvTUXUxqToKj32PQAgACAzvyBq47rlNlZ95NxyVZUBEGePCIIQ1bF1iWJfcL27b/RFly8uCDZbjCOhaGPSTURERF3mKD4Ig3jzBtlSEapo8ErVf/11faPVUF9UflRsVes0AfbE6LWllYtc+etrojZmLHlqK8V/jdFNuAHAnJIO4GTLsninky4u6BLssQ2Eoo5JNxEREXVZWZGYGPkFwJYWnWJXAOA1i1WP4ewbrYb6ohrHEQDiHdhoUtpY1ddHd+AY8TfWAYhNRW25L3hfSbqNUv0LQ3L0LiJRz8Ckm4iIiLqspvgIAPFuZDSnpvpNYiEiTWPf6KXcFzVKa6pdpuiOK59bQlMfObekHtneGCTd9uyBAACLG6hvrIn6+NEmX1ywpmXFNhCKurCT7vXr12Pr1q3K1y+99BLOOecc3HTTTaiurlY1OCIiIurZGirEIkzRToyCVjMAQOvyRndgihp5TbW8xjpaAvK51eSJ6rixIsgVtU3Rr6id3l9sN2x1ASUVx6I+fjR5PG6YpKQ7KYpFJ6lnCDvpnjt3LurqxGko3377LR544AFcffXVOHz4MObMmaN6gERERNRzearFxMgV5fWgGpvY2kgvVQOm+OOvE2/meIzRvQMrWK0AAF0fObfkiwsBS5SvnAEwpKQAACwuoKKqKOrjR1Np1QmlH3paFKvxU88Qdsuww4cPY8QIsVDKe++9h2uvvRZPPfUUvvzyS1x99dWqB0hEREQ9l6+uCgDgMUV3xZo2Sax6bOgjVY/7omCDOO3ZZ+5Sh9su0yYmAzgMQ19pY+WWLi5IFxuiSZMotgzTAKguPRr18aOpvPIYbFLSbcvg9PK+Juz/IQ0GA5xOJwBg06ZNuOqqqwAAKSkpyh1wIiIi6hvkxMhrim5iZLSnif9KhYko/miamgAAfnN0pz0b7GKRq75ybhlc4oUrbUJS1MfWGI3wSn865H7h8aqi/Ah00jVCuT859R1h/w958cUXY86cObjooovw+eef4+233wYAfP/99+jfv7/qARIREVHPJUgX4v1yNfEosablAICyRpLij9YpTXs2m6M6rlWqqG3qI3XU9B7x4oLenhKT8V1GQO8DXLXlMRk/WurKjgMQOz1orJYYR0PRFvad7uXLl0On0+Hdd9/FK6+8gpwc8T+9f//73xg7dqzqARIREVHPdXI9aHQTo+QcqeqxCwj4+8Y04L5G7xJ/roItutOe7Zn5AMRzqy+QK2qbUzNiMr7bKKYj3tqqmIwfLU1VDgBi0clodnqgniHsO90DBgzAunXrWjz+/PPPqxIQERER9R5KsakorwfNyBuGKgBmD1BRdQLpaawGHG/kNdXiGuvoSR1wGhoBmN1ATW057ElpUR0/mgJ+v3JHPyE9NjNWxXoQAQQa4nuZqre2EgDgjnLRSeoZulX1xOVyoa6uLuSDiIiI+g75bqQ20R7VcftlD1Y+dxzZH9WxKTpM0ppqo7TGOlqy8oYBEN8kO47G97lVXV8Oi3Snu1//we3vHCE+uR6EtFQlXvkaagEAHmN0i05SzxD2T72xsREzZ85Eeno6rFYrkpOTQz6IiIio7zC65cQoNarjag0GOI3i59UnDkV1bIoO+Q6sNT0nquPqzRa4pBIFlSd+iOrY0VZScVRpY5WclR+TGHxSoTxNU5wXaGiMTdFJ6hnCTrofeughfPzxx3jllVdgNBrxpz/9CQsWLEB2djb++te/RiJGIiIi6qHkxMjSLzvqYzdJbYXry+K7v29fFAwGlTXVSdIa62iSz606R3y3saqoOAaTV/xcb7fHJgipHoTG5Y3N+FEiNIkntN8U3aKT1DOEfanlX//6F/7617/i8ssvx2233YZLLrkEQ4YMQV5eHlatWoUpU6ZEIk4iIiLqgeTEKDEz+muqXUYBQBBNVWVRH5siq7GyDFqpY1fGgOFRH99lBFAPOCtLoz52NNWVFkEun6ZJSIhNEFI9CJ3cLzxOaVxi0Um/xRTjSCgWwr7TXVVVhUGDBgEAEhMTUVUlVhq8+OKLsWXLFnWjIyIioh6roaFWWQ+alnta1Md3m8SCRD6pQBHFj9LD/wUAeHRAdk4szi25onZ8n1sNFcUAgCYjIGi1MYlBrgehdwdiMn60xKroJPUMYSfdgwYNwuHDhwEAw4cPx9///ncA4h1we6ympRAREVHUnTj6X2iku5GZeQVRH18uwBRsqI/62BRZFdJa6kYTYDAYoz6+1/T/2/vzKLvqOt//f555qnmuSiqVQCADgyJgTIO2NpEEoW9zW2kH2kZEWPIl127oi7fp5Q9R7tWlXlC6weaqLdpLcFy3XTYiEON4G1DBARkSCEnIUPNcdebp98fe+1QqY4VU1WfvU68Hq1adqrNT530On1O13/vz+bzfVgJamppY9MdeTDm7N3bGYEXtsF0PImwXzqtWzkUFYysKxKiTTrqvvfZa/vCHPwDwD//wD9x3331Eo1Fuvvlmbr311nkPUERERNzJKTKVDUGkZvFPJCsFiZLVXfV4KZocsPbppxc/3wYOHVtJMwEsksLUOAA5g0l3rLkDgEjOWAiLwkm6Q/WLW3RS3OGk93TffPPNldubNm1ix44dPPPMM6xevZpzzz13XoMTERER95rs20sj5hKjUjwKpKq/6vESlB7pByBraPtrKRYB0vhSGTMBLJLy9DQwM7NvQoNdDyKasfqG+w0tc19oEfvXVKypzWwgYsQp16zv6emhp6dnPmIRERERD0mNWolR2lRdoHgcGCVY5VWPl6LCuFUzyNlbvdjKiRgwXv1jy+6NnTdYUbt52WpGgEQGhsb7aW9e3BZxi8Xp9FDTXp3PT45vzkl3Op1m+/btXHHFFQDcdtttZLMzV5YDgQB33nkn0agq8omIiCwF+TGryFQuYiYx8tfWARDKFI08viyc0vQkAPmImVlPX00d0Ff1Y8upqG3N7JtR377cSrqzMDCyryqT7onpUWJ22tTUdZrZYMSIOSfdX//61/nhD39YSbrvvfdezjrrLGIxq7fejh076OrqmrX8XERERKpX0S4ylTM0Gxl0CjBlq7sA05I0be2lLsTMzMAG6xsBCGequ6J2wJ7JL9u9sk0INlqvdagIfQN74MyNxmJZKAMj+6ixZ7pblp1uNhgxYs5/JR988EFuuOGGWd976KGH+OlPf8pPf/pTPve5z1UqmYuIiMgSYBeZcqqILzZnb2S0yqseL0XOPn1TM7DRJqt7dbTKL+gEs9ZMvsmK2v5EnKJdx21ycL+xOBbS4NB+ovZOhUhTk9lgxIg5J927du3inHPOqXwdjUbx+2f++Rvf+EZeeOGF+Y1OREREXMuXSgNQNJQY1bVbBZhi1V3rakkKpu0MJR438vg1rV3AzD7cahWyLyoE7V7ZJvh8PjL2r5DkSJ+xOBbSeP+eym21DFua5nxpenx8fNYe7qGhoVn3l0qlWfeLiIhIdassTU2YWZratOx0SlgFmPL5HKFQ2EgcMv9C9gysz1CC0mjvu41XfUVtK+kON7QYjSMb9ZHIlMlPjBiNY6Ekh3sByITBV6VjSY5vzjPdy5cv57nnnjvm/c8++yzLly+fl6BERETE/cKZgnXDQI9ugI6V6wAIlqBv/8tGYpCFEck4PY3NLMXtXLneiqMAgwP7jMSwGKL2fFlNm9niZVm7GGNxctxoHAslMzZofVa96SVrzkn3O97xDm6//XYymSPX2aTTaT7xiU9w+eWXz2twIiIi4l4hJzEytDS1rqWTgn0mM7R/p5EYZGE4+/QjjWZ6Gje0d1Oy9xkP7nvRSAwLLZfLVpLuenurhilOn/BSatpoHAulMDUOzFxckKVnzsvL//Ef/5HvfOc7rFmzhq1bt3LmmWcCsHPnTu69914KhQL/+I//uGCBioiIiLs4RabCja1GHt/n85GKQl0Kxvp2G4lBFoazT7/WUDIYCIVIRaAmAyMHXzESw0IbGNlHwn6d27rPNBpLMRoCcvjSaaNxLJTy9BRgrgWemDfnpLu9vZ0nnniCG2+8kX/4h3+gXLb+0Pp8Pt7+9rfzxS9+kfb29gULVERERNzFKTJV09ZtLIa0nXSn7D2T4n3FdKZS6dlkT+N01Eq6p4cOGIthIQ0M7yfuvIfbO43GUoxHgST+dM5oHAsmlQKgEDPT6UHMO6n/86tWreLRRx9ldHSUXbt2AbB69WqaVPpeRERkSSkVi5UT9sbOlcbiyEZ8QJnM6NAJjxVvGOt7FYAS0LFinbE4ZsbWoLEYFtJo/26cy2X+ujqjsVhV6kcIOnUiqozTAq8YNdPpQcx7TZdbmpqaeOMb3zjfsYiIiIhHjI8NVGYj21eaS4xyUT9QpGjvmRTvG9i3Ez+QisK6ZnMFvrL22CpMjhmLYSFND1sz+Lkg+MNmK/87VeqdvuHVxm+404OYp938IiIictJ691gdTUpAi8ElwPmoNX/g7JkU7xuz91Cnoxht1eUU96JKx1Z6ZACg0iPbpFB9AwBhu05Etam0wEvUGI5ETDGadK9cuRKfz3fEx0033QRAJpPhpptuorm5mZqaGt75zncyMDAw62fs27ePyy+/nHg8TltbG7feeiuFwuylKT/72c94wxveQCQSYfXq1Xzta187Ipb77ruPlStXEo1G2bBhA7/+9a8X7HmLiIh43WivVbgsHbWKTplSjFmP7UtVZwGmpWh66CAAacPJoDO2ysmU2UAWSG5yFHCW0ZsVtavUR6o26bY6PQQMdXoQ84wm3b/5zW/o6+urfGzbtg2Aq666CoCbb76Z//iP/+C73/0uP//5z+nt7eUv//IvK/++WCxy+eWXk8vleOKJJ/j617/O1772NW6//fbKMXv27OHyyy/nbW97G7///e/5u7/7Oz70oQ/x2GOPVY759re/zS233MLHP/5xfvvb3/K6172OzZs3MzhYnXt4RERETtXkwH7AfGJUilvLNQPVWoBpCcqOWfvzs1GzyWAxZjVVDtj7catNcXoCgFzUfEXtmhZrG0GkOl/qygx+pKHZcCRiitGku7W1lY6OjsrHww8/zOmnn86f/umfMjExwb/+679y991382d/9mecf/75PPDAAzzxxBM89dRTADz++OO88MILfOMb3+D1r389l112GXfeeSf33XcfuZz1x/f+++9n1apV3HXXXaxbt46tW7fyrne9i89//vOVOO6++26uv/56rr32WtavX8/9999PPB7nq1/9qpHXRURExO2yY9aF6YzhxMhZrhlKV2cBpqWoMGHtoc6Z7mmcSABUbXEvZwbf2aJhUuOyVYDVKi6Trb6VBU4/9ERrl9lAxBjX7OnO5XJ84xvf4IMf/CA+n49nnnmGfD7Ppk2bKsesXbuWFStW8OSTTwLw5JNPcs4558xqVbZ582YmJyd5/vnnK8cc+jOcY5yfkcvleOaZZ2Yd4/f72bRpU+UYERERmS0/MQJAzvDSVH9dPTCzfFO8r9LT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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdeZgU5fU24Keq19kXHBjAAQQ3cEGiURGNEkVEJWASo6hBxF35ghsGYxSUaIgLxn3JAtGgMS4hBI0IGOTHqriQaABRIKAMOMDsPdNb1fdHLV3VXdVdNdPD9DDPfV1cYbqrqwvUN3XqnPccQZZlGURERERERESUdWJnXwARERERERHRwYpBNxEREREREVEHYdBNRERERERE1EEYdBMRERERERF1EAbdRERERERERB2EQTcRERERERFRB2HQTURERERERNRBGHQTERERERERdRAG3UREREREREQdhEE3ERFRN7Flyxace+65KCkpgSAIWLBgQWdfUtZNmjQJhYWFnX0ZREREOgbdRETU5Wzbtg1TpkzBkUceifz8fOTn52PIkCG4+eab8e9//7tTrumrr77C9ddfj4EDByIYDKK4uBgjRozA448/jpaWlqx/XygUwsyZM7F8+XLHn7nyyivxn//8Bw888ABeeuklnHTSSVm/Ls327dshCILtr9mzZ3fYd7fFvHnz0l6v9mvAgAFZ+b7Vq1dj5syZqKury8r5iIgod3k7+wKIiIjcWLRoES655BJ4vV5cfvnlGDp0KERRxKZNm/Dmm2/i2WefxbZt29C/f/8Ddk1vvfUWLr74YgQCAUycOBHHHnssIpEIVq5ciWnTpuHzzz/HCy+8kNXvDIVCuO+++wAAZ511VsbjW1pasGbNGtx9992YMmVKVq8lnQkTJuD8889PeX3YsGEH7Bqc+N73voeXXnrJ9No111yDk08+Gdddd53+Wray6KtXr8Z9992HSZMmobS0NCvnJCKi3MSgm4iIuoyvvvoKl156Kfr3749ly5ahd+/epvd/85vf4JlnnoEoHrhCrm3btunX9N5775mu6eabb8aXX36Jt95664Bdj52amhoAyGqA19zcjIKCgrTHfOc738EVV1yRte/sKAMHDsTAgQNNr91www0YOHBgl7h+IiLKXSwvJyKiLuOhhx5Cc3Mz5s6dmxJwA4DX68XPfvYzVFVV6a/9+9//xqRJk/Sy78rKSkyePBn79u0zfbaxsRG33HILBgwYgEAggJ49e2LUqFH4+OOPM15TU1MT/vCHP1he0+GHH46pU6fqP8diMcyaNQuDBg1CIBDAgAED8Itf/ALhcNj0ufXr12P06NE45JBDkJeXh8MOOwyTJ08GoJRuV1RUAADuu+8+vfR55syZltc4c+ZMPfM/bdq0lDLpTz75BGPGjEFxcTEKCwtx9tlnY+3ataZzaOXX77//Pm666Sb07NkThx56aNq/G6f+/ve/44ILLkCfPn0QCAQwaNAgzJo1C/F4POXYdevW4fzzz0dZWRkKCgpw/PHH4/HHH0857ptvvsH48eNRWFiIiooK3HHHHZbnc+ubb77B5MmT0atXLwQCARxzzDH44x//mHLck08+iWOOOQb5+fkoKyvDSSedhJdffhmA8s9j2rRpAIDDDjtM/+e3ffv2dl8fERHlHma6iYioy1i0aBEOP/xwnHLKKY4/s2TJEmzduhVXXXUVKisr9VLvzz//HGvXroUgCACUrObrr7+OKVOmYMiQIdi3bx9WrlyJjRs34jvf+Y7t+f/xj39g4MCBOO200xxdzzXXXIM//elP+PGPf4zbb78d69atw69//Wts3LgRf/vb3wAA3377Lc4991xUVFRg+vTpKC0txfbt2/Hmm28CACoqKvDss8/ixhtvxEUXXYQf/vCHAIDjjz/e8jt/+MMforS0FLfeeqte7q2VSX/++ec444wzUFxcjDvvvBM+nw/PP/88zjrrLLz//vspf9c33XQTKioqcO+996K5uTnjnzcUCmHv3r0pr5eWlsLrVW5D5s2bh8LCQtx2220oLCzEe++9h3vvvRcNDQ14+OGH9c8sWbIEF154IXr37o2pU6eisrISGzduxKJFi0wPNuLxOEaPHo1TTjkFjzzyCJYuXYpHH30UgwYNwo033pjxmu3s2bMHp556KgRBwJQpU1BRUYF//vOfuPrqq9HQ0IBbbrkFAPC73/0OP/vZz/DjH/8YU6dORWtrK/79739j3bp1uOyyy/DDH/4QX3zxBV555RU89thjOOSQQwBAf5BCREQHGZmIiKgLqK+vlwHI48ePT3mvtrZWrqmp0X+FQiH9PePvNa+88ooMQF6xYoX+WklJiXzzzTe36ZrGjRvn6PhPP/1UBiBfc801ptfvuOMOGYD83nvvybIsy3/7299kAPKHH35oe66amhoZgDxjxgxH371t2zYZgPzwww+bXh8/frzs9/vlr776Sn9t165dclFRkfy9731Pf23u3LkyAPn000+XY7GY4++z+7VmzRr9WKt/Rtdff72cn58vt7a2yrIsy7FYTD7ssMPk/v37y7W1taZjJUnSf3/llVfKAOT777/fdMywYcPkE088MeN1GxUUFMhXXnml/vPVV18t9+7dW967d6/puEsvvVQuKSnR/xzjxo2TjznmmLTnfvjhh2UA8rZt21xdExERdT0sLycioi6hoaEBgHUjq7POOgsVFRX6r6efflp/Ly8vT/99a2sr9u7di1NPPRUATKXjpaWlWLduHXbt2uX6moqKihwd//bbbwMAbrvtNtPrt99+OwDoe7+1fdeLFi1CNBp1fD1uxeNxvPvuuxg/frxpP3Pv3r1x2WWXYeXKlfqfUXPttdfC4/E4/o7rrrsOS5YsSfk1ZMgQ/RjjP6PGxkbs3bsXZ5xxBkKhEDZt2gRAKYHftm0bbrnllpR96Vq1gtENN9xg+vmMM87A1q1bHV93MlmW8cYbb2Ds2LGQZRl79+7Vf40ePRr19fX6v0+lpaX4+uuv8eGHH7b5+4iI6ODRrYPuFStWYOzYsejTp0+b55XKsoxHHnkERx55JAKBAPr27YsHHngg+xdLRNTNaYFtU1NTynvPP/88lixZgj//+c8p7+3fvx9Tp05Fr169kJeXh4qKChx22GEAgPr6ev24hx56CJ999hmqqqpw8sknY+bMmRmDtOLiYgBKoOjE//73P4iiiMMPP9z0emVlJUpLS/G///0PAHDmmWfiRz/6Ee677z4ccsghGDduHObOnZuy77u9ampqEAqFcNRRR6W8N3jwYEiShJ07d5pe1/7unDriiCNwzjnnpPzS/u4ApcT9oosuQklJCYqLi1FRUaE3L9P+GX311VcAgGOPPTbjdwaDwZRS7bKyMtTW1rq6dqOamhrU1dXhhRdeMD3gqaiowFVXXQVA2RYAAD//+c9RWFiIk08+GUcccQRuvvlmrFq1qs3fTUREXVu33tPd3NyMoUOHYvLkyfp+OLemTp2Kd999F4888giOO+447N+/H/v378/ylRIRUUlJCXr37o3PPvss5T1t37FVI6qf/OQnWL16NaZNm4YTTjgBhYWFkCQJ5513HiRJMh13xhln4G9/+xveffddPPzww/jNb36DN998E2PGjLG8puLiYvTp08fymtKxyswmv//6669j7dq1+Mc//oHFixdj8uTJePTRR7F27dqsja1qC2NWOhvq6upw5plnori4GPfffz8GDRqEYDCIjz/+GD//+c9N/4yccpOJd0q7jiuuuAJXXnml5THanvrBgwdj8+bNWLRoEd555x288cYbeOaZZ3DvvffqY96IiKj76NZB95gxY2xvpAAgHA7j7rvvxiuvvIK6ujoce+yx+M1vfqPPQ924cSOeffZZfPbZZ3qWwG0GgIiInLvgggvw+9//Hh988AFOPvnkjMfX1tZi2bJluO+++3Dvvffqr2/ZssXy+N69e+Omm27CTTfdhG+//Rbf+c538MADD6T9/4oLL7wQL7zwAtasWYPhw4envZ7+/ftDkiRs2bIFgwcP1l/fs2cP6urqUmaLn3rqqTj11FPxwAMP4OWXX8bll1+Ov/zlL7jmmmsyBu5OVFRUID8/H5s3b055b9OmTRBF0dQJviMsX74c+/btw5tvvonvfe97+uvbtm0zHTdo0CAAwGeffYZzzjmnQ6/JSkVFBYqKihCPxx19f0FBAS655BJccskliEQi+OEPf4gHHngAd911F4LBYFb++RERUdfQrcvLM5kyZQrWrFmDv/zlL/j3v/+Niy++GOedd55+s6Z1rF20aBEOO+wwDBgwANdccw0z3UREHeTOO+9Efn4+Jk+ejD179qS8L8uy6Wct45n8+m9/+1vTz/F43FRqDgA9e/ZEnz59MpZ033nnnSgoKMA111xjeU1fffWVPtLq/PPPt/z+OXPmAFAeKgDKw4Lkaz7hhBMAQL+e/Px8AEqmuK08Hg/OPfdc/P3vfzdVCezZswcvv/wyTj/9dFMZeEew+mcUiUTwzDPPmI77zne+g8MOOwy//e1vU/7MyX9XHXWdP/rRj/DGG29YVjZoc9ABpIyj8/v9GDJkCGRZ1vfoa/PN2/PPj4iIuoZunelOZ8eOHZg7dy527NiBPn36AADuuOMOvPPOO5g7dy4efPBBbN26Ff/73//w2muv4cUXX0Q8Hsett96KH//4x3jvvfc6+U9ARHTwOeKII/Dyyy9jwoQJOOqoo3D55Zdj6NChkGUZ27Ztw8svvwxRFPX50cXFxfje976Hhx56CNFoFH379sW7776bkkVtbGzEoYceih//+McYOnQoCgsLsXTpUnz44Yd49NFH017ToEGD8PLLL+OSSy7B4MGDMXHiRBx77LGIRCJYvXo1XnvtNUyaNAkAMHToUFx55ZV44YUX9LLqDz74AH/6058wfvx4jBw5EgDwpz/9Cc888wwuuugiDBo0CI2Njfjd736H4uJiPXDPy8vDkCFD8Oqrr+LII49EeXk5jj32WEd7no1+9atfYcmSJTj99NNx0003wev14vnnn0c4HMZDDz3k6lxWPv74Y8u99oMGDcLw4cNx2mmnoaysDFdeeSV+9rOfQRAEvPTSSymBtCiKePbZZzF27FiccMIJuOqqq9C7d29s2rQJn3/+ORYvXtzua81k9uzZ+Ne//oVTTjkF1157LYYMGYL9+/fj448/xtKlS/WH7ueeey4qKysxYsQI9OrVCxs3bsRTTz2FCy64QO9NcOKJJwIA7r77blx66aXw+XwYO3asHowTEdFBpJO6puccAPLf/vY3/edFixbJAOSCggLTL6/XK//kJz+RZVmWr732WhmAvHnzZv1zH330kQxA3rRp04H+IxARdRtffvmlfOONN8qHH364HAwG5by8PPnoo4+Wb7jhBvnTTz81Hfv111/LF110kVxaWiqXlJTIF198sbxr1y7TuK1wOCxPmzZNHjp0qFxUVCQXFBTIQ4cOlZ955hnH1/TFF1/I1157rTxgwADZ7/fLRUVF8ogRI+Qnn3xSH3sly7IcjUbl++67Tz7ssMNkn88nV1VVyXfddZfpmI8//lieMGGC3K9fPzkQCMg9e/aUL7zwQnn9+vWm71y9erV84oknyn6/P+P4MLuRYdr3jR49Wi4sLJTz8/PlkSNHyqtXrzYdo40MSzfGzOr77H4ZR3GtWrVKPvXUU+W8vDy5T58+8p133ikvXrxYBiD/61//Mp135cqV8qhRo/R/Tscff7z85JNP6u9feeWVckFBQcr1zJgxQ3Z725M8MkyWZXnPnj3yzTffLFdVVck+n0+urKyUzz77bPmFF17Qj3n++efl733ve3KPHj3kQCAgDxo0SJ42bZpcX19vOtesWbPkvn37yqIocnwYEdFBTJDlA1CT1QUIgoC//e1vGD9+PADg1VdfxeWXX47PP/88pSFLYWEhKisrMWPGDDz44IOmcS4tLS3Iz8/Hu+++i1GjRh3IPwIRERERERHlGJaX2xg2bBji8Ti+/fZbnHHGGZbHjBgxArFYDF999ZXe4OWLL74AgJRmOERERERERNT9dOtMd1NTE7788ksASpA9Z84cjBw5EuXl5ejXrx+uuOIKrFq1Co8++iiGDRuGmpoaLFu2DMcffzwuuOACSJKE7373uygsLMRvf/tbSJKEm2++GcXFxXj33Xc7+U9HREREREREna1bB93Lly/Xm9YYXXnllZg3bx6i0Sh+9atf4cUXX8Q333yDQw45BKeeeiruu+8+HHfccQCAXbt24f/9v/+Hd999FwUFBRgzZgweffRRlJeXH+g/DhEREREREeWYbh10ExEREREREXUkzukmIiIiIiIi6iAMuomIiIiIiIg6SLfrXi5JEnbt2oWioiIIgtDZl0NERERERERdkCzLaGxsRJ8+fSCK9vnsbhd079q1C1VVVZ19GURERERERHQQ2LlzJw499FDb97td0F1UVARA+YspLi7u5KshIiIiIiKirqihoQFVVVV6jGmn2wXdWkl5cXExg24iIiIiIiJql0zbltlIjYiIiIiIiKiDMOgmIiIiIiIi6iAMuomIiIiIiIg6SLfb0+1UPB5HNBrt7Mugg4jf7087SoCIiIiIiA4+DLqTyLKM3bt3o66urrMvhQ4yoijisMMOg9/v7+xLISIiIiKiA4RBdxIt4O7Zsyfy8/MzdqIjckKSJOzatQvV1dXo168f/70iIiIiIuomGHQbxONxPeDu0aNHZ18OHWQqKiqwa9cuxGIx+Hy+zr4cIiIiIiI6ALjB1EDbw52fn9/JV0IHI62sPB6Pd/KVEBERERHRgcKg2wJLf6kj8N8rIiIiIqLuh0E3ERERERERUQdh0E2OzZw5EyeccEK7zrF9+3YIgoBPP/00K9dk56yzzsItt9zSod9BRERERESUCYPug8jOnTsxefJk9OnTB36/H/3798fUqVOxb98+1+cSBAELFiwwvXbHHXdg2bJl7brGqqoqVFdX49hjj23XeTTLly+HIAgpI97efPNNzJo1KyvfYWfDhg2YMGECqqqqkJeXh8GDB+Pxxx/v0O8kIiIiIqKuhd3LDxJbt27F8OHDceSRR+KVV17BYYcdhs8//xzTpk3DP//5T6xduxbl5eXt+o7CwkIUFha26xwejweVlZXtOocT7f2zOvHRRx+hZ8+e+POf/4yqqiqsXr0a1113HTweD6ZMmdLh309ERERERLmPme6DxM033wy/3493330XZ555Jvr164cxY8Zg6dKl+Oabb3D33Xfrxw4YMACzZs3ChAkTUFBQgL59++Lpp582vQ8AF110EQRB0H9OLi+fNGkSxo8fjwcffBC9evVCaWkp7r//fsRiMUybNg3l5eU49NBDMXfuXP0zyeXlkyZNgiAIKb+WL18OAHjppZdw0kknoaioCJWVlbjsssvw7bff6ucaOXIkAKCsrAyCIGDSpEkAUsvLa2trMXHiRJSVlSE/Px9jxozBli1b9PfnzZuH0tJSLF68GIMHD0ZhYSHOO+88VFdX2/6dT548GY8//jjOPPNMDBw4EFdccQWuuuoqvPnmm47+mRERERER0cGPQXcGsiwjFIl1yi9Zlh1d4/79+7F48WLcdNNNyMvLM71XWVmJyy+/HK+++qrpfA8//DCGDh2KTz75BNOnT8fUqVOxZMkSAMCHH34IAJg7dy6qq6v1n62899572LVrF1asWIE5c+ZgxowZuPDCC1FWVoZ169bhhhtuwPXXX4+vv/7a8vOPP/44qqur9V9Tp05Fz549cfTRRwNQxrjNmjULGzZswIIFC7B9+3Y9sK6qqsIbb7wBANi8eTOqq6tty7snTZqE9evXY+HChVizZg1kWcb555+vj4kDgFAohEceeQQvvfQSVqxYgR07duCOO+5I91efor6+/oBk2YmIiIiIqGtgeXkGLdE4hty7uFO++7/3j0a+P/M/oi1btkCWZQwePNjy/cGDB6O2thY1NTXo2bMnAGDEiBGYPn06AODII4/EqlWr8Nhjj2HUqFGoqKgAAJSWlmYsBS8vL8cTTzwBURRx1FFH4aGHHkIoFMIvfvELAMBdd92F2bNnY+XKlbj00ktTPl9SUoKSkhIAyj7s559/HkuXLtW/d/LkyfqxAwcOxBNPPIHvfve7aGpqQmFhoR7g9uzZE6WlpbZ/PwsXLsSqVatw2mmnAQDmz5+PqqoqLFiwABdffDEAJcB/7rnnMGjQIADAlClTcP/996f98xutXr0ar776Kt566y3HnyEiIiIiooMbM90HEaeZcQAYPnx4ys8bN250/Z3HHHMMRDHxr1GvXr1w3HHH6T97PB706NFDLwm388knn+CnP/0pnnrqKYwYMUJ//aOPPsLYsWPRr18/FBUV4cwzzwQA7Nixw/E1bty4EV6vF6eccor+Wo8ePXDUUUeZ/sz5+fl6wA0AvXv3znjdms8++wzjxo3DjBkzcO655zq+NiIiIiIiOrgx051Bns+D/94/utO+24nDDz8cgiBg48aNuOiii1Le37hxI8rKyvQMdjb5fD7Tz4IgWL4mSZLtOXbv3o0f/OAHuOaaa3D11Vfrrzc3N2P06NEYPXo05s+fj4qKCuzYsQOjR49GJBLJ7h8E1n8WJw8y/vvf/+Lss8/Gddddh1/+8pdZvy4iIiIiIuq6GHRnIAiCoxLvztSjRw+MGjUKzzzzDG699VbTvu7du3dj/vz5mDhxIgRB0F9fu3at6Rxr1641laf7fD7E4/EOv/bW1laMGzcORx99NObMmWN6b9OmTdi3bx9mz56NqqoqAMD69etNx/j9fgBIe62DBw9GLBbDunXr9PLyffv2YfPmzRgyZEi7rv/zzz/H97//fVx55ZV44IEH2nUuIiIiIiI6+LC8/CDx1FNPIRwOY/To0VixYgV27tyJd955B6NGjULfvn1TAsJVq1bhoYcewhdffIGnn34ar732GqZOnaq/P2DAACxbtgy7d+9GbW1th1339ddfj507d+KJJ55ATU0Ndu/ejd27dyMSiaBfv37w+/148sknsXXrVixcuDBl9nb//v0hCAIWLVqEmpoaNDU1pXzHEUccgXHjxuHaa6/FypUrsWHDBlxxxRXo27cvxo0b1+Zr/+yzzzBy5Eice+65uO222/Rrr6mpafM5iYiIiIjo4MKg+yBxxBFHYP369Rg4cCB+8pOfYNCgQbjuuuswcuRIrFmzJqWj9u23347169dj2LBh+NWvfoU5c+Zg9OhEGf2jjz6KJUuWoKqqCsOGDeuw637//fdRXV2NIUOGoHfv3vqv1atXo6KiAvPmzcNrr72GIUOGYPbs2XjkkUdMn+/bty/uu+8+TJ8+Hb169bKdjz137lyceOKJuPDCCzF8+HDIsoy33347paTcjddffx01NTX485//bLr27373u20+JxERHVyklhZXPVeckCUJUmtrmz4bq6lB5OtvLH/F9u7N6nUSUceo/8c/8O2jj7peW1r/+198/bOp2Hn9DZa/vr7lVoS//NLVOeV4HHtm/wYNi9919bnuRpCz/f8EOa6hoQElJSWor69HcXGx6b3W1lZs27YNhx12GILBYCddYccbMGAAbrnlFtMca+p43eXfLyIi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hKGbiIiIiIiIaJUwdBMRERERERGtEoZuIiIiIiIiolXC0E1ERERERES0Shi6iYiIiIiIiFYJQzcRERERERHRKmHoJiIiIiIiIlolDN1EREREREREq4Shm4iIiIiIiGiVMHQTERERERERrRKGbiIiIiIiIqJVwtBNREREREREtEoYuomIiIiIiIhWCUM3ERERERER0Sph6CYiIiIiIiJaJQzdRERERERERKtET/sE1prv+wCA+fn5lM+EiIiIiIiIJpXKlCpjdpK50L2wsAAA2LlzZ8pnQkRERERERJNuYWEB09PTHT8v/F6xfJ3xPA+PPPIIisUihBBpnw4RERERERFNIN/3sbCwgG3btkHKziu3Mxe6iYiIiIiIiNYKB6kRERERERERrRKGbiIiIiIiIqJVwtBNREREREREtEoYuomIiIiIiIhWCUM3ERHROieE6PrP+973vqGO/dWvfnVk50pERLTeZG6fbiIioqx59NFHo4+/+MUv4rLLLsM999wT/V6hUEjjtIiIiDKBlW4iIqJ1buvWrdE/09PTEEI0/N4XvvAFnHDCCbBtG8cffzw+/vGPR++tVCq45JJLcMQRR8C2bRx11FG4/PLLAQC7du0CALzyla+EECL6NREREdWx0k1ERJRh1113HS677DJ87GMfwzOe8Qz88Ic/xMUXX4x8Po8LL7wQH/nIR/C1r30NX/rSl3DkkUfiwQcfxIMPPggA+P73v4/NmzfjmmuuwbnnngtN01L+ryEiIho/DN1EREQZ9t73vhcf+tCH8Ju/+ZsAgN27d+Ouu+7Cpz71KVx44YV44IEHcOyxx+K5z30uhBA46qijovdu2rQJADAzM4OtW7emcv5ERETjjqGbiIgoo0qlEvbu3Ys3velNuPjii6Pfr9VqmJ6eBgC88Y1vxItf/GIcd9xxOPfcc/Frv/ZrOOecc9I6ZSIioonD0E1ERJRRi4uLAICrr74aZ5xxRsPnVKv4M5/5TNx3333453/+Z9xwww149atfjbPPPht///d/v+bnS0RENIkYuomIiDJqy5Yt2LZtG37xi1/gggsu6Pi6qakpnH/++Tj//PPxqle9Cueeey6efPJJzM3NwTAMuK67hmdNREQ0WRi6iYiIMuz9738/3va2t2F6ehrnnnsuyuUybrvtNhw8eBCXXnoprrjiChxxxBF4xjOeASkl/u7v/g5bt27FzMwMgGCC+Y033ojnPOc5sCwLs7Oz6f4HERERjRluGUZERJRhv/u7v4tPf/rTuOaaa3DSSSfhec97Hv76r/8au3fvBgAUi0X8xV/8BU499VScdtppuP/++/GNb3wDUga3EB/60Ifw7W9/Gzt37sQznvGMNP9TiIiIxpLwfd9P+ySIiIiIiIiI1iNWuomIiIiIiIhWCUM3ERERERER0Sph6CYiIiIiIiJaJQzdRERERERERKuEoZuIiIiIiIholTB0ExEREREREa0Shm4iIiIiIiKiVcLQTURERERERLRKGLqJiIiIiIiIVglDNxEREREREdEqYegmIiIiIiIiWiUM3URERERERESr5P8HK2AVgFnAK9kAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3hUZf7+8feZ9DIpQEJCCC20hK4gTZoQIgoCu2vfRQTbCru4tsXd72/tK2tdXRu6K1iwrA2QVSGhSpVeQ++QQICQ3uf8/khmINISyOSk3K/rmutyZs6cc88EIZ95nufzGKZpmoiIiIiIiIhIlbNZHUBERERERESkrlLRLSIiIiIiIuImKrpFRERERERE3ERFt4iIiIiIiIibqOgWERERERERcRMV3SIiIiIiIiJuoqJbRERERERExE1UdIuIiIiIiIi4iYpuERERERERETdR0S0iIlJP7Nq1i6FDhxIcHIxhGMycOdPqSFVu7NixBAYGWh1DRETERUW3iIjUOvv27WPixIm0bdsWf39//P39iYuLY8KECWzatMmSTHv27OH++++nVatW+Pr6EhQURN++fXn99dfJy8ur8uvl5uby1FNPsWjRogq/5q677mLz5s08//zzfPzxx3Tv3r3Kcznt378fwzAueJsyZYrbrn05pk+fftG8zluLFi2q5HrLly/nqaee4vTp01VyPhERqbk8rQ4gIiJSGXPmzOHWW2/F09OTO++8ky5dumCz2di+fTvffPMN77zzDvv27aN58+bVlul///sfN998Mz4+PowZM4aOHTtSWFjI0qVLeeyxx9i6dSvvvfdelV4zNzeXp59+GoCBAwde8vi8vDxWrFjBX//6VyZOnFilWS7m9ttv54Ybbjjn8W7dulVbhoro378/H3/8cbnH7rnnHq655hruu+8+12NVNYq+fPlynn76acaOHUtISEiVnFNERGomFd0iIlJr7Nmzh9tuu43mzZszf/58IiMjyz3/j3/8g7fffhubrfomcu3bt8+VacGCBeUyTZgwgd27d/O///2v2vJcSFpaGkCVFng5OTkEBARc9JirrrqK3/72t1V2TXdp1aoVrVq1KvfYAw88QKtWrWpFfhERqbk0vVxERGqNF198kZycHKZNm3ZOwQ3g6enJH//4R6Kjo12Pbdq0ibFjx7qmfUdERDBu3DhOnjxZ7rVZWVk89NBDtGjRAh8fH8LDw4mPj2fdunWXzJSdnc1//vOf82Zq3bo1kyZNct0vLi7m2WefJSYmBh8fH1q0aMFf/vIXCgoKyr1uzZo1JCQk0KhRI/z8/GjZsiXjxo0DSqduh4WFAfD000+7pj4/9dRT58341FNPuUb+H3vssXOmSa9fv55hw4YRFBREYGAggwcPZuXKleXO4Zx+vXjxYh588EHCw8Np2rTpRT+bipo1axY33ngjTZo0wcfHh5iYGJ599llKSkrOOXbVqlXccMMNhIaGEhAQQOfOnXn99dfPOe7IkSOMGjWKwMBAwsLCePTRR897vso6cuQI48aNo3Hjxvj4+NChQwc++OCDc47717/+RYcOHfD39yc0NJTu3bvz6aefAqU/j8ceewyAli1bun5++/fvv+J8IiJS82ikW0REao05c+bQunVrevbsWeHXJCYmsnfvXu6++24iIiJcU723bt3KypUrMQwDKB3V/Oqrr5g4cSJxcXGcPHmSpUuXkpyczFVXXXXB83/33Xe0atWKPn36VCjPPffcw4cffshvfvMbHnnkEVatWsULL7xAcnIy3377LQDHjx9n6NChhIWFMXnyZEJCQti/fz/ffPMNAGFhYbzzzjv8/ve/Z/To0fzqV78CoHPnzue95q9+9StCQkL405/+5Jru7ZwmvXXrVvr160dQUBCPP/44Xl5eTJ06lYEDB7J48eJzPusHH3yQsLAw/va3v5GTk3PJ95ubm8uJEyfOeTwkJARPz9JfQ6ZPn05gYCAPP/wwgYGBLFiwgL/97W9kZmby0ksvuV6TmJjI8OHDiYyMZNKkSURERJCcnMycOXPKfbFRUlJCQkICPXv25OWXXyYpKYlXXnmFmJgYfv/7318y84UcO3aMXr16YRgGEydOJCwsjB9++IHx48eTmZnJQw89BMD777/PH//4R37zm98wadIk8vPz2bRpE6tWreKOO+7gV7/6FTt37uSzzz7jtddeo1GjRgCuL1JERKSOMUVERGqBjIwMEzBHjRp1znPp6elmWlqa65abm+t67uz/dvrss89MwFyyZInrseDgYHPChAmXlWnkyJEVOn7Dhg0mYN5zzz3lHn/00UdNwFywYIFpmqb57bffmoC5evXqC54rLS3NBMwnn3yyQtfet2+fCZgvvfRSucdHjRplent7m3v27HE9dvToUdNut5v9+/d3PTZt2jQTMK+99lqzuLi4wte70G3FihWuY8/3M7r//vtNf39/Mz8/3zRN0ywuLjZbtmxpNm/e3ExPTy93rMPhcP33XXfdZQLmM888U+6Ybt26mVdfffUlc58tICDAvOuuu1z3x48fb0ZGRponTpwod9xtt91mBgcHu97HyJEjzQ4dOlz03C+99JIJmPv27atUJhERqX00vVxERGqFzMxM4PyNrAYOHEhYWJjr9tZbb7me8/Pzc/13fn4+J06coFevXgDlpo6HhISwatUqjh49WulMdru9Qsd///33ADz88MPlHn/kkUcAXGu/neuu58yZQ1FRUYXzVFZJSQnz5s1j1KhR5dYzR0ZGcscdd7B06VLXe3S699578fDwqPA17rvvPhITE8+5xcXFuY45+2eUlZXFiRMn6NevH7m5uWzfvh0onQK/b98+HnrooXPWpTtnK5ztgQceKHe/X79+7N27t8K5f8k0Tb7++mtGjBiBaZqcOHHCdUtISCAjI8P15ykkJITDhw+zevXqy76eiIjUHfW66F6yZAkjRoygSZMml7Vf6VNPPXXe7UQu1VRGREQqz1nYZmdnn/Pc1KlTSUxM5JNPPjnnuVOnTjFp0iQaN26Mn58fYWFhtGzZEoCMjAzXcS+++CJbtmwhOjqaa665hqeeeuqSRVpQUBBQWihWxIEDB7DZbLRu3brc4xEREYSEhHDgwAEABgwYwK9//WuefvppGjVqxMiRI5k2bdo5676vVFpaGrm5ubRr1+6c52JjY3E4HBw6dKjc487PrqLatGnDkCFDzrk5PzsoneI+evRogoODCQoKIiwszNW8zPkz2rNnDwAdO3a85DV9fX3PmaodGhpKenp6pbKfLS0tjdOnT/Pee++V+4InLCyMu+++GyhdFgDw5z//mcDAQK655hratGnDhAkTWLZs2WVfW0REard6vaY7JyeHLl26MG7cONd6uMp49NFHz/kmffDgwfTo0aOqIoqISJng4GAiIyPZsmXLOc851x2frxHVLbfcwvLly3nsscfo2rUrgYGBOBwOrr/+ehwOR7nj+vXrx7fffsu8efN46aWX+Mc//sE333zDsGHDzpspKCiIJk2anDfTxZxvZPaXz3/11VesXLmS7777jrlz5zJu3DheeeUVVq5cWWXbVl2Os0elq8Lp06cZMGAAQUFBPPPMM8TExODr68u6dev485//XO5nVFGVGYmvKGeO3/72t9x1113nPca5pj42NpYdO3YwZ84cfvzxR77++mvefvtt/va3v7m2eRMRkfqjXo90Dxs2jOeee47Ro0ef9/mCggIeffRRoqKiCAgIoGfPnixatMj1fGBgIBEREa7bsWPH2LZtG+PHj6+mdyAiUr/ceOON7N69m59//rlCx6enpzN//nwmT57M008/zejRo4mPjz9nayinyMhIHnzwQWbOnMm+ffto2LAhzz///EWvMXz4cPbs2cOKFSsumad58+Y4HA527dpV7vFjx45x+vTpc/YW79WrF88//zxr1qxhxowZbN26lc8//xy4dOFeEWFhYfj7+7Njx45zntu+fTs2m61cJ3h3WLRoESdPnmT69OlMmjSJ4cOHM2TIEEJDQ8sdFxMTA1DpLziqSlhYGHa7nZKSkvOO3A8ZMoTw8HDX8QEBAdx6661MmzaNgwcPcuONN/L888+Tn58PVM3PT0REaod6XXRfysSJE1mxYgWff/45mzZt4uabb+b6668/55clp3//+9+0bduWfv36VXNSEZH64fHHH8ff359x48Zx7Nixc543TbPcfeeI5y8f/+c//1nufklJSbmp5gDh4eE0adLkklO6H3/8cQICArjnnnvOm2nPnj2uLa1uuOGG817/1VdfBUq/VIDSLwt+mblr164Arjz+/v5A6Ujx5fLw8GDo0KHMmjWr3CyBY8eO8emnn3LttdeWmwbuDuf7GRUWFvL222+XO+6qq66iZcuW/POf/zznPf/ys3JXzl//+td8/fXX5y38nfugA+dsR+ft7U1cXBymabrW6DuXol3Jz09ERGqHej29/GIOHjzo+na6SZMmQOl08h9//JFp06bx97//vdzx+fn5zJgxg8mTJ1sRV0SkXmjTpg2ffvopt99+O+3atePOO++kS5cumKbJvn37+PTTT7HZbK79o4OCgujfvz8vvvgiRUVFREVFMW/ePPbt21fuvFlZWTRt2pTf/OY3dOnShcDAQJKSkli9ejWvvPLKRTPFxMTw6aefcuuttxIbG8uYMWPo2LEjhYWFLF++nC+//JKxY8cC0KVLF+666y7ee+8917Tqn3/+mQ8//JBRo0YxaNAgAD788EPefvttRo8eTUxMDFlZWbz//vsEBQW5Cnc/Pz/i4uL44osvaNu2LQ0aNKBjx44VWvN8tueee47ExESuvfZaHnzwQTw9PZk6dSoFBQW8+OKLlTrX+axbt+68a+1jYmLo3bs3ffr0ITQ0lLvuuos//vGPGIbBxx9/fE4hbbPZeOeddxgxYgRdu3bl7rvvJjIyku3bt7N161bmzp17xVkvZcqUKSxcuJCePXty7733EhcXx6lTp1i3bh1JSUmcOnUKgKFDhxIREUHfvn1p3LgxycnJvPnmm9x4442u3gRXX301AH/961+57bbb8PLyYsSIEeoLIyJSF1nVNr2mAcxvv/3WdX/OnDkmYAYEBJS7eXp6mrfccss5r//0009NT09PMzU1tRpTi4jUT7t37zZ///vfm61btzZ9fX1NPz8/s3379uYDDzxgbtiwodyxhw8fNkePHm2GhISYwcHB5s0332wePXq03HZbBQUF5mOPPWZ26dLFtNvtZkBAgNmlSxfz7bffrnCmnTt3mvfee6/ZokUL09vb27Tb7Wbfvn3Nf/3rX65tr0zTNIuKisynn37abNmypenl5WVGR0ebTzzxRLlj1q1bZ95+++1ms2bNTB8fHzM8PNwcPny4uWbNmnLXXL58uXn11Veb3t7el9w+7EJbhjmvl5CQYAYGBpr+/v7moEGDzOXLl5c7xrll2MW2MTvf9S50O3srrmXLlpm9evUy/fz8zCZNmpiPP/64OXfuXBMwFy5cWO68S5cuNePj410/p86dO5v/+te/XM/fddddZkBAwDl5nnzySbOyv/b8cssw0zTNY8eOmRMmTDCjo6NNLy8vMyIiwhw8eLD53nvvuY6ZOnWq2b9/f7Nhw4amj4+PGRMTYz722GNmRkZGuXM9++yzZlRUlGmz2bR9mIhIHWaYZjXMyaoFDMPg22+/ZdSoUQB88cUX3HnnnWzduvWchizOtdxnGzx4MEFBQXz77bfVFVlERERERERqOE0vv4Bu3bpRUlLC8ePHL7lGe9++fSxcuJDZs2dXUzoRERERERGpDep10Z2dnc3u3btd9/ft28eGDRto0KABbdu25c4772TMmDG88sordOvWjbS0NObPn0/nzp1dzW4APvjgAyIjIy+4pYyIiIiIiIjUT/V6evmiRYtcTWvOdtdddzF9+nSKiop47rnn+Oijjzhy5AiNGjWiV69ePP3003Tq1Ako3bezefPmjBkz5pLbyoiIiIiIiEj9Uq+LbhERERERERF30j7dIiIiIiIiIm6ioltERERERETETepdIzWHw8HRo0ex2+0YhmF1HBEREREREamFTNMkKyuLJk2aYLNdeDy73hXdR48eJTo62uoYIiIiIiIiUgccOnSIpk2bXvD5eld02+12oPSDCQoKsjiNiIiIiIiI1EaZmZlER0e7aswLqXdFt3NKeVBQkIpuERERERERuSKXWrasRmoiIiIiIiIibmJp0f3OO+/QuXNn16hz7969+eGHHy76mi+//JL27dvj6+tLp06d+P7776sprYiIiIiIiEjlWFp0N23alClTprB27VrWrFnDddddx8iRI9m6det5j1++fDm3334748ePZ/369YwaNYpRo0axZcuWak4uIiIiIiIicmmGaZqm1SHO1qBBA1566SXGjx9/znO33norOTk5zJkzx/VYr1696Nq1K++++26Fzp+ZmUlwcDAZGRla0y0iIiIiUoeUlJRQVFRkdQypI7y8vPDw8Ljg8xWtLWtMI7WSkhK+/PJLcnJy6N2793mPWbFiBQ8//HC5xxISEpg5c+YFz1tQUEBBQYHrfmZmZpXkFRERERGRmsE0TVJTUzl9+rTVUaSOCQkJISIi4pLN0i7G8qJ78+bN9O7dm/z8fAIDA/n222+Ji4s777Gpqak0bty43GONGzcmNTX1gud/4YUXePrpp6s0s4iIiIiI1BzOgjs8PBx/f/8rKpBEoPSLnNzcXI4fPw5AZGTkZZ/L8qK7Xbt2bNiwgYyMDL766ivuuusuFi9efMHCu7KeeOKJcqPjzr3URERERESk9ispKXEV3A0bNrQ6jtQhfn5+ABw/fpzw8PCLTjW/GMuLbm9vb1q3bg3A1VdfzerVq3n99deZOnXqOcdGRERw7Nixco8dO3aMiIiIC57fx8cHHx+fqg0tIiIiIiI1gnMNt7+/v8VJpC5y/rkqKiq67KK7xu3T7XA4yq3BPlvv3r2ZP39+uccSExMvuAZcRERERETqB00pF3eoij9Xlo50P/HEEwwbNoxmzZqRlZXFp59+yqJFi5g7dy4AY8aMISoqihdeeAGASZMmMWDAAF555RVuvPFGPv/8c9asWcN7771n5dsQEREREREROS9LR7qPHz/OmDFjaNeuHYMHD2b16tXMnTuX+Ph4AA4ePEhKSorr+D59+vDpp5/y3nvv0aVLF7766itmzpxJx44drXoLIiIiIiIiNdJTTz1F165dr+gc+/fvxzAMNmzYUCWZLmTgwIE89NBDbr2GVWrcPt3upn26RURERETqjvz8fPbt20fLli3x9fW1Ok6lHDp0iCeffJIff/yREydOEBkZyahRo/jb3/5W6aZwhmHw7bffMmrUKNdj2dnZFBQUXFGDuZKSEtLS0mjUqBGenlc+UXrRokUMGjSI9PR0QkJCXI+fOnUKLy8v7Hb7FV/jQjZu3MiUKVNYunQpJ06coEWLFjzwwANMmjTpgq+52J+vWrdPt4iIiIiISH2xd+9eevfuTdu2bfnss89o2bIlW7du5bHHHuOHH35g5cqVNGjQ4IquERgYSGBg4BWdw8PD46KNq6vKlb7Xili7di3h4eF88sknREdHs3z5cu677z48PDyYOHGi265b4xqpiYiIiIiI1HUTJkzA29ubefPmMWDAAJo1a8awYcNISkriyJEj/PWvf3Ud26JFC5599lluv/12AgICiIqK4q233ir3PMDo0aMxDMN1/5fTy8eOHcuoUaP4+9//TuPGjQkJCeGZZ56huLiYxx57jAYNGtC0aVOmTZvmes0vp5ePHTsWwzDOuS1atAiAjz/+mO7du2O324mIiOCOO+5w7XW9f/9+Bg0aBEBoaCiGYTB27Fjg3Onl6enpjBkzhtDQUPz9/Rk2bBi7du1yPT99+nRCQkKYO3cusbGxBAYGcv3115dbnvxL48aN4/XXX2fAgAG0atWK3/72t9x999188803FfqZXS4V3SIiIiIiUmeYpkluYbElt4qu3D116hRz587lwQcfdO0F7RQREcGdd97JF198Ue58L730El26dGH9+vVMnjyZSZMmkZiYCMDq1asBmDZtGikpKa7757NgwQKOHj3KkiVLePXVV3nyyScZPnw4oaGhrFq1igceeID777+fw4cPn/f1r7/+OikpKa7bpEmTCA8Pp3379kDp1lrPPvssGzduZObMmezfv99VWEdHR/P1118DsGPHDlJSUnj99dfPe52xY8eyZs0aZs+ezYoVKzBNkxtuuMG1RRxAbm4uL7/8Mh9//DFLlizh4MGDPProoxf76M+RkZHh9lF2TS8XEREREZE6I6+ohLi/zbXk2tueScDf+9Il1q5duzBNk9jY2PM+HxsbS3p6OmlpaYSHhwPQt29fJk+eDEDbtm1ZtmwZr732GvHx8YSFhQEQEhJyyangDRo04I033sBms9GuXTtefPFFcnNz+ctf/gKU7jDlXPd82223nfP64OBggoODAfjmm2+YOnUqSUlJruuOGzfOdWyrVq1444036NGjB9nZ2QQGBroK3PDw8HJrun/5+cyePZtly5bRp08fAGbMmEF0dDQzZ87k5ptvBkoL/HfffZeYmBgAJk6cyDPPPHPR93+25cuX88UXX/C///2vwq+5HBrpFhERERERsUBlelr37t37nPvJycmVvmaHDh2w2c6UgY0bN6ZTp06u+x4eHjRs2NA1JfxC1q9fz+9+9zvefPNN+vbt63p87dq1jBgxgmbNmmG32xkwYABQujNVRSUnJ+Pp6UnPnj1djzVs2JB27dqVe8/+/v6ughsgMjLykrmdtmzZwsiRI3nyyScZOnRohbNdDo10i4iIiIhIneHn5cG2ZxIsu3ZFtG7dGsMwSE5OZvTo0ec8n5ycTGhoqGsEuyp5eXmVu28YxnkfczgcFzxHamoqN910E/fccw/jx493PZ6Tk0NCQgIJCQnMmDGDsLAwDh48SEJCAoWFhVX7Rjj/e6nIFxnbtm1j8ODB3Hffffzf//1flef6JRXdIiIiIiJSZxiGUaEp3lZq2LAh8fHxvP322/zpT38qt647NTWVGTNmMGbMGAzDcD2+cuXKcudYuXJluenpXl5elJSUuD17fn4+I0eOpH379rz66qvlntu+fTsnT55kypQpREdHA7BmzZpyx3h7ewNcNGtsbCzFxcWsWrXKNb385MmT7Nixg7i4uCvKv3XrVq677jruuusunn/++Ss6V0VpermIiIiIiEg1e/PNNykoKCAhIYElS5Zw6NAhfvzxR+Lj44mKijqnIFy2bBkvvvgiO3fu5K233uLLL78st790ixYtmD9/PqmpqaSnp7st9/3338+hQ4d44403SEtLIzU1ldTUVAoLC2nWrBne3t7861//Yu/evcyePZtnn3223OubN2+OYRjMmTOHtLQ0srOzz7lGmzZtGDlyJPfeey9Lly5l48aN/Pa3vyUqKoqRI0dedvYtW7YwaNAghg4dysMPP+zKnpaWdtnnrAgV3SIiIlJOSUYGKU89Rd6mTVZHERGps9q0acOaNWto1aoVt9xyCzExMdx3330MGjSIFStWnNNR+5FHHmHNmjV069aN5557jldffZWEhDPT6F955RUS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NmXRokUFw9J2796NzfbnB/Lt2rVj1qxZPPXUU4wePZqEhAQWLFjAVVddZdUliIiIiIiIiJyV5et0Fzet0y0iIiIiIiKXq7Dd0tJnukVERERERETKMpVuERERERERER9R6RYRERERERHxEZVuERERERERER9R6RYRERERERHxEZVuERERERERER9R6RYRERERERHxEZVuERERERERER9R6RYRERERERHxEZVuERERERERER9R6RYRERERERHxEZVuERERERERER9R6RYRERERERHxEZVuERERERERER9R6RYRERERERHxEYfVAYqbaZoAZGVlWZxERERERERESqvTnfJ0xzyXcle6s7OzAYiLi7M4iYiIiIiIiJR22dnZREREnPPrhnmhWl7GeDwe9u3bR1hYGIZhWB1HRERERERESiHTNMnOzqZq1arYbOd+crvclW4RERERERGR4qJBaiIiIiIiIiI+otItIiIiIiIi4iMq3SIiIiIiIiI+otItIiIiIiIi4iMq3SIiImWcYRjn/fXMM89c1rkXLFhQZFlFRETKmnK3TreIiEh5s3///oI/z507lzFjxrB169aCbaGhoVbEEhERKRf0SbeIiEgZFxMTU/ArIiICwzDO2DZnzhwaNGhAYGAg9evX54033ig41uVy8dBDDxEbG0tgYCA1atRgwoQJANSsWROAW265BcMwCl6LiIjIn/RJt4iISDn24YcfMmbMGKZMmUKzZs3YuHEjw4YNIyQkhMGDB/Pqq6/y2WefMW/ePKpXr86ePXvYs2cPAGvXrqVy5crMmDGDHj16YLfbLb4aERGRkkelW0REpBwbO3YskyZN4tZbbwUgPj6eLVu28OabbzJ48GB2795NQkICHTp0wDAMatSoUXBsdHQ0AJGRkcTExFiSX0REpKRT6RYRESmncnNz2bFjB8nJyQwbNqxge35+PhEREQDcdddddO3alXr16tGjRw9uvPFGunXrZlVkERGRUkelW0REpJzKyckB4K233iIxMfGMr52+Vbx58+bs3LmTL7/8kiVLltC3b1+6dOnCRx99VOx5RURESiOVbhERkXKqSpUqVK1ald9//50BAwacc7/w8HCSkpJISkqiT58+9OjRgyNHjlCxYkX8/Pxwu93FmFpERKR0UekWEREpx8aNG8fw4cOJiIigR48eOJ1O1q1bx9GjR0lJSWHy5MnExsbSrFkzbDYb8+fPJyYmhsjISMA7wTw1NZX27dsTEBBAhQoVrL0gERGREkZLhomIiJRjQ4cO5e2332bGjBk0atSIjh07MnPmTOLj4wEICwtj4sSJtGzZklatWpGWlsbChQux2bz/hZg0aRKLFy8mLi6OZs2aWXkpIiIiJZJhmqZpdQgRERERERGRskifdIuIiIiIiIj4iEq3iIiIiIiIiI+odIuIiIiIiIj4iEq3iIiIiIiIiI+odIuIiIiIiIj4iEq3iIiIiIiIiI+odIuIiIiIiIj4iEq3iIiIiIiIiI+odIuIiIiIiIj4iEq3iIiIiIiIiI+odIuIiIiIiIj4iEq3iIiIiIiIiI/8PwnzTCeq9jlyAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABlS0lEQVR4nO3deXhU5d3/8c+ZSSYkZMdsQCBsQhAFFEVEBaoYUBCwdUEUIouo8DO40Af0qWwuiIIFQUXbglJciiJSqiLgwsOqKNCigCBQUBKNEEAIZJvz+yNkyCQzySTkZLK8X9d1LmbOes8EJZ9zf+/7GKZpmgIAAAAAAFXO5u8GAAAAAABQVxG6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAKgn9uzZoxtuuEEREREyDEPLli3zd5OqXGpqqkJDQ/3dDAAAXAjdAIBaZ//+/Ro7dqwuvPBChYSEKCQkRO3bt9eYMWP073//2y9t+uGHHzR69Gi1bNlSDRo0UHh4uLp3767Zs2fr9OnTVX697OxsTZ48WZ9//rnPxwwbNkz/+c9/9NRTT2nRokXq0qVLlberyIEDB2QYhtdl+vTpll27MhYuXFhme4uWpKSkKrnehg0bNHnyZB07dqxKzgcAqLkC/N0AAAAqYsWKFbr99tsVEBCgIUOGqGPHjrLZbNq1a5eWLl2ql19+Wfv371fz5s2rrU3/+te/dOuttyooKEhDhw5Vhw4dlJubq3Xr1mn8+PH69ttv9eqrr1bpNbOzszVlyhRJUs+ePcvd//Tp09q4caMef/xxjR07tkrbUpbBgwfrxhtvLLW+c+fO1dYGX1x77bVatGiR27qRI0fqiiuu0L333utaV1W96Bs2bNCUKVOUmpqqyMjIKjknAKBmInQDAGqNH374QXfccYeaN2+uNWvWKCEhwW37s88+q5deekk2W/UVcu3fv9/Vpk8//dStTWPGjNHevXv1r3/9q9ra401mZqYkVWnAO3XqlBo2bFjmPpdeeqnuuuuuKrumVVq2bKmWLVu6rbvvvvvUsmXLWtF+AEDNRXk5AKDWmDFjhk6dOqUFCxaUCtySFBAQoAcffFCJiYmudf/+97+VmprqKvuOj4/X8OHDdeTIEbdjf/vtN40bN05JSUkKCgpSbGysevfurW+++abcNp08eVJ//etfPbapdevWSktLc73Pz8/XtGnT1KpVKwUFBSkpKUmPPfaYcnJy3I7bsmWLUlJSdMEFFyg4OFgtWrTQ8OHDJRWWbsfExEiSpkyZ4ip9njx5ssc2Tp482dXzP378+FJl0lu3blXfvn0VHh6u0NBQXXfdddq0aZPbOYrKr7/44gs98MADio2NVdOmTcv8bnz1wQcf6KabblLjxo0VFBSkVq1aadq0aSooKCi17+bNm3XjjTcqKipKDRs21CWXXKLZs2eX2u+nn37SwIEDFRoaqpiYGD366KMez1dRP/30k4YPH664uDgFBQXpoosu0t/+9rdS+7344ou66KKLFBISoqioKHXp0kVvvvmmpMKfx/jx4yVJLVq0cP38Dhw4cN7tAwDUPPR0AwBqjRUrVqh169bq2rWrz8esWrVK+/bt0z333KP4+HhXqfe3336rTZs2yTAMSYW9mu+++67Gjh2r9u3b68iRI1q3bp127typSy+91Ov5//nPf6ply5a66qqrfGrPyJEj9frrr+sPf/iDHnnkEW3evFnPPPOMdu7cqffff1+S9Msvv+iGG25QTEyMJkyYoMjISB04cEBLly6VJMXExOjll1/W/fffr0GDBumWW26RJF1yySUer3nLLbcoMjJSDz30kKvcu6hM+ttvv9U111yj8PBw/fGPf1RgYKDmz5+vnj176osvvij1XT/wwAOKiYnRE088oVOnTpX7ebOzs/Xrr7+WWh8ZGamAgMJfQxYuXKjQ0FA9/PDDCg0N1aeffqonnnhCJ06c0HPPPec6ZtWqVerXr58SEhKUlpam+Ph47dy5UytWrHC7sVFQUKCUlBR17dpVzz//vFavXq2ZM2eqVatWuv/++8ttszc///yzrrzyShmGobFjxyomJkYfffSRRowYoRMnTmjcuHGSpNdee00PPvig/vCHPygtLU1nzpzRv//9b23evFl33nmnbrnlFn3//fd666239MILL+iCCy6QJNeNFABAHWMCAFALHD9+3JRkDhw4sNS2rKwsMzMz07VkZ2e7thV/XeStt94yJZlr1651rYuIiDDHjBlTqTYNGDDAp/23bdtmSjJHjhzptv7RRx81JZmffvqpaZqm+f7775uSzK+++srruTIzM01J5qRJk3y69v79+01J5nPPPee2fuDAgabD4TB/+OEH17rDhw+bYWFh5rXXXutat2DBAlOSefXVV5v5+fk+X8/bsnHjRte+nn5Go0ePNkNCQswzZ86Ypmma+fn5ZosWLczmzZubWVlZbvs6nU7X62HDhpmSzKlTp7rt07lzZ/Oyyy4rt93FNWzY0Bw2bJjr/YgRI8yEhATz119/ddvvjjvuMCMiIlyfY8CAAeZFF11U5rmfe+45U5K5f//+CrUJAFD7UF4OAKgVTpw4IcnzRFY9e/ZUTEyMa5k3b55rW3BwsOv1mTNn9Ouvv+rKK6+UJLfS8cjISG3evFmHDx+ucJvCwsJ82v/DDz+UJD388MNu6x955BFJco39Lhp3vWLFCuXl5fncnooqKCjQJ598ooEDB7qNZ05ISNCdd96pdevWuT5jkVGjRslut/t8jXvvvVerVq0qtbRv3961T/Gf0W+//aZff/1V11xzjbKzs7Vr1y5JhSXw+/fv17hx40qNSy+qVijuvvvuc3t/zTXXaN++fT63uyTTNPXee++pf//+Mk1Tv/76q2tJSUnR8ePHXX+fIiMj9eOPP+qrr76q9PUAAHVHvQ7da9euVf/+/dW4ceNKP6/UNE09//zzuvDCCxUUFKQmTZroqaeeqvrGAkA9VxRsT548WWrb/PnztWrVKv39738vte3o0aNKS0tTXFycgoODFRMToxYtWkiSjh8/7tpvxowZ2rFjhxITE3XFFVdo8uTJ5Ya08PBwSYVB0Rf//e9/ZbPZ1Lp1a7f18fHxioyM1H//+19JUo8ePfT73/9eU6ZM0QUXXKABAwZowYIFpcZ9n6/MzExlZ2erbdu2pbYlJyfL6XTq0KFDbuuLvjtftWnTRtdff32ppei7kwpL3AcNGqSIiAiFh4crJibGNXlZ0c/ohx9+kCR16NCh3Gs2aNCgVKl2VFSUsrKyKtT24jIzM3Xs2DG9+uqrbjd4YmJidM8990gqHBYgSf/zP/+j0NBQXXHFFWrTpo3GjBmj9evXV/raAIDarV6P6T516pQ6duyo4cOHu8bDVVRaWpo++eQTPf/887r44ot19OhRHT16tIpbCgCIiIhQQkKCduzYUWpb0bhjTxNR3XbbbdqwYYPGjx+vTp06KTQ0VE6nU3369JHT6XTb75prrtH777+vTz75RM8995yeffZZLV26VH379vXYpvDwcDVu3Nhjm8riqWe25PZ3331XmzZt0j//+U+tXLlSw4cP18yZM7Vp06Yqe2xVZRTvla4Kx44dU48ePRQeHq6pU6eqVatWatCggb755hv9z//8j9vPyFcV6Yn3VVE77rrrLg0bNszjPkVj6pOTk7V7926tWLFCH3/8sd577z299NJLeuKJJ1yPeQMA1B/1OnT37dvX6y9SkpSTk6PHH39cb731lo4dO6YOHTro2WefdT0PdefOnXr55Ze1Y8cOVy9BRXsAAAC+u+mmm/SXv/xFX375pa644opy98/KytKaNWs0ZcoUPfHEE671e/bs8bh/QkKCHnjgAT3wwAP65ZdfdOmll+qpp54q89+Kfv366dVXX9XGjRvVrVu3MtvTvHlzOZ1O7dmzR8nJya71P//8s44dO1bq2eJXXnmlrrzySj311FN68803NWTIEL399tsaOXJkucHdFzExMQoJCdHu3btLbdu1a5dsNpvbTPBW+Pzzz3XkyBEtXbpU1157rWv9/v373fZr1aqVJGnHjh26/vrrLW2TJzExMQoLC1NBQYFP12/YsKFuv/123X777crNzdUtt9yip556ShMnTlSDBg2q5OcHAKgd6nV5eXnGjh2rjRs36u2339a///1v3XrrrerTp4/rl7WiGWtXrFihFi1aKCkpSSNHjqSnGwAs8sc//lEhISEaPny4fv7551LbTdN0e1/U41ly/Z///Ge39wUFBW6l5pIUGxurxo0bl1vS/cc//lENGzbUyJEjPbbphx9+cD3S6sYbb/R4/VmzZkkqvKkgFd4sKNnmTp06SZKrPSEhIZIKe4ory26364YbbtAHH3zgViXw888/680339TVV1/tVgZuBU8/o9zcXL300ktu+1166aVq0aKF/vznP5f6zCW/K6va+fvf/17vvfeex8qGouegSyr1ODqHw6H27dvLNE3XGP2i55ufz88PAFA71Oue7rIcPHhQCxYs0MGDB9W4cWNJ0qOPPqqPP/5YCxYs0NNPP619+/bpv//9r5YsWaI33nhDBQUFeuihh/SHP/xBn376qZ8/AQDUPW3atNGbb76pwYMHq23bthoyZIg6duwo0zS1f/9+vfnmm7LZbK7nR4eHh+vaa6/VjBkzlJeXpyZNmuiTTz4p1Yv622+/qWnTpvrDH/6gjh07KjQ0VKtXr9ZXX32lmTNnltmmVq1a6c0339Ttt9+u5ORkDR06VB06dFBubq42bNigJUuWKDU1VZLUsWNHDRs2TK+++qqrrPrLL7/U66+/roEDB6pXr16SpNdff10vvfSSBg0apFatWum3337Ta6+9pvDwcFdwDw4OVvv27fXOO+/owgsvVHR0tDp06ODTmOfinnzySa1atUpXX321HnjgAQUEBGj+/PnKycnRjBkzKnQuT7755huPY+1btWqlbt266aqrrlJUVJSGDRumBx98UIZhaNGiRaWCtM1m08svv6z+/furU6dOuueee5SQkKBdu3bp22+/1cqVK8+7reWZPn26PvvsM3Xt2lWjRo1S+/btdfToUX3zzTdavXq166b7DTfcoPj4eHXv3l1xcXHauXOn5s6dq5tuusk1N8Fll10mSXr88cd1xx13KDAwUP3793eFcQBAHeKnWdNrHEnm+++/73q/YsUKU5LZsGFDtyUgIMC87bbbTNM0zVGjRpmSzN27d7uO+/rrr01J5q5du6r7IwBAvbF3717z/vvvN1u3bm02aNDADA4ONtu1a2fed9995rZt29z2/fHHH81BgwaZkZGRZkREhHnrrbeahw8fdnvcVk5Ojjl+/HizY8eOZlhYmNmwYUOzY8eO5ksvveRzm77//ntz1KhRZlJSkulwOMywsDCze/fu5osvvuh67JVpmmZeXp45ZcoUs0WLFmZgYKCZmJhoTpw40W2fb775xhw8eLDZrFkzMygoyIyNjTX79etnbtmyxe2aGzZsMC+77DLT4XCU+/gwb48MK7peSkqKGRoaaoaEhJi9evUyN2zY4LZP0SPDynqMmafreVuKP4pr/fr15pVXXmkGBwebjRs3Nv/4xz+aK1euNCWZn332mdt5161bZ/bu3dv1c7rkkkvMF1980bV92LBhZsOGDUu1Z9KkSWZFf+0p+cgw0zTNn3/+2RwzZoyZmJhoBgYGmvHx8eZ1111nvvrqq6595s+fb1577bVmo0aNzKCgILNVq1bm+PHjzePHj7uda9q0aWaTJk1Mm83G48MAoA4zTLMaarJqAcMw9P7772vgwIGSpHfeeUdDhgzRt99+W2pCltDQUMXHx2vSpEl6+umn3R7ncvr0aYWEhOiTTz5R7969q/MjAAAAAABqGMrLvejcubMKCgr0yy+/6JprrvG4T/fu3ZWfn68ffvjBNcHL999/L0mlJsMBAAAAANQ/9bqn++TJk9q7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skaN6T5+/LgkKTo62us+Gzdu1PXXX++2LiUlRRs3brS0bQAAAAAAVFSAvxtQxOl0aty4cerevbs6dOjgdb+MjAzFxcW5rYuLi1NGRobH/XNycpSTk+N6f+LEiappMAAAAAAA5agxPd1jxozRjh079Pbbb1fpeZ955hlFRES4lsTExCo9PwAAAAAA3tSI0D127FitWLFCn332mZo2bVrmvvHx8fr555/d1v3888+Kj4/3uP/EiRN1/Phx13Lo0KEqazcAAAAAAGXxa+g2TVNjx47V+++/r08//VQtWrQo95hu3bppzZo1butWrVqlbt26edw/KChI4eHhbgsAAAAAANXBr2O6x4wZozfffFMffPCBwsLCXOOyIyIiFBwcLEkaOnSomjRpomeeeUaSlJaWph49emjmzJm66aab9Pbbb2vLli169dVX/fY5AAAAAADwxK893S+//LKOHz+unj17KiEhwbW88847rn0OHjyo9PR01/urrrpKb775pl599VV17NhR7777rpYtW1bm5GsAAAAAAPhDjXpOd3XgOd0AAAAAgPNVK5/TDQAAAABAXULoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRuAAAAAAAsQugGAAAAAMAihG4AAAAAACxC6AYAAAAAwCKEbgAAAAAALELoBgAAAADAIoRu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q3bt2kkqfLTWtGnTtH37di1btkwHDhxwBevExES99957kqTdu3crPT3da3l3amqqtmzZouXLl2vjxo0yTVM33nij26O7srOz9fzzz2vRokVau3atDh48qEcffbSsr76U48ePW97LTnk5AAAAgDrjdF6B2j+x0i/X/m5qikIc5UesPXv2yDRNJScne9yenJysrKwsZWZmKjY2VpLUvXt3TZgwQZJ04YUXav369XrhhRfUu3dvxcTESJIiIyPLLQWPjo7WnDlzZLPZ1LZtW82YMUPZ2dl67LHHJEkTJ07U9OnTtW7dOt1xxx2ljo+IiFBERISkwnHY8+fP1+rVq13XHT58uGvfli1bas6cObr88st18uRJhYaGugJubGysIiMjvX4/y5cv1/r163XVVVdJkhYvXqzExEQtW7ZMt956q6TCgP/KK6+oVatWkqSxY8dq6tSpZX7+4jZs2KB33nlH//rXv3w+pjLo6QYAAAAAP/C1Z1ySunXrVur9zp07K3zNiy66SDbbuRgYFxeniy++2PXebrerUaNGrpJwb7Zu3aq7775bc+fOVffu3V3rv/76a/Xv31/NmjVTWFiYevToIUluj4Iuz86dOxUQEKCuXbu61jVq1Eht27Z1+8whISGuwC1JCQkJ5ba7yI4dOzRgwABNmjRJN9xwg89tqwx6ugEAAADUGcGBdn03NcVv1/ZF69atZRiGdu7cqUGDBpXavnPnTkVFRbl6sKtSYGCg23vDMDyuczqdXs+RkZGhm2++WSNHjtSIESNc60+dOqWUlBSlpKRo8eLFiomJ0cGDB5WSkqLc3Nyq/SDy/Fl8uZHx3Xff6brrrtO9996r//3f/63ydpVU4Z7uN954Qzk5OaXW5+bm6o033qiSRgEAAABAZRiGoRBHgF8WwzB8amOjRo3Uu3dvvfTSSzp9+rTbtoyMDC1evFi333672/k2bdrktt+mTZvcytMDAwNVUFBwHt+cb86cOaMBAwaoXbt2mjVrltu2Xbt26ciRI5o+fbquueYatWvXrlTPs8PhkKQy25qcnKz8/Hxt3rzZte7IkSPavXu32rdvf17t//bbb9WrVy8NGzZMTz311Hmdy1cVDt333HOPjh8/Xmr9b7/9pnvuuadKGgUAAAAAddncuXOVk5OjlJQUrV27VocOHdLHH3+s3r17q0mTJqUC4fr16zVjxgx9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KDc3V82aNZPD4dCLL76offv2afny5aWevd28eXMZhqEVK1YoMzNTJ0+eLHWNNm3aaMCAARo1apTWrVun7du366677lKTJk00YMCASrf9ww8/1IIFC7Rjxw4dOHBA//rXv3Tfffepe/furhnfreBz6J45c6Z+97vfKTw8vNS2iIgI9e7dW88991yVNg4AAAAA6qI2bdpoy5YtatmypW677Ta1atVK9957r3r16qWNGze6Jhwr8sgjj2jLli3q3LmznnzySc2aNUspKSmu7TNnztSqVauUmJiozp07W9buL774Qunp6Wrfvr0SEhJcy4YNGxQTE6OFCxdqyZIlat++vaZPn67nn3/e7fgmTZpoypQpmjBhguLi4jR27FiP11mwYIEuu+wy9evXT926dZNpmvrwww9LlZRXRHBwsF577TVdffXVSk5O1kMPPaSbb75ZK1asqPQ5fWGYPo7eb9Wqld5//31dcsklHrf/5z//0YABA7Rv374qbWBVO3HihCIiInT8+HGPNxAAAAAA1B5nzpzR/v371aJFC9fTleqapKQkjRs3zu051qgeZf398jVb+tzT/dNPPyksLMzr9tDQ0DIfRA4AAAAAQH3jc+iOiYnR7t27vW7ftWuXLrjggippFAAAAAAAdYHPs5dff/31euqpp9SnT59S20zT1FNPPaXrr7++ShsHAAAAAPXdgQMH/N0EnAefQ/f//u//6rLLLlPXrl31yCOPqG3btpIKe7hnzpyp77//XgsXLrSqnQAAAAAA1Do+h+5WrVpp9erVSk1N1R133OF6Zpxpmmrfvr1WrVql1q1bW9ZQAAAAAABqG59DtyR16dJFO3bs0LZt27Rnzx6ZpqkLL7xQnTp1sqh5AAAAAADUXhUK3UU6depE0AYAAAAAoBw+z14OAAAAAAAqhtANAAAAAIBFCN0AAAAAUAdNnjz5vIcFHzhwQIZhaNu2bVXSJm969uypcePGWXoNfyF0AwAAAIAfHDp0SMOHD1fjxo3lcDjUvHlzpaWl6ciRIxU+l2EYWrZsmdu6Rx99VGvWrDmvNiYmJio9PV0dOnQ4r/MU+fzzz2UYho4dO+a2funSpZo2bVqVXKOmqXDo/vjjj7Vu3TrX+3nz5qlTp0668847lZWVVaWNAwAAAIC6aN++ferSpYv27Nmjt956S3v37tUrr7yiNWvWqFu3bjp69Oh5XyM0NFSNGjU6r3PY7XbFx8crIKBSc3D7LDo6WmFhYZZew18qHLrHjx+vEydOSJL+85//6JFHHtGNN96o/fv36+GHH67yBgIAAABAXTNmzBg5HA598skn6tGjh5o1a6a+fftq9erV+umnn/T444+79k1KStK0adM0ePBgNWzYUE2aNNG8efPctkvSoEGDZBiG633J8vLU1FQNHDhQTz/9tOLi4hQZGampU6cqPz9f48ePV3R0tJo2baoFCxa4jilZXp6amirDMEotn3/+uSRp0aJF6tKli8LCwhQfH68777xTv/zyi+tcvXr1kiRFRUXJMAylpqZKKl1enpWVpaFDhyoqKkohISHq27ev9uzZ49q+cOFCRUZGauXKlUpOTlZoaKj69Omj9PR0r995VlaWhgwZopiYGAUHB6tNmzZun9UqFQ7d+/fvV/v27SVJ7733nvr166enn35a8+bN00cffVTlDQQAAAAAX5mmqey8bL8spmn61MajR49q5cqVeuCBBxQcHOy2LT4+XkOGDNE777zjdr7nnntOHTt21NatWzVhwgSlpaVp1apVkqSvvvpKkrRgwQKlp6e73nvy6aef6vDhw1q7dq1mzZqlSZMmqV+/foqKitLmzZt13333afTo0frxxx89Hj979mylp6e7lrS0NMXGxqpdu3aSpLy8PE2bNk3bt2/XsmXLdODAAVewTkxM1HvvvSdJ2r17t9LT0zV79myP10lNTdWWLVu0fPlybdy4UaZp6sYbb1ReXp5rn+zsbD3//PNatGiR1q5dq4MHD+rRRx/1+tn/9Kc/6bvvvtNHH32knTt36uWXX9YFF1zgdf+qUuEaAYfDoezsbEnS6tWrNXToUEmF5QBFPeAAAAAA4A+n80+r65td/XLtzXduVkhgSLn77dmzR6ZpKjk52eP25ORkZWVlKTMzU7GxsZKk7t27a8KECZKkCy+8UOvXr9cLL7yg3r17KyYmRpIUGRmp+Pj4Mq8dHR2tOXPmyGazqW3btpoxY4ays7P12GOPSZImTpyo6dOna926dbrjjjtKHR8REaGIiAhJheOw58+fr9WrV7uuO3z4cNe+LVu21Jw5c3T55Zfr5MmTCg0NVXR0tCQpNjZWkZGRXr+f5cuXa/369brqqqskSYsXL1ZiYqKWLVumW2+9VVJhwH/llVfUqlUrSdLYsWM1depUr5/94MGD6ty5s7p06SLpXIWA1Src03311Vfr4Ycf1rRp0/Tll1/qpptukiR9//33atq0aZU3EAAAAADqIl97xiWpW7dupd7v3Lmzwte86KKLZLOdi4FxcXG6+OKLXe/tdrsaNWrkKgn3ZuvWrbr77rs1d+5cde/e3bX+66+/Vv/+/dWsWTOFhYWpR48ekgoDr6927typgIAAde167uZJo0aN1LZtW7fPHBIS4grckpSQkFBmu++//369/fbb6tSpk/74xz9qw4YNPrfpfFS4p3vu3Ll64IEH9O677+rll19WkyZNJEkfffSR+vTpU+UNBAAAAABfBQcEa/Odm/12bV+0bt1ahmFo586dGjRoUKntO3fuVFRUlKsHuyoFBga6vTcMw+M6p9Pp9RwZGRm6+eabNXLkSI0YMcK1/tSpU0pJSVFKSooWL16smJgYHTx4UCkpKcrNza3aDyLPn6WsGxl9+/bVf//7X3344YdatWqVrrvuOo0ZM0bPP/98lbetuAqH7mbNmmnFihWl1r/wwgtV0iAAAAAAqCzDMHwq8fanRo0aqXfv3nrppZf00EMPuY3rzsjI0OLFizV06FAZhuFav2nTJrdzbNq0ya08PTAwUAUFBZa3/cyZMxowYIDatWunWbNmuW3btWuXjhw5ounTpysxMVGStGXLFrd9HA6HJJXZ1uTkZOXn52vz5s2u8vIjR45o9+7drvnFKismJkbDhg3TsGHDdM0112j8+PGWh+7zek73mTNndOLECbcFAAAAAFC2uXPnKicnRykpKVq7dq0OHTqkjz/+WL1791aTJk301FNPue2/fv16zZgxQ99//73mzZunJUuWKC0tzbU9KSlJa9asUUZGhqWPch49erQOHTqkOXPmKDMzUxkZGcrIyFBubq6aNWsmh8OhF198Ufv27dPy5ctLPXu7efPmMgxDK1asUGZmpk6ePFnqGm3atNGAAQM0atQorVu3Ttu3b9ddd92lJk2aaMCAAZVu+xNPPKEPPvhAe/fu1bfffqsVK1Z4HVdflSocuk+dOqWxY8cqNjZWDRs2VFRUlNsCAAAAAChbmzZttGXLFrVs2VK33XabWrVqpXvvvVe9evXSxo0bXROOFXnkkUe0ZcsWde7cWU8++aRmzZqllJQU1/aZM2dq1apVSkxMVOfOnS1r9xdffKH09HS1b99eCQkJrmXD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AAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALAIoRsAAAAAAIsQugEAAAAAsAihGwAAAAAAixC6AQAAAACwCKEbAAAAAACLELoBAAAAALCIX0P32rVr1b9/fzVu3FiGYWjZsmVl7p+amirDMEotF110UfU0GAAAAACACvBr6D516pQ6duyoefPm+bT/7NmzlZ6e7loOHTqk6Oho3XrrrRa3FAAAAACAigvw58X79u2rvn37+rx/RESEIiIiXO+XLVumrKws3XPPPVY0DwAAAACA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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA94AAAJOCAYAAABBfN/cAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAACFX0lEQVR4nOzdeXhU5d3/8c+ZSSb7bkgChFVkU4GKIlIXqjSgUNCnLrgAorjyFEXpT7RVEK2IQquCW6ugFpfigpS6AVZ5WERRsVURQUAQEoSsZF/m/P4IM8xMZpKZJIck5P26rrnInHNmzj2BkPnM9z7f2zBN0xQAAAAAALCEraUHAAAAAADA8YzgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAEA7tX37dv36179WQkKCDMPQ8uXLW3pIzW7SpEmKjY1t6WEAANo5gjcAoM3btWuXpk6dqpNOOknR0dGKjo5Wv379dOutt+o///lPi4zphx9+0I033qgePXooMjJS8fHxGjZsmB577DGVlZU1+/lKS0s1a9YsffTRR0E/ZuLEifrvf/+rBx98UC+99JIGDx7c7ONy2b17twzDCHibO3euZedujCVLltQ7XtetW7duzXK+DRs2aNasWSooKGiW5wMAtC5hLT0AAACaYuXKlbr88ssVFhamq666SgMGDJDNZtN3332nN998U0899ZR27dqlrl27HrMx/etf/9Kll16qiIgITZgwQSeffLIqKyu1bt06zZgxQ998842effbZZj1naWmpZs+eLUk677zzGjy+rKxMGzdu1D333KOpU6c261jqM378eF144YV1tg8aNOiYjSEY55xzjl566SWvbddff73OOOMM3XDDDe5tzVVN37Bhg2bPnq1JkyYpMTGxWZ4TANB6ELwBAG3WDz/8oCuuuEJdu3bVmjVrlJGR4bX/4Ycf1pNPPimb7dhN8Nq1a5d7TB9++KHXmG699Vbt2LFD//rXv47ZeAI5ePCgJDVryCspKVFMTEy9x/ziF7/Q1Vdf3WzntEqPHj3Uo0cPr2033XSTevTo0SbGDwBoXZhqDgBos+bNm6eSkhItXry4TuiWpLCwMP3ud79TZmame9t//vMfTZo0yT0FPD09XZMnT1Zubq7XYw8fPqzbbrtN3bp1U0REhDp06KARI0boiy++aHBMxcXFeu655/yO6cQTT9S0adPc96urqzVnzhz17NlTERER6tatm+6++25VVFR4PW7z5s3KysrSCSecoKioKHXv3l2TJ0+WVDuNOzU1VZI0e/Zs9zToWbNm+R3jrFmz3DMAZsyYUWfK9JdffqlRo0YpPj5esbGxOv/88/XJJ594PYdrKvbHH3+sW265RR06dFDnzp3r/d4E6+2339ZFF12kjh07KiIiQj179tScOXNUU1NT59hNmzbpwgsvVFJSkmJiYnTqqafqscceq3Pcvn37NG7cOMXGxio1NVV33nmn3+cL1b59+zR58mSlpaUpIiJC/fv31/PPP1/nuCeeeEL9+/dXdHS0kpKSNHjwYL388suSav8+ZsyYIUnq3r27++9v9+7dTR4fAKB1oOINAGizVq5cqRNPPFFDhgwJ+jGrVq3Szp07de211yo9Pd097fubb77RJ598IsMwJNVWN19//XVNnTpV/fr1U25urtatW6etW7fqF7/4RcDn/+c//6kePXrorLPOCmo8119/vV544QX99re/1R133KFNmzbpoYce0tatW/XWW29Jkn7++Wf9+te/Vmpqqu666y4lJiZq9+7devPNNyVJqampeuqpp3TzzTfr4osv1iWXXCJJOvXUU/2e85JLLlFiYqJuv/1299Rv15Tpb775Rmeffbbi4+P1+9//XuHh4XrmmWd03nnn6eOPP67zvb7llluUmpqqe++9VyUlJQ2+3tLSUh06dKjO9sTERIWF1b4tWbJkiWJjYzV9+nTFxsbqww8/1L333quioiI98sgj7sesWrVKo0ePVkZGhqZNm6b09HRt3bpVK1eu9Ppwo6amRllZWRoyZIgeffRRrV69WvPnz1fPnj118803NzjmQA4cOKAzzzxThmFo6tSpSk1N1bvvvqvrrrtORUVFuu222yRJf/3rX/W73/1Ov/3tbzVt2jSVl5frP//5jzZt2qQrr7xSl1xyib7//nu98sor+vOf/6wTTjhBktwfpgAAjgMmAABtUGFhoSnJHDduXJ19+fn55sGDB9230tJS9z7Pr11eeeUVU5K5du1a97aEhATz1ltvbdSYxo4dG9TxW7ZsMSWZ119/vdf2O++805Rkfvjhh6ZpmuZbb71lSjI/++yzgM918OBBU5J53333BXXuXbt2mZLMRx55xGv7uHHjTIfDYf7www/ubfv37zfj4uLMc845x71t8eLFpiTzl7/8pVldXR30+QLdNm7c6D7W39/RjTfeaEZHR5vl5eWmaZpmdXW12b17d7Nr165mfn6+17FOp9P99cSJE01J5v333+91zKBBg8zTTjutwXF7iomJMSdOnOi+f91115kZGRnmoUOHvI674oorzISEBPfrGDt2rNm/f/96n/uRRx4xJZm7du0KaUwAgLaBqeYAgDapqKhIkv/mVuedd55SU1Pdt0WLFrn3RUVFub8uLy/XoUOHdOaZZ0qS1zTyxMREbdq0Sfv37w95THFxcUEd/84770iSpk+f7rX9jjvukCT3teCu67BXrlypqqqqoMcTqpqaGn3wwQcaN26c1/XNGRkZuvLKK7Vu3Tr3a3SZMmWK7HZ70Oe44YYbtGrVqjq3fv36uY/x/Ds6fPiwDh06pLPPPlulpaX67rvvJNVOh9+1a5duu+22Otepu2YteLrpppu87p999tnauXNn0OP2ZZqm3njjDY0ZM0amaerQoUPuW1ZWlgoLC93/nhITE/XTTz/ps88+a/T5AABtG8G7AWvXrtWYMWPUsWPHRq9xapqmHn30UZ100kmKiIhQp06d9OCDDzb/YAGgHXGF2+Li4jr7nnnmGa1atUp///vf6+zLy8vTtGnTlJaWpqioKKWmpqp79+6SpMLCQvdx8+bN09dff63MzEydccYZmjVrVoNBLT4+XlJtWAzGjz/+KJvNphNPPNFre3p6uhITE/Xjjz9Kks4991z9z//8j2bPnq0TTjhBY8eO1eLFi+tcB95UBw8eVGlpqXr37l1nX9++feV0OrV3716v7a7vXbB69eqlCy64oM7N9b2Taqe7X3zxxUpISFB8fLxSU1PdDc1cf0c//PCDJOnkk09u8JyRkZF1pm0nJSUpPz8/pLF7OnjwoAoKCvTss896fciTmpqqa6+9VlLtJQKS9P/+3/9TbGyszjjjDPXq1Uu33nqr1q9f3+hzAwDaHq7xbkBJSYkGDBigyZMnu6+ZC9W0adP0wQcf6NFHH9Upp5yivLw85eXlNfNIAaB9SUhIUEZGhr7++us6+1zXIftrTnXZZZdpw4YNmjFjhgYOHKjY2Fg5nU6NHDlSTqfT67izzz5bb731lj744AM98sgjevjhh/Xmm29q1KhRfscUHx+vjh07+h1TffxVaH33v/766/rkk0/0z3/+U++//74mT56s+fPn65NPPmm2Ja0aw7M63RwKCgp07rnnKj4+Xvfff7969uypyMhIffHFF/p//+//ef0dBSuUinywXOO4+uqrNXHiRL/HuK6x79u3r7Zt26aVK1fqvffe0xtvvKEnn3xS9957r3sJOADA8Y3g3YBRo0YFfIMlSRUVFbrnnnv0yiuvqKCgQCeffLIefvhh9xqqW7du1VNPPaWvv/7aXUEItToAAPDvoosu0t/+9jd9+umnOuOMMxo8Pj8/X2vWrNHs2bN17733urdv377d7/EZGRm65ZZbdMstt+jnn3/WL37xCz344IP1/l4YPXq0nn32WW3cuFFDhw6tdzxdu3aV0+nU9u3b1bdvX/f2AwcOqKCgoM7a42eeeabOPPNMPfjgg3r55Zd11VVX6dVXX9X111/fYHgPRmpqqqKjo7Vt27Y6+7777jvZbDavDvFW+Oijj5Sbm6s333xT55xzjnv7rl27vI7r2bOnJOnrr7/WBRdcYOmY/ElNTVVcXJxqamqCOn9MTIwuv/xyXX755aqsrNQll1yiBx98UDNnzlRkZGSz/P0BAFovppo30dSpU7Vx40a9+uqr+s9//qNLL71UI0eOdL+Jc3W3Xblypbp3765u3brp+uuvp+INAM3g97//vaKjozV58mQdOHCgzn7TNL3uuyqfvtv/8pe/eN2vqanxmnYuSR06dFDHjh0bnN79+9//XjExMbr++uv9jumHH35wL3d14YUX+j3/ggULJNV+sCDVfmDgO+aBAwdKkns80dHRkmorxo1lt9v161//Wm+//bbXbIEDBw7o5Zdf1i9/+UuvKeFW8Pd3VFlZqSeffNLruF/84hfq3r27/vKXv9R5zb7fK6vG+T//8z964403/M5wcK2TLqnOUnUOh0P9+vWTaZrua/Zd65835e8PANB6UfFugj179mjx4sXas2ePOnbsKEm688479d5772nx4sX605/+pJ07d+rHH3/UsmXL9OKLL6qmpka33367fvvb3+rDDz9s4VcAAG1br1699PLLL2v8+PHq3bu3rrrqKg0YMECmaWrXrl16+eWXZbPZ3OtLx8fH65xzztG8efNUVVWlTp066YMPPqhTTT18+LA6d+6s3/72txowYIBiY2O1evVqffbZZ5o/f369Y+rZs6defvllXX755erbt68mTJigk08+WZWVldqwYYOWLVumSZMmSZIGDBigiRMn6tlnn3VPsf7000/1wgsvaNy4cRo+fLgk6YUXXtCTTz6piy++WD179tThw4f117/+VfHx8e7wHhUVpX79+um1117TSSedpOTkZJ188slBXQPt6YEHHtCqVav0y1/+UrfccovCwsL0zDPPqKKiQvPmzQvpufz54osv/F5737NnTw0dOlRnnXWWkpKSNHHiRP3ud7+TYRh66aWX6oRpm82mp556SmPGjNHAgQN17bXXKiMjQ999952++eYbvf/++00ea0Pmzp2rf//73xoyZIimTJmifv36KS8vT1988YVWr17t/pD917/+tdLT0zVs2DClpaVp69atWrhwoS666CJ3r4LTTjtNknTPPffoiiuuUHh4uMaMGeMO5ACANq6Fuqm3SZLMt956y31/5cqVpiQzJibG6xYWFmZedtllpmma5pQpU0xJ5rZt29yP+/zzz01J5nfffXesXwIAHJd27Nhh3nzzzeaJJ55oRkZGmlFRUWafPn3Mm266ydyyZYvXsT/99JN58cUXm4mJiWZCQoJ56aWXmvv37/daiquiosKcMWOGOWDAADMuLs6MiYkxBwwYYD755JNBj+n77783p0yZYnbr1s10OBxmXFycOWzYMPOJJ55wL4llmqZZVVVlzp492+zevbsZHh5uZmZmmjNnzvQ65osvvjDHjx9vdunSxYyIiDA7dOhgjh492ty8ebPXOTds2GCedtpppsPhaHBpsUDLibnOl5WVZcbGxprR0dHm8OHDzQ0bNngd41pOrL4lzvydL9DNc5mu9evXm2eeeaYZFRVlduzY0fz9739vvv/++6Yk89///rfX865bt84cMWKE++/p1FNPNZ944gn3/okTJ5oxMTF1xnPfffeZob4N8l1OzDRN88CBA+att95qZmZmmuHh4WZ6erp5/vnnm88++6z7mGeeecY855xzzJSUFDMiIsLs2bOnOWPGDLOwsNDruebMmWN26tTJtNlsLC0GAMcZwzSPwXys44RhGHrrrbc0btw4SdJrr72mq666St98802dxi2xsbFKT0/Xfffdpz/96U9ey7+UlZUpOjpaH3zwgUaMGHEsXwIAAAAA4BhjqnkTDBo0SDU1Nfr555919tln+z1m2LBhqq6u1g8//OBuBPP9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iJYsWaL33ntPTz31lHbt2qWzzz5bhw8fDvhcDz30kLuanpCQoMzMTKuHDwAAAKCd27t3ryZPnqyOHTvK4XCoa9eumjZtmnJzc0N+Ln89s+68806tWbOmSWPMzMxUdna2Tj755CY9j8tHH30kwzDqLP325ptvas6cOc1yjkC++uorjR8/XpmZmYqKilLfvn312GOPWXpOlzbb1fyFF15QYmKixo0b57Xdc+r6qaeeqiFDhqhr1676xz/+oeuuu87vc82cOVPTp0933y8qKiJ8AwAAALDMzp07NXToUJ100kl65ZVX1L17d33zzTeaMWOG3n33XX3yySdKTk5u0jliY2MVGxvbpOew2+3H5DLepr7WYHz++efq0KGD/v73vyszM1MbNmzQDTfcILvdrqlTp1p67jZZ8TZNU88//7yuueYaORyOeo9NTEzUSSedpB07dgQ8JiIiQvHx8V43AAAAALDKrbfeKofDoQ8++EDnnnuuunTpolGjRmn16tXat2+f7rnnHvex3bp105w5czR+/HjFxMSoU6dOXg2qu3XrJkm6+OKLZRiG+77vVPNJkyZp3Lhx+tOf/qS0tDQlJibq/vvvV3V1tWbMmKHk5GR17txZixcvdj/Gd6p5oJWmPvroI0nSSy+9pMGDBysuLk7p6em68sor3Wth7969W8OHD5ckJSUlyTAMTZo0SVLdqeb5+fmaMGGCkpKSFB0drVGjRmn79u3u/UuWLFFiYqLef/999e3bV7GxsRo5cqSys7MDfs8nT56sxx57TOeee6569Oihq6++Wtdee63efPPNoP7OmqJNBu+PP/5YO3bsCFjB9lRcXKwffvihyQueAwAAAGj9TNNUaWV1i9xM0wxqjHl5eXr//fd1yy23uNeKdklPT9dVV12l1157zev5HnnkEQ0YMEBffvml7rrrLk2bNk2rVq2SJH322WeSpMWLFys7O9t9358PP/xQ+/fv19q1a7VgwQLdd999Gj16tJKSkrRp0ybddNNNuvHGG/XTTz/5fbzvSlPTpk1Thw4d3Es4V1VVac6cOfrqq6+0fPly7d692x2uMzMz9cYbb0iStm3bpuzs7IBTvSdNmqTNmzdrxYoV2rhxo0zT1IUXXui1rFdpaakeffRRvfTSS1q7dq327NmjO++8s75vfR2FhYXHpNreolPNi4uLvSrRu3bt0pYtW5ScnKwuXbpo5syZ2rdvn1588UWvxz333HMaMmSI3+sM7rzzTo0ZM0Zdu3bV/v37dd9998lut2v8+PGWvx4AAAAALausqkb97n2/Rc797f1ZinY0HLG2b98u0zTVt29fv/v79u2r/Px8HTx4UB06dJAkDRs2THfddZck6aSTTtL69ev15z//WSNGjFBqaqqk2tm+DU0LT05O1uOPPy6bzabevXtr3rx5Ki0t1d133y2p9jLcuXPnat26dbriiivqPN5zpak333xTzzzzjFavXu0+7+TJk93H9ujRQ48//rhOP/10FRcXKzY21h1yO3TooMTExIDfnxUrVmj9+vU666yzJElLly5VZmamli9f7l5OuqqqSk8//bR69uwpSZo6daruv//+el+/pw0bNui1117Tv/71r6Af01gtWvHevHmzBg0apEGDBkmSpk+frkGDBunee++VJGVnZ9fpSF5YWKg33ngjYLX7p59+0vjx49W7d29ddtllSklJ0SeffOL+xwgAAAAArUGwFXJJGjp0aJ37W7duDfmc/fv3l812NAampaXplFNOcd+32+1KSUlxTw8P5Msvv9Q111yjhQsXatiwYe7tn3/+ucaMGaMuXbooLi5O5557riQ1uNKUp61btyosLExDhgxxb0tJSVHv3r29XnN0dLQ7dEtSRkZGg+N2+frrrzV27Fjdd999+vWvfx302BqrRSve5513Xr3/2JYsWVJnW0JCgkpLSwM+5tVXX22OoQEAAABog6LC7fr2/qwWO3cwTjzxRBmGoa1bt+riiy+us3/r1q1KSkqypHgYHh7udd8wDL/bnE5nwOfIycnRb37zG11//fVeBdGSkhJlZWUpKytLS5cuVWpqqvbs2aOsrCxVVlY27wuR/9cSzIcZ3377rc4//3zdcMMN+sMf/tDs4/In5Ir3iy++qIqKijrbKysr60wJBwAAAIBjyTAMRTvCWuRmGEZQY0xJSdGIESP05JNPqqyszGtfTk6Oli5dqssvv9zr+T755BOv4z755BOvqerh4eGqqalpwncuOOXl5Ro7dqz69OmjBQsWeO377rvvlJubq7lz5+rss89Wnz596lSgXc2x6xtr3759VV1drU2bNrm35ebmatu2berXr1+Txv/NN99o+PDhmjhxoh588MEmPVcoQg7e1157rQoLC+tsP3z4sK699tpmGRQAAAAAHM8WLlyoiooKZWVlae3atdq7d6/ee+89jRgxQp06daoTCtevX6958+bp+++/16JFi7Rs2TJNmzbNvb9bt25as2aNcnJylJ+fb9m4b7zxRu3du1ePP/64Dh48qJycHOXk5KiyslJdunSRw+HQE088oZ07d2rFihV11ubu2rWrDMPQypUrdfDgQRUXF9c5R69evTR27FhNmTJF69at01dffaWrr75anTp10tixYxs99q+//lrDhw/Xr3/9a02fPt099oMHDzb6OYMVcvA2TdPvJzk//fST+yJ7AAAAAEBgvXr10ubNm9WjRw9ddtll6tmzp2644QYNHz5cGzdurNNp+4477nD3yHrggQe0YMECZWUdnVI/f/58rVq1SpmZme4eWlb4+OOPlZ2drX79+ikjI8N927Bhg1JTU7VkyRItW7ZM/fr109y5c/Xoo496Pb5Tp06aPXu27rrrLqWlpQVcP3vx4sU67bTTNHr0aA0dOlSmaeqdd96pM708FK+//roOHjyov//9715jP/300xv9nMEyzCCv6B80aJAMw9BXX32l/v37Kyzs6OXhNTU12rVrl0aOHKl//OMflg32WCkqKlJCQoIKCwtZ0xsAAABoxcrLy7Vr1y51795dkZGRLT0cS3Tr1k233Xab1zrXODbq+/cVSm4MurnauHHjJElbtmxRVlaWYmNj3fscDoe6deum//mf/wnhJQAAAAAAcPwLOnjfd999kmo/bbniiisUERFh2aAAAAAAADhehLyc2K9+9SsdPHhQnTt3liR9+umnevnll9WvXz/dcMMNzT5AAAAAAGjPdu/e3dJDQBOF3Fztyiuv1L///W9Jta3uL7jgAn366ae65557dP/99zf7AAEAAAAAaMtCDt5ff/21zjjjDEnSP/7xD51yyinasGGDli5dqiVLljT3+AAAAAAAaNNCDt5VVVXu67tXr16t3/zmN5KkPn36KDs7u3lHBwAAAABAGxdy8O7fv7+efvpp/d///Z9WrVqlkSNHSpL279+vlJSUZh8gAAAAAABtWcjB++GHH9Yzzzyj8847T+PHj9eAAQMkSStWrHBPQQcAAAAAALVC7mp+3nnn6dChQyoqKlJSUpJ7+w033KDo6OhmHRwAAAAAAG1dyBVvSbLb7aqurta6deu0bt06HTx4UN26dVOHDh2ae3wAAAAAgEaYNWuWBg4c2KTn2L17twzD0JYtW5plTIGcd955uu222yw9R0sKOXiXlJRo8uTJysjI0DnnnKNzzjlHHTt21HXXXafS0lIrxggAAAAAx529e/dq8uTJ6tixoxwOh7p27app06YpNzc35OcyDEPLly/32nbnnXdqzZo1TRpjZmamsrOzdfLJJzfpeVw++ugjGYahgoICr+1vvvmm5syZ0yznCCQ3N1cjR45Ux44dFRERoczMTE2dOlVFRUWWnldqRPCePn26Pv74Y/3zn/9UQUGBCgoK9Pbbb+vjjz/WHXfcYcUYAQAAAOC4snPnTg0ePFjbt2/XK6+8oh07dujpp5/WmjVrNHToUOXl5TX5HLGxsU1ugG2325Wenq6wsJCvUg5JcnKy4uLiLD2HzWbT2LFjtWLFCn3//fdasmSJVq9erZtuusnS80qNCN5vvPGGnnvuOY0aNUrx8fGKj4/XhRdeqL/+9a96/fXXrRgjAAAAABxXbr31VjkcDn3wwQc699xz1aVLF40aNUqrV6/Wvn37dM8997iP7datm+bMmaPx48crJiZGnTp10qJFi7z2S9LFF18swzDc932nmk+aNEnjxo3Tn/70J6WlpSkxMVH333+/qqurNWPGDCUnJ6tz585avHix+zG+U80nTZokwzDq3D766CNJ0ksvvaTBgwcrLi5O6enpuvLKK/Xzzz+7n2v48OGSpKSkJBmGoUmTJkmqO9U8Pz9fEyZMUFJSkqKjozVq1Cht377dvX/JkiVKTEzU+++/r759+yo2NlYjR46sd4nrpKQk3XzzzRo8eLC6du2q888/X7fccov+7//+L6i/s6YIOXiXlpYqLS2tzvYOHTow1RwAAABAyzJNqbKkZW6mGdQQ8/Ly9P777+uWW25RVFSU17709HRdddVVeu2112R6PN8jjzyiAQMG6Msvv9Rdd92ladOmadWqVZKkzz77TJK0ePFiZWdnu+/78+GHH2r//v1au3atFixYoPvuu0+jR49WUlKSNm3apJtuukk33nijfvrpJ7+Pf+yxx5Sdne2+TZs2TR06dFCfPn0kSVVVVZozZ46++uorLV++XLt373aH68zMTL3xxhuSpG3btik7O1uPPfaY3/NMmjRJmzdv1ooVK7Rx40aZpqkLL7xQVVVV7mNKS0v16KOP6qWXXtLatWu1Z88e3XnnnfV9673s379fb775ps4999ygH9NYIc8XGDp0qO677z69+OKLioyMlCSVlZVp9uzZGjp0aLMPEAAAAACCVlUq/aljy5z77v2SI6bBw7Zv3y7TNNW3b1+/+/v27av8/HwdPHjQ3cB62LBhuuuuuyRJJ510ktavX68///nPGjFihFJTUyVJiYmJSk9Pr/fcycnJevzxx2Wz2dS7d2/NmzdPpaWluvvuuyVJM2fO1Ny5c7Vu3TpdccUVdR6fkJCghIQESbXXZT/zzDNavXq1+7yTJ092H9ujRw89/vjjOv3001VcXKzY2FglJydLqi3cJiYmBvz+rFixQuvXr9dZZ50lSVq6dKkyMzO1fPlyXXrppZJqQ/7TTz+tnj17SpKmTp2q+++/v97XL0njx4/X22+/rbKyMo0ZM0Z/+9vfGnxMU4Vc8X7ssce0fv16de7cWeeff77OP/98ZWZmasOGDQE/rQAAAAAAeDODrJBLqlPkHDp0qLZu3RryOfv37y+b7WgMTEtL0ymnnOK+b7fblZKS4p4eHsiXX36pa665RgsXLtSwYcPc2z///HONGTNGXbp0UVxcnLuavGfPnqDHuHXrVoWFhWnIkCHubSkpKerdu7fXa46OjnaHbknKyMhocNyS9Oc//1lffPGF3n77bf3www+aPn160GNrrJAr3ieffLK2b9+upUuX6rvvvpNU+4nBVVddVWeaBAAAAAAcU+HRtZXnljp3EE488UQZhqGtW7fq4osvrrN/69atSkpKcleym1N4eLjXfcMw/G5zOp0BnyMnJ0e/+c1vdP311+u6665zby8pKVFWVpaysrK0dOlSpaamas+ePcrKylJlZWXzvhD5fy3BfJiRnp6u9PR09enTR8nJyTr77LP1xz/+URkZGc0+RpdGtaaLjo7WlClTmnssAAAAANA0hhHUdO+WlJKSohEjRujJJ5/U7bff7lXAzMnJ0dKlSzVhwgQZhuHe/sknn3g9xyeffOI1VT08PFw1NTWWj728vFxjx45Vnz59tGDBAq993333nXJzczV37lxlZmZKkjZv3ux1jMPhkKR6x9q3b19VV1dr06ZN7qnmubm52rZtm/r169ecL8f9AUNFRUWzPq+voKeaf/755xo+fLjfNc4KCws1fPhwffXVV806OAAAAAA4Hi1cuFAVFRXKysrS2rVrtXfvXr333nsaMWKEOnXqpAcffNDr+PXr12ve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Tj/9dBUXFys2NlbJycmSpA4dOigxMTHg92fFihVav369zjrrLEnS0qVLlZmZqeXLl+vSSy+VVBvyn376afXs2VOSNHXqVN1///0BX/uePXs0aNAgDR48WNLRmQLHQsgV71/+8peaPn265syZo08//VQXXXSRJOn7779X586dm32AAAAAAHA8CrZCLklDhw6tc3/r1q0hn7N///6y2Y7GwLS0NJ1yyinu+3a7XSkpKe7p4YF8+eWXuuaaa7Rw4UINGzbMvf3zzz/XmDFj1KVLF8XFxencc8+VVBt6g7V161aFhYVpyJCjH6CkpKSod+/eXq85OjraHbolKSMjo95x33zzzXr11Vc1cOBA/f73v9eGDRuCHlNThVzxXrhwoW655Ra9/vrreuqpp9SpUydJ0rvvvquRI0c2+wABAAAAIFhRYVHadOWmFjt3ME488UQZhqGtW7fq4osvrrN/69atSkpKcleym1N4eLjXfcMw/G5zOp0BnyMnJ0e/+c1vdP311+u6665zby8pKVFWVpaysrK0dOlSpaamas+ePcrKylJlZWXzvhD5fy31fZgxatQo/fjjj3rnnXe0atUqnX/++br11lv16KOPNvvYfIUcvLt06aKVK1fW2f7nP/+5WQYEAAAAAI1lGEZQ071bUkpKikaMGKEnn3xSt99+u9d13jk5OVq6dKkmTJggwzDc2z/55BOv5/jkk0+8pqqHh4erpqbG8rGXl5dr7Nix6tOnjxYsWOC177vvvlNubq7mzp2rzMxMSdLmzZu9jnE4HJJU71j79u2r6upqbdq0yT3VPDc3V9u2bXP3G2us1NRUTZw4URMnTtTZZ5+tGTNmHJPg3aR1vMvLy1VUVOR1AwAAAADUb+HChaqoqFBWVpbWrl2rvXv36r333tOIESPUqVMnPfjgg17Hr1+/XvPmzdP333+vRYsWadmyZZo2bZp7f7du3bRmzRrl5ORYuszzjTfeqL179+rxxx/XwYMHlZOTo5ycHFVWVqpLly5yOBx64okntHPnTq1YsaLO2txdu3aVYRhauXKlDh48qOLi4jrn6NWrl8aOHaspU6Zo3bp1+uqrr3T11VerU6dOGjt2bKPHfu+99+rtt9/Wjh079M0332jlypUBr7NvbiEH75KSEk2dOlUdOnRQTEyMkpKSvG4AAAAAgPr16tVLmzdvVo8ePXTZZZepZ8+euuGGGzR8+HBt3LjR3YTM5Y477tDmzZs1aNAgPfDAA1qwYIGysrLc++fPn69Vq1YpMzNTgwYNsmzcH3/8sbKzs9WvXz9lZGS4bxs2bFBqaqqWLFmiZcuWqV+/fpo7d26danKnTp00e/Zs3XXXXUpLS9PUqVP9nmfx4sU67bTTNHr0aA0dOlSmaeqdd96pM708FA6HQzNnztSpp56qc845R3a7Xa+++mqjny8UhhnKFf2qXW/u3//+t+bMmaNrrrlGixYt0r59+/TMM89o7ty5uuqqq6wa6zFTVFSkhIQEFRYWKj4+vqWHAwAAACCA8vJy7dq1S927d1dkZGRLD8cS3bp102233ea1zjWOjfr+fYWSG0O+xvuf//ynXnzxRZ133nm69tprdfbZZ+vEE09U165dtXTp0uMieAMAAAAA0FxCnmqel5enHj16SJLi4+OVl5cnqXaZsbVr1zbv6AAAAAAAaONCrnj36NFDu3btUpcuXdSnTx/94x//0BlnnKF//vOfARdABwAAAAA0zu7du1t6CGiikCve1157rb766itJ0l133aVFixYpMjJSt99+u2bMmNHsAwQAAAAAoC0LueJ9++23u7++4IIL9N133+nzzz/XiSeeqFNPPbVZBwcAAAAAQFvXpHW8pdp12C655JJGhe61a9dqzJgx6tixowzD0PLly+s9ftKkSTIMo86tf//+XsctWrRI3bp1U2RkpIYMGaJPP/005LEBAAAAANAcgq54l5WVac2aNRo9erQkaebMmaqoqHDvt9vtmjNnTkgt/EtKSjRgwABNnjxZl1xySYPHP/bYY5o7d677fnV1tQYMGKBLL73Uve21117T9OnT9fTTT2vIkCH6y1/+oqysLG3btk0dOnQIemwAAAAAADSHoIP3Cy+8oH/961/u4L1w4UL1799fUVFRkqTvvvtOHTt29JqK3pBRo0Zp1KhRQR+fkJCghIQE9/3ly5crPz9f1157rXvbggULNGXKFPe2p59+Wv/617/0/PPP66677gr6XAAAAAAANIegp5ovXbpUN9xwg9e2l19+Wf/+97/173//W4888oj+8Y9/NPsA6/Pcc8/pggsuUNeuXSVJlZWV+vzzz3XBBRe4j7HZbLrgggu0cePGgM9TUVGhoqIirxsAAAAAAM0h6OC9Y8cOnXLKKe77kZGRstmOPvyMM87Qt99+27yjq8f+/fv17rvv6vrrr3dvO3TokGpqapSWluZ1bFpamnJycgI+10MPPeSupickJCgzM9OycQMAAADAsTBr1iwNHDiwSc+xe/duGYahLVu2NMuYAjnvvPN02223WXqOlhR08C4oKPC6pvvgwYPq1q2b+77T6fTab7UXXnhBiYmJGjduXJOfa+bMmSosLHTf9u7d2/QBAgAAAEA99u7dq8mTJ6tjx45yOBzq2rWrpk2bptzc3JCfy1+z6jvvvFNr1qxp0hgzMzOVnZ2tk08+uUnP4/LRRx/JMAwVFBR4bX/zzTc1Z86cZjlHaxR08O7cubO+/vrrgPv/85//qHPnzs0yqIaYpqnnn39e11xzjRwOh3v7CSecILvdrgMHDngdf+DAAaWnpwd8voiICMXHx3vdAAAAAMAqO3fu1ODBg7V9+3a98sor2rFjh55++mmtWbNGQ4cOVV5eXpPPERsbq5SUlCY9h91uV3p6usLCQl6JOiTJycmKi4uz9BwtKejgfeGFF+ree+9VeXl5nX1lZWWaPXu2LrroomYdXCAff/yxduzYoeuuu85ru8Ph0Gmnneb1qY7T6XT/4wUAAACA1uDWW2+Vw+HQBx98oHPPPVddunTRqFGjtHr1au3bt0/33HOP+9hu3bppzpw5Gj9+vGJiYtSpUyctWrTIa78kXXzxxTIMw33fd6r5pEmTNG7cOP3pT39SWlqaEhMTdf/996u6ulozZsxQcnKyOnfurMWLF7sf4zvVPNASzx999JEk6aWXXtLgwYMVFxen9PR0XXnllfr555/dzzV8+HBJUlJSkgzD0KRJkyTVnWqen5+vCRMmKCkpSdHR0Ro1apS2b9/u3r9kyRIlJibq/fffV9++fRUbG6uRI0cqOzs74Pe8obFbKejgfffddysvL0+9e/fWI488orfffltvv/225s2bp969eys/P1933313SCcvLi7Wli1b3H+Ju3bt0pYtW7Rnzx5JtVPAJ0yYUOdxzz33nIYMGeJ3usP06dP117/+VS+88IK2bt2qm2++WSUlJV6dzwEAAAAcn0zTlLO0tEVupmkGNca8vDy9//77uuWWW9yrRLmkp6frqquu0muvveb1fI888ogGDBigL7/8UnfddZemTZumVatWSZI+++wzSdLixYuVnZ3tvu/Phx9+qP3792vt2rVasGCB7rvvPo0ePVpJSUnatGmTbrrpJt1444366aef/D7+scceU3Z2tvs2bdo0dejQQX369JEkVVVVac6cOfrqq6+0fPly7d692x2uMzMz9cYbb0iStm3bpuzsbD322GN+zzNp0iRt3rxZK1as0MaNG2Wapi688EJVVVW5jyktLdWjjz6ql156SWvXrtWePXt05513BnztDY3dSkHPF0hLS9OGDRt0880366677nL/IzAMQyNGjNCTTz5Zp6lZQzZv3uz+xEOqDc2SNHHiRC1ZskTZ2dnuEO5SWFioN954I+Bf0OWXX66DBw/q3nvvVU5OjgYOHKj33nsv5LEBAAAAaHvMsjJt+8VpLXLu3l98LiM6usHjtm/fLtM01bdvX7/7+/btq/z8fB08eFAdOnSQJA0bNsy9PPJJJ52k9evX689//rNGjBih1NRUSVJiYmK9l9hKtVO6H3/8cdlsNvXu3Vvz5s1TaWmpu4g6c+ZMzZ07V+vWrdMVV1xR5/GeSzy/+eabeuaZZ7R69Wr3eSdPnuw+tkePHnr88cd1+umnq7i4WLGxsUpOTpYkdejQQYmJiQG/PytWrND69et11llnSapdZSszM1PLly/XpZdeKqk25D/99NPq2bOnJGnq1Km6//77A772hsZupZAm6nfv3l3vvfee8vLytGPHDknSiSee6P7mheq8886r91OhJUuW1NmWkJCg0tLSep936tSpmjp1aqPGBAAAAADHQrAVckl1Lp0dOnSo/vKXv4R8zv79+3utTpWWluY1k9hutyslJcU9PTyQL7/8Utdcc40WLlyoYcOGubd//vnnmjVrlr766ivl5+fL6XRKkvbs2aN+/foFNcatW7cqLCxMQ4YMcW9LSUlR7969tXXrVve26Ohod+iWpIyMjAbHXd/YrdSoK+STk5N1xhlnNPdYAAAAAKBJjKgo9f7i8xY7dzBOPPFEGYahrVu36uKLL66zf+vWrUpKSnJXsptTeHi4133DMPxucwVmf3JycvSb3/xG119/vVffrZKSEmVlZSkrK0tLly5Vamqq9uzZo6ysLFVWVjbvC5H/19LQhxmBxm41a1vTAQAAAMAxZBhGUNO9W1JKSor7ct3bb7/d6zrvnJwcLV26VBMmTJBhGO7tn3zyiddzfPLJJ15T1cPDw1VTU2P52MvLyzV27Fj16dNHCxYs8Nr33XffKTc3V3PnzlVmZqak2suLPblWpapvrH379lV1dbU2bdrknmqem5urbdu2BV01D3XsVgu6uRoAAAAAoHksXLhQFRUVysrK0tq1a7V371699957GjFihDp16qQHH3zQ6/j169dr3rx5+v7777Vo0SItW7ZM06ZNc+/v1q2b1qxZo5ycHOXn51s27htvvFF79+7V448/roMHDyonJ0c5OTmqrKxUly5d5HA49MQTT2jnzp1asWJFnbW5u3btKsMwtHLlSh08eFDFxcV1ztGrVy+NHTtWU6ZM0bp16/TVV1/p6quvVqdOnTR27FhLxm41gjcAAAAAHGO9evXS5s2b1aNHD1122WXq2bOnbrjhBg0fPlwbN26s00frjjvu0ObNmzVo0CA98MADWrBggbKystz758+fr1WrVikzM1ODBg2ybNwff/yxsrOz1a9fP2VkZLhvGzZsUGpqqpYsWaJly5apX79+mjt3rh599FGvx3fq1EmzZ8/WXXfdpbS0tIC9uRYvXqzTTjtNo0eP1tChQ2Wapt55550608uba+xWM8xQruhvJ4qKipSQkKDCwkLFx8e39HAAAAAABFBeXq5du3ape/fuioyMbOnhWKJbt2667bbbvNa5xrFR37+vUHIjFW8AAAAAACxE8AYAAAAAwEJ0NQcAAACAVmz37t0tPQQ0ERVvAAAAAAAsRPAGAAAAAMBCBG8AAAAAbZ7T6WzpIeA41Fz/rrjGGwAAAECb5XA4ZLPZtH//fqWmpsrhcMgwjJYeFto40zRVWVmpgwcPymazyeFwNOn5CN4AAAAA2iybzabu3bsrOztb+/fvb+nh4DgTHR2tLl26yGZr2mRxgjcAAACANs3hcKhLly6qrq5WTU1NSw8Hxwm73a6wsLBmmUFB8AYAAADQ5hmGofDwcIWHh7f0UIA6aK4GAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYqEWD99q1azVmzBh17NhRhmFo+fLlDT6moqJC99xzj7p27aqIiAh169ZNzz//vHv/kiVLZBiG1y0yMtLCVwEAAAAAQGBhLXnykpISDRgwQJMnT9Yll1wS1GMuu+wyHThwQM8995xOPPFEZWdny+l0eh0THx+vbdu2ue8bhtGs4wYAAAAAIFgtGrxHjRqlUaNGBX38e++9p48//lg7d+5UcnKyJKlbt251jjMMQ+np6c01TAAAAAAAGq1NXeO9YsUKDR48WPPmzVOnTp100kkn6c4771RZWZnXccXFxeratasyMzM1duxYffPNNy00YgAAAABAe9eiFe9Q7dy5U+vWrVNkZKTeeustHTp0SLfccotyc3O1ePFiSVLv3r31/PPP69RTT1VhYaEeffRRnXXWWfrmm2/UuXNnv89bUVGhiooK9/2ioqJj8noAAAAAAMe/NlXxdjqdMgxDS5cu1RlnnKELL7xQCxYs0AsvvOCueg8dOlQTJkzQwIEDde655+rNN99UamqqnnnmmYDP+9BDDykhIcF9y8zMPFYvCQAAAABwnGtTwTsjI0OdOnVSQkKCe1vfvn1lmqZ++uknv48JDw/XoEGDtGPHjoDPO3PmTBUWFrpve/fubfaxAwAAAADapzYVvIcNG6b9+/eruLjYve3777+XzWYLOI28pqZG//3vf5WRkRHweSMiIhQfH+91AwAAAACgObRo8C4uLtaWLVu0ZcsWSdKuXbu0ZcsW7dmzR1JtJXrChAnu46+88kqlpKTo2muv1bfffqu1a9dqxowZmjx5sqKioiRJ999/vz744APt3LlTX3zxha6++mr9+OOPuv7664/56wMAAAAAoEWbq23evFnDhw93358+fbokaeLEiVqyZImys7PdIVySYmNjtWrVKv3v//6vBg8erJSUFF122WV64IEH3Mfk5+drypQpysnJUVJSkk477TRt2LBB/fr1O3YvDAAAAACAIwzTNM2WHkRrU1RUpISEBBUWFjLtHAAAAABQRyi5sU1d4w0AAAAAQFtD8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALNSiwXvt2rUaM2aMOnbsKMMwtHz58gYfU1FRoXvuuUddu3ZVRESEunXrpueff97rmGXLlqlPnz6KjIzUKaeconfeeceiVwAAAAAAQP1aNHiXlJRowIABWrRoUdCPueyyy7RmzRo999xz2rZtm1555RX17t3bvX/Dhg0aP368rrvuOn355ZcaN26cxo0bp6+//tqKlwAAAAAAQL0M0zTNlh6EJBmGobfeekvjxo0LeMx7772nK664Qjt37lRycrLfYy6//HKVlJRo5cqV7m1nnnmmBg4cqKeffjqosRQVFSkhIUGFhYWKj48P6XUAAAAAAI5/oeTGNnWN94oVKzR48GDNmzdPnTp10kknnaQ777xTZWVl7mM2btyoCy64wOtxWVlZ2rhx47EeLgAAAAAACmvpAYRi586dWrdunSIjI/XWW2/p0KFDuuWWW5Sbm6vFixdLknJycpSWlub1uLS0NOXk5AR83oqKClVUVLjvFxUVWfMCAAAAAADtTpuqeDudThmGoaVLl+qMM87QhRdeqAULFuiFF17wqnqH6qGHHlJCQoL7lpmZ2YyjBgAAAAC0Z20qeGdkZKhTp05KSEhwb+vbt69M09RPP/0kSUpPT9eBAwe8HnfgwAGlp6cHfN6ZM2eqsLDQfdu7d681LwAAAAAA0O60qeA9bNgw7d+/X8XFxe5t33//vWw2mzp37ixJGjp0qNasWeP1uFWrVmno0KEBnzciIkLx8fFeNwAAAAAAmkOLBu/i4mJt2bJFW7ZskSTt2rVLW7Zs0Z49eyTVVqInTJjgPv7KK69USkqKrr32Wn377bdau3atZsyYocmTJysqKkqSNG3aNL333nuaP3++vvvuO82aNUubN2/W1KlTj/nrAwAAAACgRYP35s2bNWjQIA0aNEiSNH36dA0aNEj33nuvJCk7O9sdwiUpNjZWq1atUkFBgQYPHqyrrrpKY8aM0eOPP+4+5qyzztLLL7+sZ599VgMGDNDrr7+u5cuX6+STTz62Lw4AAAAAALWidbxbE9bxBgAAAADU57hdxxsAAAAAgLaG4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAABYKKylBwAAAAAAaH9qnDUqripWYUWhiiqLVFhR6PV11/iuGtl9ZEsPs1kQvNuoV757RW9tf0vxEfGKd9TeEiISar+O8Ll/5OuY8BjZDCY5AAAAAGg+5dXlXsG5sLJQRRVF7m3+QnVhZaGKK4tlygz4vOd3OZ/gjZa19/Bebc3bGtJjbIZNcY642iDuSAg6tMdHxCs6LFqGYVj0agAAAAC0JKfp1OHKwyqqKHIH58LKwoDBuaiyyH1MRU1Fk84dHRat+IjajOLKIQkRCeqX0q+ZXl3LI3i3UVf0vkJnZpzp9Q/e9amSa5vnn+U15XKaTvcPzF7tDel8YUaYV1D3/bq+IB9pjyS0AwAAAMdARU1FbTCuJzj723e48nC91eeG2A370RzgUcxz5QTfUO0+xpGgcHt4M34HWieCdxvVJb6LusR3Cfr4ipoKr2Du+UPndd9PkK9yVqnarFZeeZ7yyvNCHmu4LbxOBT3YirvD7gj5fAAAAEBb5q4+u96b+0zR9hecPQtuTREVFuUVkD2Ds1eg9tkXEx5Dsa0eBO92IsIeodToVKVGp4b0ONM0VV5THlxQryzS4YrDXqG9xqxRlbNKh8oO6VDZoZDHHWmP9K6wB5gK7xvk4yPiFW47/j85AwAAQOvlKn41FJxdx7jfU1celtN0Nvq8NsPmFZzjIuLcFef6QnV7qT63BII36mUYhqLCohQVFqX0mPSQHmuapkqrS0OqrvtOdSmvKVd5Wbl+Lvs55LG7rhWpE9QbuKY9zhEnu80e8vkAAABw/HGazjqdtz3f19YJ1R7HNEf12fO9qm9w9ixCeW6nqXLrQ/CGZQzDUEx4jGLCY9RRHUN6rOs/uEDB3N917K6vD1cdliSVVpeqtLpUOSU5IY89LjzO/zXtDVTcY8Nj+U8OAACgFaqsqfQflv0EZ88qdVFlUbNUn/1d2+wbqH1DNZddHj8I3miVPP+D6qzOIT22xllz9JqYhq5n99lfWl0qSTpcdViHqw5rn/aFPO7Y8NhGXdNO53gAAID6maZZd93nygYq0Ef2lVWXNenckfbI2vd1rina/irQfpqKUZiBRPDGcchusysxMlGJkYkhP7bKWVWngh5sxd3VOd51XKjCjLDa5d6OBPW4iLi6QT1AkI8KiyK0AwCANqOqpiqoJasKKwvdPYRclyPWmDWNPq8h4+h7qRA7cEfYI5rxO4D2huANeAi3hSslKkUpUSkhP9Zz+lKo17S7OsfnV+QrvyK/UeMOpfmcZ8WdXyIAAKAxTNNUSVVJSEtWub5uluqz631OgGZhrsDs3haRQPUZLYbgDTQTh92hE6JO0AlRJ4T0OFfn+GCDuu/X1Wa1qpxVyi3PVW55bsjjjrBH+O0KH0yQp3M8AABtn2f1Odglq1zbmlp9jnPENbhklW+ojnfEKzIsshm/A4D1CN5t1N68Uh0srlBCVLj7Fm7n07u2yLNzfFpMWkiPdXWODzQVPuA0eY9lKipqKvRz2c+N6hzv22kz2Gva4xxxCrPx3w8AAM3FVX0OZskqz2MKKwqbXH122BxKjEis84F9Q0tXxTniqD63E9U1ThWVV6ugtFIFZVUqLKtSYWmVCkorVVhWrYKyShWW1m537S8ordJ5vVP16KUDWnr4zYJ3vm3Ua5/t1cJ/7/DaFu2wKzEqXPEeYTwxOtwrnMdHhSsx2uG9LTJMYYT2Nsmzc3yGMkJ6rGfn+KAa0Xlc0+7qHF9WXaay6jIdKD0Q8thjw2PrXYe9vuXe+CUNADheufrNBNMwzPeYplafYx2xfjtt+4Zp331Un9sH0zRVWllTG4xLq1RQVqmiIwHZMywXllW6vy4orVJRWZUOV1Q36pyHiiua+VW0HIJ3GxXlsKtzUpQKy6p0uLz2H3JpZY1KK2u0vzD09QLjIsK8ArtnaK8vyMdFhstuo6lXW+TZOT5UNc4ar46iwXSMd913dY4vripWcVWx9pfsD+ncrmlpjbmmPSY8hiZ0AADLuWak1btklc/vTtcxrt+TjeWwObxCsdc1zvWE6tjwWNlt9mb6DqA1q65xelWWXSG6sNR3mytM1wbpwrIqVdWYTTp3XESYEqKP5orEKMeRwmC4Er3yRm2h8IS442c5NcM0zaZ9945DRUVFSkhIUGFhoeLjQw8lx1qN01SR64fE41ZQVnV0u3vqRu10Dtf24kZ++uRiGN4/QAlRR3+A/IV4z8p7XESYbIT2dqfKWVW73FsQHeN9p8Y3dSqc3bC7ryVzB3V/Ad5PaKdzPAC0P67fWb7B2V9g9v09Vm027T2W60Pmhjpt+x4TaY/k91U74Fl9dgfjOpXn2uqz62vXn019/x9uN5QQ5fAKy+4wfWS7a9vRMO04LmfZhpIbqXgfB+w2Q0kxDiXFhP6JUFWN029o9wzrnp+IeR5bWlkj05SKyqtVVF6tvQotFNkM1Qno/m6J0b5Vd4diHHZ+qbRR4bZwJUcmKzkyOeTHujrHh9Ix3rWv0lmpGrNGBRUFKqgoCPncYbawetdh9wzyvvuZggcALcc0TZVVl9XbMMxff5TCykKVVJU06dzhtvCQGoe57sc54qg+txOu9+IFZUenZRf4Ccu+leeC0ipVO5tYfY4M86o8ewdoz8LZ0TCdGB2uqHDehzcGFW8/2lrFu6VUVju9grrrP4rawF7tsa+yTqgvr3I26dxhNsMdxuOjPD5t87xF+w/x/GfRPpVXlwcf1H2uaW9q1SLCHlHvVPhAFfcER4LC7XSOBwBJqnZWB1yiyrcbt+++Jlefw+Ma7LTtL1RTfW4fTNNUSWXN0XDs0SSsvspzc1SfHXZbnbAcH3U0SCdGe2472uvpeKw+t4RQciPB2w+Ct/XKq2q8quee/wHVeyutUmVN00J77fSYo1X0OqHdp/mc51T5yHA+fW5vXJWSxqzRXlRZJKfZtH+vrs7xfrvE13NNO53jAbRGvv+nBmoY5q8Ld3FVcZPOHWYLc1eVfRuF1Xf9M/+fth9VrmufS72LR64mYb6VZ1eTscKy5qk+J3pM1w5UefYM0wlRFJRaGsG7iQjerZdpmiqv8q60e067cU3VCTRtvqn/KTrCbB7Xsntfs+7vWnbPyntEGKG9vXGaTvfSLqFe015cWSxTTfv3GhMeE1RQd2878jUNdgA0pNpZ7b72uaFO277HVDubVuGLDY+tt3FYoC7c9OpoH1zV54LSSo+p20cLPV6duH3CdEll47vCS0erz/6ahHmGZc/LJxOjwhVH9bnNIng3EcH7+ORqQuFbZfeqvB9pPucV5EsrVVRerZomhvbIcM/QXn8Dunif+6zR3v64OseH0jHeta+p1yS6lpQJ6pp2nyAfGx7LG1ugjfA3oyfYLtzNUX32d21zoIZhrmOoPrcf3tVn/5VnV2AuaOZCi6v67Hnds2eY9uzE7bktMtzG78B2huDdRARv+DJNU8UV1e7/9H0b0nlW2Yt8g315lZr6UxbtsNfbfK7usm9cv9OeeXaOD2qN9iP3m6NzvOcydQ0t7+Yb5KlGAY1T46yprT4HaBjm2zjMc3uVs6pJ544Jj/EKzvER8QGvf/bczs97++D7/smz+FFQVukVll1rQbuKHs1ZfQ7UJMy38ux6P8VSuQgWwbuJCN5oTk6nqcMV1e5pTXWXfasMeL27a432poiNCAuqW7zvLyHWaG+ffDvH+wvtgYJ8pbOySecOM8KOBvQQr2mnczzaOtM0VV5T7h2WfRqGeQZnz5/Bw1WHm3Ruz5+9QI3D/O2Lc8Qp3EYDyPbAu6Gud5Mwz7DsW3kuKKtq8ozB+MiwIwHa4dMkzM/10B5VaqrPOBYI3k1E8EZrUeM0dbi8geZzPsu+Neca7bERYf6vW48K3ICONdrbr/Lq8qA7xvvub+o1nw6bI6ip8P4q7g576EsxAoG4qs/1NQwLFKqb+uGVZ18H38BcX6iODosmoLQDruqzb+XZfaldqW81ulqFR8J0aVOrz2G2wE3CPJewOjJjz3UsRQC0dgTvJiJ443gQ7BrtvoG9sBl+wdoMKS7Sz3XrQSz7FhsRxhvAdqa+zvENbmumzvFxjriQr2mn2nd8cy1BGGzDMNf9w5VNqz7bDXtQnbb9NRfj32P7cLT6XHd5qtou20c7bvs2F2tK9dkwpLiIsNpp2XWahPm5HtqjSs2qMDheEbybiOCN9s7fGu1HO8hbu0a73WbU6Rbvb9k33wZ0CVHhinawpEZ7Y5qmSqpKQuoY7wpRzdE5Pjosuv6gHiDI0zn+2HA1KWyoYZi/UN3U6nN0WLTf4OzbOMw3VFN9bh9Ms/YytMI6wdmjE7e/bc1cffZsEubZPCze57pnqs+AfwTvJiJ4A43nu0a7v3Xa/S77ZsEa7YGXfas7VZ5rwdofd+d4z+nvnpX1AEG+sLKwyZ3jJSkuPK7+a9r9BPmEiATFhMfIZrSvpomuyxj8NQyrrxv34crDTfpwxW7Yg+q0XecYR4LC7VSf24OK6hqPVVACV579/S5savU5PtJfkzDvyvPRadtHp3ZTfQaaD8G7iQjewLEXzBrtvh3kPd/sNOca7Z6hvb4GdK4wz5uY9se1hnGw1XXP/c3ROd41NT7YjvGubS1ZTXWaTq9u+/U1DPP9oKOipqJJ544KiwrYabu+pmIx4TF8INcO+Ks+F3gsX+X6cLjAY2p3c12a5QizKclfkzDP3zc+1z3TABVoPQjeTUTwBtoW3zXa/S37dqzWaPfffC7s6BJvPkHeEda+KpeQqmqq6oRx37AeaF9TA6hX53ifSntDjegi7ZEyDEMVNRXu5mCBlq/ynL7tOqap1WfXUnWuUBwXEeeuONcXqqk+tx+u6nNhqavi7PFhrUfHbd9O3IVlVWrKrwFX9dl3eaqEqDA/nbgdXh/i8sEt0La1meC9du1aPfLII/r888+VnZ2tt956S+PGjQt4/EcffaThw4fX2Z6dna309HRJ0qxZszR79myv/b1799Z3330X9LgI3kD74bnGqL/Gc55Vdt9l35p7jXa/Dej8dJVPjHawRns75dk5PtiO8a79Te0cH24Ll92wq7ymvEnPExUWVW+n7UBNxdrjFPv2yHcJzjqVZ4+w7Nudu6yqadXniDCb/yZhrqDsp/KcGOVQXCQreQDtVSi5MewYjcmvkpISDRgwQJMnT9Yll1wS9OO2bdvm9cI6dOjgtb9///5avXq1+35YWIu+TACtmGEYiousnbbXOSm0x4a6RrvnG0XXGu2llTUqraxRdmHoYca1RnudwO53CTga5BwPIsMiFRkWqQ7RHRo+2IPfzvENVdw9vq4xa1TlrFKVqiQdrT77u7Y54NJVR75m+bb2oaK6xmst56Pdtyvr/H/oeT10c1SffS8X8m0S5vkhpud9qs9AK2GaUmWJVJYvGTYpoVNLj6hZtGgiHTVqlEaNGhXy4zp06KDExMSA+8PCwtwVcACwis2jA3tmcmiPda3R7q/hTrBrtBdXVKu4olr7CkK/ZjguMszvdevuBnQ+0+VdUyVZo71tMgxD0eHRig6PVnpMaL8fXZ3jXQHc1ZWd6vPxz/XhYqFPd+2GKs+FZU2vPkeG2wI0CTt63bNnmHYdS/UZaEXcATqvNkS7bqWe9wu897v2OWs/6FX/S6RLF7foy2gubbIUPHDgQFVUVOjkk0/WrFmzNGzYMK/927dvV8eOHRUZGamhQ4fqoYceUpcuXQI+X0VFhSoqjl43V1RUZNnYAUCqXTatttriUNeU0B5bXeNUUXm1V+XIs9FcMGu0Hy6v1uHyav2UH1pod63R7hnYg132jTXa2ybDMBTriFWsI7alh4JGcq024XWNcwOVZ9f/Hc1RfXb/v+BnqrbnShOuJa1oWgm0Mv4CdKlPmPa9+QboxrA7pCYu+9matKngnZGRoaefflqDBw9WRUWF/va3v+m8887Tpk2b9Itf/EKSNGTIEC1ZskS9e/dWdna2Zs+erbPPPltff/214uLi/D7vQw89VOe68Favplqy2Wt/qwFoV8LsNiXHOJQcE/qU3eDXaK+7Tnt5lVNOU+77e/JCO7fdZijeVWn3WtItzKvCHh9VtxLPGu1o75xOU4fLq+tUnj2bhHkH6KNV6vKqpi3V6Ko+ezcJ8+g54ee654RoZsgArY5pSpXF9VSfA4Tn5gjQUclSVFLtLTpZiko8ct9ju3vfka/Do4+rrNNqupobhtFgczV/zj33XHXp0kUvvfSS3/0FBQXq2rWrFixYoOuuu87vMf4q3pmZma27udq/H5L+71EpMkGKTDzyZ0LtP2LX13W2J3pvD+M6OwDB87dGu+80U6vWaA9zTev312zOT7d4z7XaWaMdrUl5VY3Xz47vzJWCAJ24C8ua1szRZuhoP4gAlWff656pPgOtlG+ADjY8N2eAdgfkxHYXoD21meZqzeGMM87QunXrAu5PTEzUSSedpB07dgQ8JiIiQhEREVYMzzrlBZKzWirNrb01RlhUA0G9nu0R8bUVdwDtRmS4XZHhdnWIjwzpcf7WaPe8PtR72Tf/a7RXO03lllQqt6Qy5HE77DavKe/13XyvdydwwB9X9dmz47ZnWK677Wh37qZWn6PC7X6ahHl/2OR73TPVZ6CV8gzQdcJz3pHrn49lgK4nPEclS+FRx22APhbafPDesmWLMjIyAu4vLi7WDz/8oGuuueYYjuoYuGCWdNbvpPLCI7eCo1+XFfjZXiCVHdlWUVj7HNVl0uEy6XB248YQER9aWPfc7ojhBxdoJwzDUJTDriiHXekJoYf2htZo9xfYXV/XOE1V1jh1qLhCh4pDXwPbtbxQnevW3VPjwzyq8N7BhzXaWz9X9dmz43aBx4c+tWG5tp+CazZHcywlaPPovF23SZhPJ26PJa34MAhopQIGaNfXBYEr080RoL0CcqKfad1JBOhWoEWDd3FxsVcleteuXdqyZYuSk5PVpUsXzZw5U/v27dOLL74oSfrLX/6i7t27q3///iovL9ff/vY3ffjhh/rggw/cz3HnnXdqzJgx6tq1q/bv36/77rtPdrtd48ePP+avz1LhUbWt9RvTXt9ZI1UUeYTzQGE9wPaq0trnqSiqvRU2Yvy2MI8w3lBQT6y7PayNzVAA0CiGYSgmIkwxEWHqmBgV0mPrrNHu0yk+mDXaK6qdOlBUoQNFoYf2qHB7nQZ0wS77xhrtwfOsPvttEhag8lxQWqWK6qZXn30rz76XOnhWnlkdAGjlXAHab/X5SIAOtM9Z3fjz2iP8BOSk+qvPUUkE6DamRYP35s2bNXz4cPf96dOnS5ImTpyoJUuWKDs7W3v27HHvr6ys1B133KF9+/YpOjpap556qlavXu31HD/99JPGjx+v3Nxcpaam6pe//KU++eQTpaamHrsX1trZ7Ed/cBujutI7tJfnhxDgC2r/Y2qOafJ+g3qQU+aZJg8c95prjfbAS75V1tlWUHp0jfayqhqVFTZ9jfaEqDCvhlUBg/yR7W11jfbyqpo6az37Ngnzt2xVc1Wf/TcJC3A99JE/I8L4XQK0Sn4DtM8SVoH2WRmg/VWfCdDtRqtprtaahHKRPEJkmrUV86CCekHd7eVFapZlBSLiG3dte2SC5IjlP0cAAYW6RrvnzbVGe1N4rtEeeNk3R50qe3Osf+x67Z6VZ/c0ba9trkZ8R8N0U6vP0Q67/2uco32q0VEOrwAd66D6DLRapilVHA4QnvOlUt9mYlYEaM8O3PWE56gkyRHdbC8dbUMouZHg7QfBuxVzOj2myReEPl2+qqTpYzDsIXaR99kXHto1rgDaD9ca7Z5V30BrtPveXGu0N5ZhSPGRPtPefabD2w3Da6q2b3fuwxXVTa4++07T9l0H2ut66OijHyhQfQZasZACtG8TMQsCdH3hmQCNELSrruZoZ2y2I/9pJkrqGvrjqyuPBvdAVfX6AryzSjJrjvxSyJPyG/EawiIbWW1PrK3U2/mxBY5X3mu0x4T02Mpqp4o8qs2+1637rt9e4DFVvrzKKdM8ukZ7U0U77B5Nwupe4+y7jeoz0EZ4BegQqs/NFqB9lrDyd92zZ2U6PLTeIICVeAeP9iXMIYWdIMWcEPpjTVOqKgsiqBcE2H5kmnx1uVRcLhUfaNxrcMSF3kXetZ1p8sBxyxFm0wmxETohNvTmkxXVNf6bz/ms0V5jmgGve67900FHd6AtCBSgS32WsPINz1YE6Pqqz9Ee10ADbRzBGwiWYdROPXJES/GBl7ALyOmUKg+H3kXetd01Tb7ycO2t6KdGvAZb4zvJRyYyTR44TkWE2dUhzq4OcfyMA22KO0D7Vp89A7S/ffm1M/gaKyzSJyD7NhILsB40ARrtGMEbOFZsHqE3sUvoj6+pqq2a11tVDxDg3dPknUd/8TaGPaKR1fYkpskDABCIadZeCucvIPsL0J4duZsUoKN8AnI9AdqzMk2ABkLGu2CgrbCHSzEptbdQmUemuIfaRd7zeJlSTYVU8nPtrTEcsT5N50II8RFxTJMHALRuvgHaa8mqgsDV5+YM0NE+XbgDVZ8J0MAxRfAG2gPDqP3lGh7V9GnydSrqQUyXryyufZ7K4tpbY6fJR8QH2Uned3tC7bQ4gjsAIBihBOhSnzBtSYCuJzwToIE2geANoGGe0+Qbw2uafAjXtbu21VTWTpN3TbNvDLsjuGnxvp3kIxOlyPjaGQcAgLbFM0D7BmTfmxUBOtqnC3egqdsEaOC4R/AGYL2mTJOXPLrJh9JF3qMibzprw3tTpsmHxzSuk3xkQm0nehtdngGg0YIN0F77jjQYa2qA9grIiQ1Un49UqQnQAHwQvAG0fq5p8nHpoT/W1fE11C7yrq8rD9c+T1VJ7a1oX+hjcE2TD7WLvOvr8CimyQM4PrgCdNDh2aoAnVRPeCZAA2h+BG8AxzfDqJ0qHhkvKTP0x9dU175JdHWHDzXA11Q00zT5hBCq7Yne25kmD6C5meaR/+eCnbrt0aG7KQE6PDrE8JxEgAbQKhC8AaA+9rDaN3PRyY17fFV547rIu7a7p8kfrL01RnhM6F3kXV9HxDNNHjie1QnQnus/B6o+H8sA7dtEjLXmAbRNBG8AsFJ4ZO0tLi30x5pmbRf4ULvIu7b7TpM/vL8RL8A1Y8C3CV1icCE+PJpp8sCx4HT6rAPtEaADhufmDNA+S1gFrD4ToAG0TwRvAGitDKN2/fKIODV5mnwo17W7tleXSzI91nLfE/oYbOEhVtuTvKfVhzlCPyfQlnkFaI/qcsCp255duJ2NP6+/AN1QeCZAA0DQCN4AcLxqtmnyvkG9ILgAb9ZIziqp9FDtrTHCoxsI6vXsi0hgmjxajjtA+1SX66s+l+bV/jw1OUB7XNvcUHiOTq79GSJAA4ClCN4AAP+aPE2+pPHV9oqi2uepKq29Hc5uxAswjnaTj/JpPhdMFZ5p8pD8B+hS30ZiPmG6WQJ0jPcSVvUFaNc+AjQAtFoEbwBA8zMMKSK29pbQOfTHO2sad1276+vqMkmmVFFYeytsxGuwhYW4ZrvPPqbJty5OZ+2/Ba+AXE+AdlWmmzNAR/s2EguwHjQBGgCOOwRvAEDrY7M3bZp8dYWfQF4QfIA3ayRntVSaW3trjLCoxnWSj0o80k3e3rjzHu98A3Qw1WdLA3SA8Oy6hUU020sHALRdBG8AwPEnLEKK7VB7C5V7mnwjq+0VR8rr1WVScZlUnNO41xARH0K13We7I6b1T5OvN0AHCM/NGaDrqz7XmdZNgAYANA3BGwAAT17T5DuF/nhnzZFu8iFe1+7aXl1W+zwVRbW3Jk2Tb6gJXaL/7aGETM8AHczU7eYM0NE+S1jVW30+ciwBGgDQAgjeAAA0J5v9aNhLasTjqyukcs9l4AqCDPBH9jmrm2GafKT/QG7Y/CxpVSDJbNx5JD8BuoGp2wRoAEAbRPAGAKA1CYuQYlNrb6Eyzdou8EFV233+LPOcJl9eO0U+lGnyjtijHbgbnLrtsdwVARoA0A4QvAEAOF4YRu313Y4YKb5j6I931kgVh+tZm93pEaI9w3QiARoAgHoQvAEAQC2b/UjFOrGlRwIAwHHF1tIDAAAAAADgeEbwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQgRvAAAAAAAsRPAGAAAAAMBCBG8AAAAAACxE8AYAAAAAwEIEbwAAAAAALETwBgAAAADAQmEtPYDWyDRNSVJRUVELjwQAAAAA0Bq58qIrP9aH4O3H4cOHJUmZmZktPBIAAAAAQGt2+PBhJSQk1HuMYQYTz9sZp9Op/fv3Ky4uToZhtPRwAAAAAACtjGmaOnz4sDp27Cibrf6ruAneAAAAAABYiOZqAAAAAABYiOANAAAAAICFCN4AAAAAAFiI4A0AAAAAgIUI3gAAtDOGYdR7mzVrVpOee/ny5c02VgAAjges4w0AQDuTnZ3t/vq1117Tvffeq23btrm3xcbGtsSwAAA4blHxBgCgnUlPT3ffEhISZBiG17ZXX31Vffv2VWRkpPr06aMnn3zS/djKykpNnTpVGRkZioyMVNeuXfXQQw9Jkrp16yZJuvjii2UYhvs+AADtHRVvAADgtnTpUt17771auHChBg0apC+//FJTpkxRTEyMJk6cqMcff1wrVqzQP/7xD3Xp0kV79+7V3r17JUmfffaZOnTooMWLF2vkyJGy2+0t/GoAAGgdCN4AAMDtvvvu0/z583XJJZdIkrp3765vv/1WzzzzjCZOnKg9e/aoV69e+uUvfynDMNS1a1f3Y1NTUyVJiYmJSk9Pb5HxAwDQGhG8AQCAJKmkpEQ//PCDrrvuOk2ZMsW9vbq6WgkJCZKkSZMmacSIEerdu7dGjhyp0aNH69e//nVLDRkAgDaB4A0AACRJxcXFkqS//vWvGjJkiNc+17TxX/ziF9q1a5feffddrV69WpdddpkuuOACvf7668d8vAAAtBUEbwAAIElKS0tTx44dtXPnTl111VUBj4uPj9fll1+uyy+/XL/97W81cuRI5eXlKTk5WeHh4aqpqTmGowYAoPUjeAMAALfZs2frd7/7nRISEjRy5EhVVFRo8+bNys/P1/Tp07VgwQJlZGRo0KBBstlsWrZsmdLT05WYmCiptrP5mjVrNGzYMEVERCgpKallXxAAAK0Ay4kBAAC366+/Xn/729+0ePFinXLKKTr33HO1ZMkSde/eXZIUFxenefPmafDgwTr99NO1e/duvfPOO7LZat9SzJ8/X6tWrVJmZqYGDRrUki8FAIBWwzBN02zpQQAAAAAAcLyi4g0AAAAAgIUI3gAAAAAAWIjgDQAAAACAhQjeAAAAAPD/269jAQAAAIBB/taj2FcWwUi8AQAAYCTeAAAAMBJvAAAAGIk3AAAAjMQbAAAARuINAAAAI/EGAACAkXgDAADAKFcYDSW3IxjZAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "for precompile in precompiles:\n", + " plt.figure(figsize=(10, 6))\n", + " plt.plot(data[precompile]['test'], data[precompile]['2'], label='Optimization 2')\n", + " plt.plot(data[precompile]['test'], data[precompile]['3'], label='Optimization 3')\n", + " plt.plot(data[precompile]['test'], data[precompile]['s'], label='Optimization s')\n", + " plt.plot(data[precompile]['test'], data[precompile]['z'], label='Optimization z')\n", + " \n", + " plt.xlabel('Test')\n", + " plt.ylabel('Gas Cost')\n", + " plt.xticks([])\n", + " plt.legend()\n", + " \n", + " plt.title('Gas Cost for Each Test')\n", + " plt.tight_layout()\n", + " \n", + " # Mostrar el gráfico\n", + " plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "id": "59e39fd3-bc8a-42c7-bb8a-142e837fba6a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
test23sz
0ecpairing_one_point_insufficient_gas6675152667515264482149715269
1ecpairing_one_point_with_g2_zero72880728806731260040
2ecpairing_one_point_with_g1_zero1559074155907415535062742166
3ecpairing_one_point_fail6675152667515264482149715269
4ecpairing_empty_data71566715666599858474
5ecpairing_empty_data_insufficient_gas71566715666599858474
6ecpairing_three_point_match_113277910132779101282960219371482
7ecpairing_two_point_fail_213277832132778321282952419371080
8ecpairing_three_point_fail_119880182198801821921050429026711
9ecpairing_two_point_fail_113278594132785941283028619371908
10ecpairing_two_point_match_113278732132787321283042419372046
11ecpairing_two_point_match_213278732132787321283042419372046
12ecpairing_two_point_match_313277166132771661282885819370402
13ecpairing_two_point_match_51560106156010615545382743438
14ecpairing_two_point_match_413276878132768781282857019370210
15ecpairing_two_points_with_one_g2_zero6676184667618464492469716541
16ecpairing_two_point_oog13278732132787321283042419372046
\n", + "
" + ], + "text/plain": [ + " test 2 3 s \\\n", + "0 ecpairing_one_point_insufficient_gas 6675152 6675152 6448214 \n", + "1 ecpairing_one_point_with_g2_zero 72880 72880 67312 \n", + "2 ecpairing_one_point_with_g1_zero 1559074 1559074 1553506 \n", + "3 ecpairing_one_point_fail 6675152 6675152 6448214 \n", + "4 ecpairing_empty_data 71566 71566 65998 \n", + "5 ecpairing_empty_data_insufficient_gas 71566 71566 65998 \n", + "6 ecpairing_three_point_match_1 13277910 13277910 12829602 \n", + "7 ecpairing_two_point_fail_2 13277832 13277832 12829524 \n", + "8 ecpairing_three_point_fail_1 19880182 19880182 19210504 \n", + "9 ecpairing_two_point_fail_1 13278594 13278594 12830286 \n", + "10 ecpairing_two_point_match_1 13278732 13278732 12830424 \n", + "11 ecpairing_two_point_match_2 13278732 13278732 12830424 \n", + "12 ecpairing_two_point_match_3 13277166 13277166 12828858 \n", + "13 ecpairing_two_point_match_5 1560106 1560106 1554538 \n", + "14 ecpairing_two_point_match_4 13276878 13276878 12828570 \n", + "15 ecpairing_two_points_with_one_g2_zero 6676184 6676184 6449246 \n", + "16 ecpairing_two_point_oog 13278732 13278732 12830424 \n", + "\n", + " z \n", + "0 9715269 \n", + "1 60040 \n", + "2 2742166 \n", + "3 9715269 \n", + "4 58474 \n", + "5 58474 \n", + "6 19371482 \n", + "7 19371080 \n", + "8 29026711 \n", + "9 19371908 \n", + "10 19372046 \n", + "11 19372046 \n", + "12 19370402 \n", + "13 2743438 \n", + "14 19370210 \n", + "15 9716541 \n", + "16 19372046 " + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"ecpairing\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "4f398751-b5d3-46cd-a113-307deb139890", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "62298.857142857145" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"ecadd\"][\"3\"].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "37a333a8-28fc-476a-9f2e-eb0cf6103cb4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "62298.857142857145" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"ecadd\"][\"s\"].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "id": "494deb22-1c68-4d5d-9837-c864357f9563", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
test23sz
0ecmul_0_0_0_21000_9654546545465406653840
1ecmul_0_0_0_21000_12854546545465406653840
2ecmul_0_0_0_28000_12854546545465406653840
3ecmul_0_0_0_28000_054528545285404853822
4ecmul_0_0_0_21000_054528545285404853822
..................
113ecmul_7827_6598_9_28000_9696822968229624698462
114ecmul_7827_6598_9935_28000_967547347547347344781060454
115ecmul_7827_6598_9_21000_12896822968229624698462
116ecmul_7827_6598_9_21000_9696822968229624698462
117ecmul_7827_6598_9_28000_12896822968229624698462
\n", + "

118 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " test 2 3 s z\n", + "0 ecmul_0_0_0_21000_96 54546 54546 54066 53840\n", + "1 ecmul_0_0_0_21000_128 54546 54546 54066 53840\n", + "2 ecmul_0_0_0_28000_128 54546 54546 54066 53840\n", + "3 ecmul_0_0_0_28000_0 54528 54528 54048 53822\n", + "4 ecmul_0_0_0_21000_0 54528 54528 54048 53822\n", + ".. ... ... ... ... ...\n", + "113 ecmul_7827_6598_9_28000_96 96822 96822 96246 98462\n", + "114 ecmul_7827_6598_9935_28000_96 754734 754734 734478 1060454\n", + "115 ecmul_7827_6598_9_21000_128 96822 96822 96246 98462\n", + "116 ecmul_7827_6598_9_21000_96 96822 96822 96246 98462\n", + "117 ecmul_7827_6598_9_28000_128 96822 96822 96246 98462\n", + "\n", + "[118 rows x 5 columns]" + ] + }, + "execution_count": 60, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data[\"ecmul\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "id": "de96bfad-f746-4e66-9bc8-5533de2f40fd", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6ggjAAB00vjx41VWVmZ53rGqi8raWqG30qdo3JCb/Fq3JyOMAADQSeHh4X5doeh16l9yfHZJEybH6faRPwhAZd0bN7ACAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIyyFEZyc3N1xx13KCIiQlFRUUpLS9OxY8euOicvL08hISGtvvr27XtdRQMAgJ7DUhjZvXu3li1bpv3798vpdMrr9So5OVn19fVXnRcZGamqqirf16lTp66raAAA0HOEWhm8c+fOVsd5eXmKiopSWVmZ7rnnng7nhYSEKCYmxr8KAQBAj2YpjHxfTU2NJGnQoEFXHVdXV6eRI0equblZ06ZN06uvvqpJkyZ1ON7j8cjj8fiO3W63JMnr9crr9V5Pyd3Klb3aac92Rr/thX7bS2Njo++7nXre2b2GtLS0tPizQHNzsx588EFdvHhRJSUlHY7bt2+fvvjiC02dOlU1NTV68803tWfPHh05ckTDhw9vd86LL76onJycNufz8/MVHh7uT7kAABhzuk56syJUT01pVOwA09UET0NDg37yk5+opqZGkZGRHY7zO4z84he/0CeffKKSkpIOQ0V7vF6vJkyYoIULF2rlypXtjmnvykhsbKwuXLhw1c30NF6vV06nU0lJSQoLCzNdDgKMftsL/baXv1V+rR//31JtWzpdcSOu/mxCT+J2uzV48OBrhhG/nqbJzMzUhx9+qD179lgKIpIUFham+Ph4HT9+vMMxDodDDoej3bl2/Etr133bFf22F/ptD6Ghob7vdup3Z/dq6dU0LS0tyszM1Pbt2/Xpp59q1KhRlgtrampSRUWFhgwZYnkuAADoeSxdGVm2bJny8/O1Y8cORUREyOVySZIGDhyofv36SZIyMjI0bNgw5ebmSpJeeuklzZw5U6NHj9bFixf1xhtv6NSpU3rsscdu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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "boxplot = data[\"ecpairing\"].boxplot(column=['2', '3', 's', 'z']) " + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "3a76d9c0-11ff-4240-a35c-c2b5ac2e60b3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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GZQRwCIbf0TOmenFXBtsPrk2dZdKAbqUHi828TYNAACwijICAACsoowAAACrKCMAAMAqTmAFLlK9Xu/lMr/MQm5DZdpg4+dLZtPD48UzODICAACsoowAAACrKCMAAMAqyggAALCKMgIAAKyijAAAAKsoIwAAwCrKCAAAsIoyAgAArKKMAAAAqygjAADAKsoIAACwijICAACsoowAAACrKCMAAMAqyggAALCKMgIAAKyijAAAAKsoIwAAwCrKCAAAsIoyAgAArKKMAAAAqygjAADAKsoIAACwijICAACsoowAAACrKCMAAMAqyggAALCKMgIAAKxyu4xs2rRJI0aMUGRkpBwOh1atWvWL++Tm5urqq6+Wv7+/unTpokWLFtVjqAAAoClyu4xUVFSoT58+mjdv3nltX1BQoOHDh+v666/X7t27NXnyZI0fP17r1693e7AAAKDpaebuDikpKUpJSTnv7efPn6+YmBjNnj1bktSjRw9t3rxZc+bMUXJysrvxAACgifH6OSN5eXlKSkpyWZacnKy8vLw696msrFR5ebnLBAAAmiavl5Hi4mKFhYW5LAsLC1N5ebn+9a9/1bpPZmamgoODnVNUVJS3hwkAACy5KD9Nk5GRobKyMudUWFhoe0gAAMBL3D5nxF3h4eEqKSlxWVZSUqJWrVopMDCw1n38/f3l7+/v7aEBAICLgNePjCQkJCgnJ8dlWXZ2thISErwdDQAAGgG3j4wcP35c+/fvd84XFBRo9+7dCgkJUadOnZSRkaHDhw/rjTfekCTdd999evHFF/XII4/onnvu0YYNG7Rs2TKtWbPGc/fCDfu693CZ7/H5PivjaIr42QJAw/vpc29jfd51+8jIjh071LdvX/Xt21eSNGXKFPXt21fTpk2TJBUVFenQoUPO7WNiYrRmzRplZ2erT58+mj17tl555RU+1gsAACTV48jI0KFDZYypc31tV1cdOnSodu3a5W4UAAC4BFyUn6YBAACXDsoIAACwijICAACsoowAAACrKCMAAMAqyggAALCKMgIAAKyijAAAAKsoIwAAwCrKCAAAsIoyAgAArKKMAAAAqygjAADAKsoIAACwijICAACsoowAAACrKCMAAMAqyggAALCKMgIAAKyijAAAAKsoIwAAwCrKCAAAsIoyAgAArKKMAAAAqygjAADAKsoIAACwijICAACs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P23at29vpk2b5tHMQYMGmSeeeMI5/+abb5oBAwYYY4z57rvvTFxcnHnwwQc9mnlGZWWlWbp0qZk8ebIZPXq0GT16tJk8ebJZtmyZqays9ErmuRQXF5sZM2Z45bYLCwvNsWPHzlp+6tQps3HjRo/nffPNN2bDhg3Ox+vRo0fNrFmzzIwZM8xnn33m8by6xMTEmH/+858NlldTU2M2bNhgFixYYN59911z6tQpj2cUFhaao0ePOuc3bdpk7rjjDnPttdeaO++886wvy/WEJlNGAgICzL59++pcv2/fPhMQEODx3NWrV59zmjNnjseLQWpqqhk+fLg5evSo+fLLL83w4cNNTEyMOXjwoDHGO2UkISHB/PGPfzTGGPPWW2+ZNm3amEcffdS5furUqebGG2/0aGZmZqaJiYk5q+Q0a9bMfPrppx7NOsPhcJiSkhJjjDF33nmnSUxMND/88IMxxphjx46ZpKQkM2bMGI9mBgYGmgMHDhhjjOnbt69ZsGCBy/q//vWvJjY21qOZxpy+rx988IGZNGmSadeunfHz8zM333yzeffdd011dbXH84wx5oorrjB/+9vfjDGni7qvr6/5y1/+4ly/YsUK06VLF49mBgYGmq+++so5X11dbfz8/ExxcbExxpj333/fREZGejTTGGO+/PJLc/nll5uAgAAzZMgQc/vtt5vbb7/dDBkyxAQEBJguXbqYL7/80uO55+KNF0dHjhwx/fr1Mz4+PsbX19f89re/dSkl3ng+2rZtmwkODjYOh8O0adPG7Nixw8TExJiuXbuaK664wgQGBpr8/HyPZs6dO7fWydfX12RkZDjnPS0lJcX5HPTtt9+aAQMGGIfDYdq3b298fHxM9+7dTWlpqUcz+/fvb959911jjDGrVq0yPj4+5uabbzZ/+MMfzK233mr8/Pyc6z2lyZSRzp07m9dff73O9a+//rqJjo72eO6ZV5cOh6POydMPxNDQUPPJJ58452tqasx9991nOnXqZL766iuvPPhbtWrlfOKsrq42zZo1Mzt37nSu37NnjwkLC/NopjHGbN++3Vx55ZXm97//vfMVQEOVkcsvv9y8//77Lus//PBDExUV5dHMtm3bmh07dhhjTv/f7t6922X9/v37TWBgoEczjXG9r6dOnTJLly41ycnJxtfX10RGRppHH33U438sAwMDnaXZGGP8/PzM3r17nfMHDhwwLVq08GhmdHS02bx5s3P+yJEjxuFwmBMnThhjjCkoKPDKC5WkpCRzyy23mLKysrPWlZWVmVtuucUMGzbMo5kff/zxOaelS5d6/LkhLS3NDBgwwHz00UcmOzvbxMfHm2uuucZ89913xpjTZcThcHg0MykpyYwfP96Ul5ebZ5991nTs2NGMHz/euf7uu+82qampHs10OBymY8eOpnPnzi6Tw+EwHTp0MJ07dzYxMTEezTyTe+Zxev/995vY2Fjn0dnCwkITHx9v7rvvPo9mXnbZZc6MAQMGmFmzZrmsf+GFF0zfvn09mtlkysiLL75o/P39zYMPPmhWr15ttm7darZu3WpWr15tHnzwQRMYGGjmzZvn8dzIyEizatWqOtfv2rXL4w/+oKCgWg9DTpw40XTs2NFs2rTJK2Vk//79zvmWLVu6vNo8cOCAV57QjTl9RCItLc307t3b7Nmzx/j5+Xm1jJx5lREZGWn27Nnjst4b9/Ouu+4y9957rzHGmJEjR5rHHnvMZf3TTz9tevXq5dFMY1yf5H7q4MGDZvr06SY6Otrjv0cxMTFm7dq1xhhj/vnPfxofHx+zbNky5/o1a9aYzp07ezRz0qRJ5qqrrjJr1641GzZsMNdff70ZOnSoc/26devMFVdc4dFMY04Xr5///vzUJ5984vGSea4XR2eWe/r/NDIy0mzbts05f/LkSTNixAgTFxdnvv32W6+8OGrTpo3zOfDUqVPGx8fHZQz5+fmmQ4cOHs38z//8TxMXF3fWc683XxwZ4/o47datm1m9erXL+g8++MDjJSg4ONh8/PHHxpjTL5DO/PuM/fv3e/xFQ5MpI8YYs2TJEjNgwADTrFkz5wOwWbNmZsCAAWbp0qVeyRwxYoR5/PHH61y/e/duj78q6Nevn3njjTdqXTdx4kTTunVrjz/4e/fu7fwjYszpIyFVVVXO+U2bNnnlVcFPvfXWWyYsLMz4+Ph4tYz06tXL9O3b17Rs2dK8/fbbLus3btzo8Se5w4cPm86dO5vBgwebKVOmmMDAQHPttdeaCRMmmMGDB5vmzZubNWvWeDTTmLrLyBk1NTVnHRm6UI899php3769GT9+vImJiTFTp041nTp1MllZWWb+/PkmKirK/Pd//7dHM48dO2Zuv/125/NCYmKiy3k/69evdylEnhIREXHOQ9nvvPOOiYiI8Ghm27ZtzauvvmoOHDhQ67RmzRqPPzdcdtllZ50zUVVVZVJTU03v3r3NJ5984pXMgoIC5/zPXxwdPHjQKy+OVqxYYaKioswLL7zgXNYQZeTMC6TQ0FCXI4nGnH6B5O/v79HMm2++2UydOtUYY0xycvJZbz+9/PLLpmvXrh7NbFIf7R01apRGjRqlqqoqffPNN5Kkdu3ayc/Pz2uZDz/8sCoqKupc36VLF/3jH//waOatt96qt956S7/97W/PWvfiiy+qpqZG8+fP92jm/fffr+rqauf8z791ee3atR7/NM3PjR49Wtdee63y8/MVHR3tlYzp06e7zLds2dJl/t133/X4p08iIyO1a9cuzZo1S++++66MMdq+fbsKCws1aNAgffjhh175FFh0dPQ5P9LqcDh04403ejRzxowZzk+0TJgwQVOnTlWfPn30yCOP6MSJExoxYoSeeuopj2a2bNlSS5cu1cmTJ/Xjjz+e9X86bNgwj+adMX78eKWlpenxxx/Xr371q7M+4Tdz5kw98MADHs2Mj4/XkSNH6nx8/PDDDx6/Ts/ll1+uTz75RF27dnUua9asmZYvX66RI0fqpptu8mieJEVFRenrr79W586dJUlLlixRRESEc31RUZHatWvn8dxbb71V/fv3V1pamtasWaPXXnvN4xm1GTdunPz9/VVVVaWCggL17NnTua64uFitW7f2aN6sWbN03XXX6ciRI7r22mv1xz/+UR999JF69OihL774QkuXLvX435gmdWQEAC4ms2bNMhEREc63R868VRIREWGeeeYZj+etWLHCvPnmm3Wu/+6778yiRYs8mvnII4/Uee5LVVWVufnmmz1+dPiJJ54wb731Vp3rH330UXPbbbd5NPOnampqzNNPP23Cw8ONr6+vV4+MjBs3zmX6+VH+hx9+2CQnJ3s8d//+/Wb06NEmKCjI+U6Dn5+fSUxMNCtXrvR4XpO5zggAXKwKCgpcLsR45poyTcGPP/6oEydOqFWrVnWuP3z4sNeOZtbmxIkT8vX19epX3ktSfn6+Nm/erLS0NLVp08arWXWpqKiQr6+vAgICvHL7xhiVlpaqpqbGq+80cDl4APCymJgYJSQkKCEhwVlECgsLdc899zToOLyR2axZszqLiHT6LZMZM2Z4NPOXfPvtt7r//vu9nhMfH69JkyapTZs2Vv4/Jem7777Tf/3Xf3nt9h0Oh8LCwhQREeEsIt64rxwZAQALPv74Y1199dUu52KRSWZjyPVGZpM6gRUALhbvvPPOOdd//fXXZJJ5UebayOTICAB4gY+PjxwOxzk/veJwODz66pLMppVpK9dKpsduCQDgFBERoRUrVqimpqbWaefOnWSSeVHm2sikjACAF8THxys/P7/O9b/0ypNMMm3l2sjknBEA8AIbF0Qks2ll2sq1kck5IwAAwCrepgEAAFZRRgAAgFWUEQAAYBVlBAAAWEUZAQAAVlFGAACAVZQRAABgFWUEAABY9f99GLprm5+uUwAAAABJRU5ErkJggg==", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "ax = data[\"ecpairing\"].plot.bar(column=['2', '3', 's', 'z'],rot=0)" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "id": "c9ff5ceb-e094-4df8-b735-b007bdfb0ddf", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.0, 3000000.0)" + ] + }, + "execution_count": 92, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHHCAYAAABDUnkqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA9g0lEQVR4nO3deVwVZf//8fdB5eAGigooIqCY+0JuoRmaC6KWVJq32dcltbpTc6ks6r41taLc69a0bu8wS1OxWy0rl1A0FSv3JdNcIQNcUFBUVJjfH/48tyfAPAocHF/Px+M8Hs4118x85hyVN9dcM8diGIYhAAAAk3BxdgEAAAD5iXADAABMhXADAABMhXADAABMhXADAABMhXADAABMhXADAABMhXADAABMhXADAABMhXADFCEBAQHq16+fs8vADY4ePSqLxaI5c+bYta9YsUKNGzeWm5ubLBaLzp49q379+ikgIKDQa4yLi5PFYlFcXFyhHxsoigg3QCHYvXu3unfvLn9/f7m5ucnX11cdOnTQv/71L2eXlqc//vhDb775pnbs2OHsUoqc06dP68knn1TJkiU1Y8YMffbZZypdunSBH/fDDz/MEbIK040hLyAgQG+++abTagFuprizCwDMbtOmTWrbtq2qVaumQYMGycfHR4mJidq8ebPef/99DR061NZ3//79cnEpGr9z/PHHHxo7dqwCAgLUuHFjZ5fjNP7+/rp48aJKlChha/v555917tw5jR8/Xu3bt7e1//vf/1Z2dnaB1fLhhx+qYsWKOUb3HnroIV28eFGurq4FdmzgbkK4AQrY22+/LQ8PD/38888qV66c3boTJ07YLVut1kKszDkuXbokV1fXIhPi8nL16lVlZ2fL1dVVbm5uduuuf25//jxvDECFycXFJUeNwL2saP/vApjAoUOHVK9evRw/CCXJy8vLbjm3OTe7du1SaGioSpYsqapVq+qtt95SdHS0LBaLjh49ardt165dtWHDBjVv3lxubm6qXr265s6da7e/1NRUvfzyy2rQoIHKlCkjd3d3hYeHa+fOnbY+cXFxatasmSSpf//+slgsOS5J5DY3qE2bNmrTpo3dfiwWixYsWKB//OMf8vX1ValSpZSeni5J+vHHH9WpUyd5eHioVKlSCg0N1caNG2/6fqakpKh48eIaO3ZsjnX79++XxWLR9OnTbW1n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v+k2c+bMkcVisXu5ubkVUsUAAKCoc2q4WbdunQYPHqzNmzdr9erVunLlijp27KiMjIybbufu7q6kpCTb69ixY4VUMQAAKOqKO/PgK1assFueM2eOvLy8tHXrVj300EN5bmexWOTj41PQ5QEAgLtQkZpzk5aWJkny9PS8ab/z58/L399ffn5+6tatm/bu3VsY5QEAgLtAkQk32dnZGj58uFq1aqX69evn2a9WrVr65JNPtGzZMn3++efKzs5Wy5Yt9fvvv+faPzMzU+np6XYvAABgXhbDMAxnFyFJf//73/Xdd99pw4YNqlq16i1vd+XKFdWpU0e9evXS+PHjc6x/8803NXbs2BztaWlpcnd3v6OaAQBA4UhPT5eHh8ct/fwuEiM3Q4YM0fLly7V27VqHgo0klShRQsHBwTp48GCu6yMjI5WWlmZ7JSYm5kfJAACgiHLqhGLDMDR06FAtWbJEcXFxCgwMdHgfWVlZ2r17tzp37pzreqvVKqvVeqelAgCAu4RTw83gwYM1f/58LVu2TGXLllVycrIkycPDQyVLlpQk9enTR76+voqKipIkjRs3Tg888ICCgoJ09uxZTZw4UceOHdPAgQOddh4AAKDocGq4mTlzpiSpTZs2du3R0dHq16+fJCkhIUEuLv+7enbmzBkNGjRIycnJKl++vJo0aaJNmzapbt26hVU2AAAoworMhOLC4siEJAAAUDTcdROKAQAA8gvhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmEpxZxcAAMDdKOC1b5xdglMcfbeLs0v4S4zcAAAAUyHcAAAAUyHcAAAAU3FquImKilKzZs1UtmxZeXl5KSIiQvv37//L7WJiYlS7dm25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pkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAAplIkws2MGTMUEBAgNzc3tWjRQj/99FOefefMmSOLxWL3cnNzK8RqAQBAUeb0cLNw4UKNHDlSY8aM0bZt29SoUSOFhYXpxIkTeW7j7u6upKQk2+vYsWOFWDEAACjKnB5upkyZokGDBql///6qW7euZs2apVKlSumTTz7JcxuLxSIfHx/by9vbuxArBgAARZlTw83ly5e1detWtW/f3tbm4uKi9u3bKz4+Ps/tzp8/L39/f/n5+albt27au3dvnn0zMzOVnp5u9wIAAObl1HBz6tQpZWVl5Rh58fb2VnJycq7b1KpVS5988omWLVumzz//XNnZ2WrZsqV+//33XPtHRUXJw8PD9vLz88v38wAAAEWH0y9LOSokJER9+vRR48aNFRoaqv/+97+qVKmSPvroo1z7R0ZGKi0tzfZKTEws5IoBAEBhKu7Mg1esWFHFihVTSkqKXXtKSop8fHxuaR8lSpRQcHCwDh48mOt6q9Uqq9V6x7UCAIC7g1NHblxdXdWkSRPFxsba2rKzsxUbG6uQkJBb2kdWVpZ2796typUrF1SZAADgLuLUkRtJGjlypPr27aumTZuqefPmmjZtmjIyMtS/f39JUp8+feTr66uoqChJ0rhx4/TAAw8oKChIZ8+e1cSJE3Xs2DENHDjQmacBAACKCKeHm549e+rkyZMaPXq0kpOT1bhxY61YscI2yTghIUEuLv8bYDpz5owGDRqk5ORklS9fXk2aNNGmTZtUt25dZ50CAAAoQpwebiRpyJAhGjJkSK7r4uLi7JanTp2qqVOnFkJVAADgbnTX3S0FAABwM4QbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKoQbAABgKkUi3MyYMUMBAQFyc3NTixYt9NNPP920f0xMjGrXri03Nzc1aNBA3377bSFVCgAAijqnh5uFCxdq5MiRGjNmjLZt26ZGjRopLCxMJ06cyLX/pk2b1KtXLw0YMEDbt29XRESEIiIitGfPnkKuHAAAFEVODzdTpkzRoEGD1L9/f9WtW1ezZs1SqVKl9Mknn+Ta//3331enTp30yiuvqE6dOho/frzuv/9+TZ8+vZArBwAARZFTw83ly5e1detWtW/f3tbm4uKi9u3bKz4+Ptdt4uPj7fpLUlhYWJ79AQDAvaW4Mw9+6tQpZWVlydvb267d29tbv/76a67bJCcn59o/OTk51/6ZmZnKzMy0LaelpUmS0tPT76T025adecEpx3U2Z73fzsbnfW/h87638Hk757iGYfxlX6eGm8IQFRWlsWPH5mj38/NzQjX3Lo9pzq4AhYnP+97C531vcfbnfe7cOXl4eNy0j1PDTcWKFVWsWDGlpKTYtaekpMjHxyfXbXx8fBzqHxkZqZEjR9qWs7OzlZqaqgoVKshisdzhGdw90tPT5efnp8TERLm7uzu7HBQwPu97C5/3veVe/bwNw9C5c+dUpUqVv+zr1HDj6uqqJk2aKDY2VhEREZKuhY/Y2FgNGTIk121CQkIUGxur4cOH29pWr16tkJCQXPtbrVZZrVa7tnLlyuVH+Xcld3f3e+ofw72Oz/vewud9b7kXP++/GrG5zumXpUaOHKm+ffuqadOmat68uaZNm6aMjAz1799fktSnTx/5+voqKipKkjRs2DCFhoZq8uTJ6tKlixYsWKAtW7bo448/duZpAACAIsLp4aZnz546efKkRo8ereTkZDVu3FgrVqywTRpOSEiQi8v/bupq2bKl5s+fr3/84x96/fXXVbNmTS1dulT169d31ikAAIAixOnhRpKGDBmS52WouLi4HG09evRQjx49Crgqc7FarRozZkyOS3QwJz7vewuf972Fz/uvWYxbuacKAADgLuH0JxQDAADkJ8INAAAwFcINAAAwFcINAAAwFcKNyUVFRalZs2YqW7asvLy8FBERof379zu7LBSQmTNnqmHDhraHe4WEhOi7775zdlkAUKgINya3bt06DR48WJs3b9bq1at15coVdezYURkZGc4uDQWgatWqevfdd7V161Zt2bJFDz/8sLp166a9e/c6uzQAKDTcCn6POXnypLy8vLRu3To99NBDzi4HhcDT01MTJ07UgAEDnF0KCsDixYs1duxYHTx4UKVKlVJwcLCWLVum0qVLO7s05LOjR48qMDAwR3toaGiuz4S7lxWJh/ih8KSlpUm69gMP5paVlaWYmBhlZGTk+d1ruLslJSWpV69emjBhgh577DGdO3dOP/zwg/id1Zz8/PyUlJRkW05OTlb79u35RTUXjNzcQ7Kzs/Xoo4/q7Nmz2rBhg7PLQQHZvXu3QkJCdOnSJZUpU0bz589X586dnV0WCsC2bdvUpEkTHT16VP7+/s4uB4Xo0qVLatOmjSpVqqRly5bZfU0RGLm5pwwePFh79uwh2JhcrVq1tGPHDqWlpWnx4sXq27ev1q1bp7p16zq7NOSzRo0aqV27dmrQoIHCwsLUsWNHde/eXeXLl3d2aShgzzzzjM6dO6fVq1cTbHLByM09YsiQIVq2bJnWr1+f6zVbmFf79u1Vo0YNffTRR84uBQXAMAxt2rRJq1at0pIlS5ScnKwff/yRf+cm9tZbb2nq1Kn66aefVKNGDWeXUyQR90zOMAwNGTJES5Ys0Zo1a/gP7x6UnZ2tzMxMZ5eBAmKxWNSqVSuNHTtW27dvl6urq5YsWeLsslBAvvzyS40bN06LFi0i2NwEl6VMbvDgwZo/f76WLVumsmXLKjk5WZLk4eGhkiVLOrk65LfIyEiFh4erWrVqOnfunObPn6+4uDitXLnS2aWhAPz444+KjY1Vx44d5eXlpR9//FEnT55UnTp1nF0aCsCePXvUp08fvfrqq6pXr57t/3NXV1duEvkTLkuZnMViybU9Ojpa/fr1K9xiUOAGDBig2NhYJSUlycPDQw0bNtSrr76qDh06OLs0FIB9+/ZpxIgR2rZtm9LT0+Xv76+hQ4dqyJAhzi4NBWDOnDnq379/jnZuBc+JcAMAAEyFOTcAAMBUCDcAAMBUCDcAAMBUCDcAAMBUCDcAAMBUCDcAAMBUCDcAAMBUCDcAbtubb76pxo0b39E+jh49KovFoh07duRLTXlp06aNhg8fXqDHiIuLk8Vi0dmzZwv0ODcqrPcPuJsQbgATS0xM1DPPPKMqVarI1dVV/v7+GjZsmE6fPu3wviwWi5YuXWrX9vLLLys2NvaOavTz81NSUpLq169/R/u5Lq+A8d///lfjx4/Pl2MAKNoIN4BJHT58WE2bNtVvv/2mL774QgcPHtSsWbMUGxurkJAQpaam3vExypQpowoVKtzRPooVKyYfHx8VL16wX3Xn6empsmXLFugxABQNhBvApAYPHixXV1etWrVKoaGhqlatmsLDw/X999/r+PHjeuONN2x9AwICNH78ePXq1UulS5eWr6+vZsyYYbdekh577DFZLBbb8p8vS/Xr108RERF655135O3trXLlymncuHG6evWqXnnlFXl6eqpq1aqKjo62bfPnyyr9+vWTxWLJ8br+3TmfffaZmjZtqrJly8rHx0dPPfWUTpw4YdtX27ZtJUnly5eXxWKxfYfany9LnTlzRn369FH58uVVqlQphYeH67fffrOtnzNnjsqVK6eVK1eqTp06KlOmjDp16qSkpCSHPocNGzaodevWKlmypPz8/PTiiy8qIyNDkvT666+rRYsWObZp1KiRxo0bZ1uePXu26tSpIzc3N9WuXVsffvihQzUA9xrCDWBCqampWrlypV544YUc3/7u4+Oj3r17a+HChbrxq+UmTpyoRo0aafv27Xrttdc0bNgwrV69WpL0888/S7r2hatJSUm25dysWbNGf/zxh9avX68pU6ZozJgx6tq1q8qXL68ff/xRzz//vJ577jn9/vvvuW7//vvvKykpyfYaNmyYvLy8VLt2bUnSlStXNH78eO3cuVNLly7V0aNHbQHGz89PX375pSRp//79SkpK0vvvv5/rcfr166ctW7boq6++Unx8vAzDUOfOnXXlyhVbnwsXLmjSpEn67LPPtH79eiUkJOjll1++2Vtv59ChQ+rUqZOeeOIJ7dq1SwsXLtSGDRtsX2zZu3dv/fTTTzp06JBtm71792rXrl166qmnJEnz5s3T6NGj9fbbb2vfvn1655139M9//lOffvrpLdcB3HMMAKazefNmQ5KxZMmSXNdPmTLFkGSkpKQYhmEY/v7+RqdOnez69OzZ0wgPD7ct57a/MWPGGI0aNbIt9+3b1/D39zeysrJsbbVq1TJat25tW7569apRunRp44svvjAMwzCOHDliSDK2b9+eo84vv/zScHNzMzZs2JDnuf7888+GJOPcuXOGYRjG2rVrDUnGmTNn7PqFhoYaw4YNMwzDMA4cOGBIMjZu3Ghbf+rUKaNkyZLGokWLDMMwjOjoaEOScfDgQVufGTNmGN7e3nnW8udjDxgwwHj22Wft+vzwww+Gi4uLcfHiRcMwDKNRo0bGuHHjbOsjIyONFi1a2JZr1KhhzJ8/324f48ePN0JCQgzDuPn7B9yrGLkBTMy4YWTmr4SEhORY3rdvn8PHrFevnlxc/vdfi7e3txo0aGBbLlasmCpUqGC7lJSX7du36//+7/80ffp0tWrVyta+detWPfLII6pWrZrKli2r0NBQSVJCQsIt17hv3z4VL17c7pJQhQoVVKtWLbtzLlWqlGrUqGFbrly58l/WfaOdO3dqzpw5KlOmjO0VFham7OxsHTlyRNK10Zv58+dLuvZ5ffHFF+rdu7ckKSMjQ4cOHdKAAQPs9vHWW2/ZjfYAsFewM/gAOEVQUJAsFov27dunxx57LMf6ffv2qXz58qpUqVK+H7tEiRJ2yxaLJde27OzsPPeRnJysRx99VAMHDtSAAQNs7RkZGQoLC1NYWJjmzZunSpUqKSEhQWFhYbp8+XL+nohyPxdHAuP58+f13HPP6cUXX8yxrlq1apKkXr166dVXX9W2bdt08eJFJSYmqmfPnrbtJenf//53jrk5xYoVc+hcgHsJ4QYwoQoVKqhDhw768MMPNWLECLt5N8nJyZo3b5769Okji8Via9+8ebPdPjZv3qw6derYlkuUKKGsrKwCr/3SpUvq1q2bateurSlTptit+/XXX3X69Gm9++678vPzkyRt2bLFro+rq6sk3bTWOnXq6OrVq/rxxx/VsmVLSdLp06e1f/9+1a1bN9/O5f7779cvv/yioKCgPPtUrVpVoaGhmjdvni5evKgOHTrIy8tL0rVRrypVqujw4cO20RwAf43LUoBJTZ8+XZmZmQoLC9P69euVmJioFStWqEOHDvL19dXbb79t13/jxo2aMGGCDhw4oBkzZigmJkbDhg2zrQ8ICFBsbKySk5N15syZAqv7ueeeU2Jioj744AOdPHlSycnJSk5O1uXLl1WtWjW5urrqX//6lw4fPqyvvvoqx7Nr/P39ZbFYtHz5cp08edI2+nGjmjVrqlu3bho0aJA2bNignTt36umnn5avr6+6deuWb+fy6quvatOmTRoyZIh27Nih3377TcuWLbNNKL6ud+/eWrBggWJiYnKEmLFjxyoqKkoffPCBDhw4oN27dys6OjpH8APwP4QbwKRq1qypLVu2qHr16nryySdVo0YNPfvss2rbtq3i4+Pl6elp1/+ll17Sli1bFBwcrLfeektTpkxRWFiYbf3kyZO1evVq+fn5KTg4uMDqXrdunZKSklS3bl1VrlzZ9tq0aZMqVaqkOXPmKCYmRnXr1tW7776rSZMm2W3v6+ursWPH6rXXXpO3t3eOIHFddHS0mjRpoq5duyokJESGYejbb7/NcSnqTjRs2FDr1q3TgQMH1Lp1awUHB2v06NGqUqWKXb/u3bvr9OnTunDhgiIiIuzWDRw4ULNnz1Z0dLQaNGig0NBQzZkzR4GBgflWJ2A2FsORC8gATCkgIEDDhw8v8K8nAIDCwMgNAAAwFcINAAAwFS5LAQAAU2HkBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmMr/AyMpe1miCszGAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "mean = data[\"p256verify\"][['2', '3', 's', 'z']].mean()\n", + "\n", + "ax = mean.plot(kind='bar', rot=0, title='Signature verification\"')\n", + "ax.set_xlabel('Optimization level')\n", + "ax.set_ylabel('Gas cost mean')\n", + "ax.set_ylim(0, 3000000)" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "id": "7bcebffe-5e1c-422b-bf1c-89d1c4758a91", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2 1677467\n", + "3 1668249\n", + "s 1686795\n", + "z 2070647\n", + "dtype: int64" + ] + }, + "execution_count": 84, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + " data[\"p256verify\"][['2', '3', 's', 'z']].max()" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "id": "30164f8d-6b04-4f81-92de-6fd2256cef1a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2 1668497\n", + "3 1652901\n", + "s 1677813\n", + "z 2058851\n", + "dtype: int64" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + " data[\"p256verify\"][['2', '3', 's', 'z']].min()" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "id": "01039067-cdbc-4bcc-8254-63aa581d6e1f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2 1673805.0\n", + "3 1660075.0\n", + "s 1683117.0\n", + "z 2065697.0\n", + "dtype: float64" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + " data[\"p256verify\"][['2', '3', 's', 'z']].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "id": "210d9e63-1c55-4823-896f-b5b3768c4cee", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "2 1558247.0\n", + "3 1542233.0\n", + "s 1567525.0\n", + "z 1903101.0\n", + "dtype: float64" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + " data[\"secp256k1verify\"][['2', '3', 's', 'z']].mean()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ca1a170f-2e3d-4a3c-8ced-24069bddda01", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tests/build.rs b/tests/build.rs index 68bfdeb7..15b4af6b 100644 --- a/tests/build.rs +++ b/tests/build.rs @@ -18,8 +18,8 @@ fn main() { precompiles_report_list .into_iter() .for_each(|mut precompile_name| { - let file_path = format!("{}/{}_report.md", directory, precompile_name); - precompile_name.push_str("_report.md"); + let file_path = format!("{}/{}_report.csv", directory, precompile_name); + precompile_name.push_str("_report.csv"); let mut file = OpenOptions::new() .create(true) .write(true) @@ -27,7 +27,6 @@ fn main() { .open(file_path) .unwrap(); - writeln!(file, "| Test case | Gas used |").unwrap(); - writeln!(file, "| --------- | -------- |").unwrap(); + writeln!(file, "test, gas").unwrap(); }); } diff --git a/tests/gas_reports/ecadd_report.csv b/tests/gas_reports/ecadd_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports/ecadd_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports/ecmul_report.csv b/tests/gas_reports/ecmul_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports/ecmul_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports/ecpairing_report.csv b/tests/gas_reports/ecpairing_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports/ecpairing_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports/modexp_report.csv b/tests/gas_reports/modexp_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports/modexp_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports/p256verify_report.csv b/tests/gas_reports/p256verify_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports/p256verify_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports/secp256k1verify_report.csv b/tests/gas_reports/secp256k1verify_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports/secp256k1verify_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports_2/ecadd_report.csv b/tests/gas_reports_2/ecadd_report.csv new file mode 100644 index 00000000..c3af1d7b --- /dev/null +++ b/tests/gas_reports_2/ecadd_report.csv @@ -0,0 +1,29 @@ +test, gas +ecadd_0_0_0_0_21000_0,53973 +ecadd_0_0_0_0_21000_80,53991 +ecadd_0_0_0_0_21000_64,53991 +ecadd_0_0_0_0_25000_192,53991 +ecadd_0_0_0_0_21000_192,53991 +ecadd_0_0_0_0_21000_128,53991 +ecadd_0_0_0_0_25000_128,53991 +ecadd_0_0_0_0_25000_0,53973 +ecadd_0_0_0_0_25000_80,53991 +ecadd_0_0_1_2_25000_128,54465 +ecadd_0_0_1_2_21000_128,54465 +ecadd_0_0_1_2_21000_192,54465 +ecadd_0_0_0_0_25000_64,53991 +ecadd_0_0_1_2_25000_192,54465 +ecadd_1145_3932_2969_1336_21000_128,90285 +ecadd_1_2_0_0_21000_192,54507 +ecadd_1145_3932_1145_4651_21000_192,54573 +ecadd_1_2_0_0_21000_128,54507 +ecadd_1145_3932_1145_4651_25000_192,54573 +ecadd_1145_3932_2969_1336_25000_128,90285 +ecadd_1_2_0_0_25000_128,54507 +ecadd_1_2_0_0_25000_192,54507 +ecadd_1_2_1_2_21000_192,92469 +ecadd_1_2_0_0_21000_64,54507 +ecadd_1_2_0_0_25000_64,54507 +ecadd_1_2_1_2_25000_192,92469 +ecadd_1_2_1_2_21000_128,92469 +ecadd_1_2_1_2_25000_128,92469 diff --git a/tests/gas_reports_2/ecmul_report.csv b/tests/gas_reports_2/ecmul_report.csv new file mode 100644 index 00000000..fb5ea3a4 --- /dev/null +++ b/tests/gas_reports_2/ecmul_report.csv @@ -0,0 +1,119 @@ +test, gas +ecmul_0_0_0_21000_96,54546 +ecmul_0_0_0_21000_128,54546 +ecmul_0_0_0_28000_128,54546 +ecmul_0_0_0_28000_0,54528 +ecmul_0_0_0_21000_0,54528 +ecmul_0_0_0_21000_64,54546 +ecmul_0_0_0_21000_40,54546 +ecmul_0_0_0_21000_80,54546 +ecmul_0_0_0_28000_64,54546 +ecmul_0_0_0_28000_96,54546 +ecmul_0_0_1_21000_96,54546 +ecmul_0_0_1_28000_96,54546 +ecmul_0_0_1_21000_128,54546 +ecmul_0_0_0_28000_80,54546 +ecmul_0_0_2_21000_128,54546 +ecmul_0_0_0_28000_40,54546 +ecmul_0_0_2_21000_96,54546 +ecmul_0_0_2_28000_128,54546 +ecmul_0_0_2_28000_96,54546 +ecmul_0_0_1_28000_128,54546 +ecmul_0_0_340282366920938463463374607431768211456_21000_80,54546 +ecmul_0_0_340282366920938463463374607431768211456_21000_96,54546 +ecmul_0_0_340282366920938463463374607431768211456_21000_128,54546 +ecmul_0_0_5616_21000_96,54546 +ecmul_0_0_340282366920938463463374607431768211456_28000_128,54546 +ecmul_0_0_340282366920938463463374607431768211456_28000_80,54546 +ecmul_0_0_5616_28000_96,54546 +ecmul_0_0_340282366920938463463374607431768211456_28000_96,54546 +ecmul_0_0_5616_28000_128,54546 +ecmul_0_0_5616_21000_128,54546 +ecmul_0_0_5617_21000_96,54546 +ecmul_0_0_5617_28000_128,54546 +ecmul_0_0_5617_28000_96,54546 +ecmul_0_0_9935_21000_128,54546 +ecmul_0_0_5617_21000_128,54546 +ecmul_0_0_9935_28000_96,54546 +ecmul_0_0_9935_28000_128,54546 +ecmul_0_0_9_28000_128,54546 +ecmul_0_0_9935_21000_96,54546 +ecmul_0_0_9_21000_128,54546 +ecmul_0_0_9_28000_96,54546 +ecmul_0_0_9_21000_96,54546 +ecmul_1_2_0_21000_64,54996 +ecmul_1_2_0_21000_80,54996 +ecmul_1_2_0_21000_128,54996 +ecmul_1_2_0_21000_96,54996 +ecmul_1_2_0_28000_128,54996 +ecmul_1_2_0_28000_80,54996 +ecmul_1_2_0_28000_64,54996 +ecmul_1_2_0_28000_96,54996 +ecmul_1_2_1_21000_128,55008 +ecmul_1_2_1_28000_128,55008 +ecmul_1_2_1_21000_96,55008 +ecmul_1_2_2_28000_128,93108 +ecmul_1_2_2_21000_128,93108 +ecmul_1_2_1_28000_96,55008 +ecmul_1_2_2_21000_96,93108 +ecmul_1_2_2_28000_96,93108 +ecmul_1_2_340282366920938463463374607431768211456_21000_96,239382 +ecmul_1_2_340282366920938463463374607431768211456_21000_128,239382 +ecmul_1_2_340282366920938463463374607431768211456_28000_128,239382 +ecmul_1_2_340282366920938463463374607431768211456_28000_80,239382 +ecmul_1_2_340282366920938463463374607431768211456_28000_96,239382 +ecmul_1_2_5616_21000_96,527424 +ecmul_1_2_340282366920938463463374607431768211456_21000_80,239382 +ecmul_1_2_5617_21000_128,493410 +ecmul_1_2_5617_28000_128,493410 +ecmul_1_2_5617_28000_96,493410 +ecmul_1_2_5616_21000_128,527424 +ecmul_1_2_5617_21000_96,493410 +ecmul_1_2_9935_21000_96,753546 +ecmul_1_2_616_28000_96,527424 +ecmul_1_2_5616_28000_128,527424 +ecmul_1_2_9935_21000_128,753546 +ecmul_1_2_9_21000_96,96390 +ecmul_1_2_9935_28000_128,753546 +ecmul_1_2_9935_28000_96,753546 +ecmul_1_2_9_21000_128,96390 +ecmul_1_2_9_28000_128,96390 +ecmul_1_2_9_28000_96,96390 +ecmul_7827_6598_0_21000_128,54996 +ecmul_7827_6598_0_21000_80,54996 +ecmul_7827_6598_0_21000_96,54996 +ecmul_7827_6598_0_21000_64,54996 +ecmul_7827_6598_0_28000_128,54996 +ecmul_7827_6598_0_28000_80,54996 +ecmul_7827_6598_0_28000_64,54996 +ecmul_7827_6598_0_28000_96,54996 +ecmul_7827_6598_1456_21000_80,239340 +ecmul_7827_6598_1456_21000_96,239340 +ecmul_7827_6598_1456_28000_128,239340 +ecmul_7827_6598_1456_21000_128,239340 +ecmul_7827_6598_1456_28000_80,239340 +ecmul_7827_6598_1456_28000_96,239340 +ecmul_7827_6598_1_21000_96,55008 +ecmul_7827_6598_1_28000_128,55008 +ecmul_7827_6598_1_28000_96,55008 +ecmul_7827_6598_2_21000_128,90840 +ecmul_7827_6598_2_28000_128,90840 +ecmul_7827_6598_1_21000_128,55008 +ecmul_7827_6598_2_28000_96,90840 +ecmul_7827_6598_5616_21000_128,526626 +ecmul_7827_6598_5616_21000_96,526626 +ecmul_7827_6598_2_21000_96,90840 +ecmul_7827_6598_5616_28000_128,526626 +ecmul_7827_6598_5616_28000_96,526626 +ecmul_7827_6598_5617_28000_128,493410 +ecmul_7827_6598_5617_21000_128,493410 +ecmul_7827_6598_5617_21000_96,493410 +ecmul_7827_6598_9935_28000_128,754734 +ecmul_7827_6598_5617_28000_96,493410 +ecmul_7827_6598_9935_21000_96,754734 +ecmul_7827_6598_9935_21000_128,754734 +ecmul_7827_6598_9_28000_96,96822 +ecmul_7827_6598_9935_28000_96,754734 +ecmul_7827_6598_9_21000_128,96822 +ecmul_7827_6598_9_21000_96,96822 +ecmul_7827_6598_9_28000_128,96822 diff --git a/tests/gas_reports_2/ecpairing_report.csv b/tests/gas_reports_2/ecpairing_report.csv new file mode 100644 index 00000000..d3255d5c --- /dev/null +++ b/tests/gas_reports_2/ecpairing_report.csv @@ -0,0 +1,18 @@ +test, gas +ecpairing_one_point_insufficient_gas,6675152 +ecpairing_one_point_with_g2_zero,72880 +ecpairing_one_point_with_g1_zero,1559074 +ecpairing_one_point_fail,6675152 +ecpairing_empty_data,71566 +ecpairing_empty_data_insufficient_gas,71566 +ecpairing_three_point_match_1,13277910 +ecpairing_two_point_fail_2,13277832 +ecpairing_three_point_fail_1,19880182 +ecpairing_two_point_fail_1,13278594 +ecpairing_two_point_match_1,13278732 +ecpairing_two_point_match_2,13278732 +ecpairing_two_point_match_3,13277166 +ecpairing_two_point_match_5,1560106 +ecpairing_two_point_match_4,13276878 +ecpairing_two_points_with_one_g2_zero,6676184 +ecpairing_two_point_oog,13278732 diff --git a/tests/gas_reports_2/modexp_report.csv b/tests/gas_reports_2/modexp_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports_2/modexp_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports_2/p256verify_report.csv b/tests/gas_reports_2/p256verify_report.csv new file mode 100644 index 00000000..8fcb7b54 --- /dev/null +++ b/tests/gas_reports_2/p256verify_report.csv @@ -0,0 +1,4 @@ +test, gas +p256verify_valid_signature_one,1677467 +p256verify_invalid_signature,1668497 +p256verify_valid_signature_two,1675451 diff --git a/tests/gas_reports_2/secp256k1verify_report.csv b/tests/gas_reports_2/secp256k1verify_report.csv new file mode 100644 index 00000000..b1338900 --- /dev/null +++ b/tests/gas_reports_2/secp256k1verify_report.csv @@ -0,0 +1,4 @@ +test, gas +secp256k1verify_invalid_signature,1565501 +secp256k1verify_valid_signature_one,1543181 +secp256k1verify_valid_signature_two,1566059 diff --git a/tests/gas_reports_3/ecadd_report.csv b/tests/gas_reports_3/ecadd_report.csv new file mode 100644 index 00000000..f48d96e2 --- /dev/null +++ b/tests/gas_reports_3/ecadd_report.csv @@ -0,0 +1,29 @@ +test, gas +ecadd_0_0_0_0_21000_192,53991 +ecadd_0_0_0_0_21000_64,53991 +ecadd_0_0_0_0_21000_80,53991 +ecadd_0_0_0_0_21000_128,53991 +ecadd_0_0_0_0_25000_0,53973 +ecadd_0_0_0_0_25000_192,53991 +ecadd_0_0_0_0_21000_0,53973 +ecadd_0_0_0_0_25000_128,53991 +ecadd_0_0_1_2_21000_192,54465 +ecadd_0_0_1_2_21000_128,54465 +ecadd_0_0_1_2_25000_128,54465 +ecadd_0_0_0_0_25000_80,53991 +ecadd_0_0_1_2_25000_192,54465 +ecadd_0_0_0_0_25000_64,53991 +ecadd_1145_3932_1145_4651_25000_192,54573 +ecadd_1_2_0_0_21000_128,54507 +ecadd_1145_3932_2969_1336_21000_128,90285 +ecadd_1145_3932_1145_4651_21000_192,54573 +ecadd_1145_3932_2969_1336_25000_128,90285 +ecadd_1_2_0_0_21000_192,54507 +ecadd_1_2_1_2_21000_128,92469 +ecadd_1_2_1_2_25000_128,92469 +ecadd_1_2_0_0_25000_64,54507 +ecadd_1_2_1_2_21000_192,92469 +ecadd_1_2_1_2_25000_192,92469 +ecadd_1_2_0_0_25000_128,54507 +ecadd_1_2_0_0_25000_192,54507 +ecadd_1_2_0_0_21000_64,54507 diff --git a/tests/gas_reports_3/ecmul_report.csv b/tests/gas_reports_3/ecmul_report.csv new file mode 100644 index 00000000..ba3b440e --- /dev/null +++ b/tests/gas_reports_3/ecmul_report.csv @@ -0,0 +1,119 @@ +test, gas +ecmul_0_0_0_21000_80,54546 +ecmul_0_0_0_28000_0,54528 +ecmul_0_0_0_21000_64,54546 +ecmul_0_0_0_21000_0,54528 +ecmul_0_0_0_21000_96,54546 +ecmul_0_0_0_21000_40,54546 +ecmul_0_0_0_28000_40,54546 +ecmul_0_0_0_21000_128,54546 +ecmul_0_0_0_28000_64,54546 +ecmul_0_0_0_28000_128,54546 +ecmul_0_0_0_28000_80,54546 +ecmul_0_0_2_28000_128,54546 +ecmul_0_0_2_21000_128,54546 +ecmul_0_0_1_28000_128,54546 +ecmul_0_0_0_28000_96,54546 +ecmul_0_0_2_21000_96,54546 +ecmul_0_0_1_21000_128,54546 +ecmul_0_0_1_21000_96,54546 +ecmul_0_0_1_28000_96,54546 +ecmul_0_0_2_28000_96,54546 +ecmul_0_0_340282366920938463463374607431768211456_21000_128,54546 +ecmul_0_0_340282366920938463463374607431768211456_21000_96,54546 +ecmul_0_0_340282366920938463463374607431768211456_28000_128,54546 +ecmul_0_0_340282366920938463463374607431768211456_28000_80,54546 +ecmul_0_0_5616_21000_96,54546 +ecmul_0_0_5616_28000_128,54546 +ecmul_0_0_340282366920938463463374607431768211456_21000_80,54546 +ecmul_0_0_5617_21000_128,54546 +ecmul_0_0_5617_21000_96,54546 +ecmul_0_0_5616_21000_128,54546 +ecmul_0_0_340282366920938463463374607431768211456_28000_96,54546 +ecmul_0_0_5617_28000_96,54546 +ecmul_0_0_5616_28000_96,54546 +ecmul_0_0_9935_21000_128,54546 +ecmul_0_0_9935_28000_128,54546 +ecmul_0_0_5617_28000_128,54546 +ecmul_0_0_9935_21000_96,54546 +ecmul_0_0_9_21000_128,54546 +ecmul_0_0_9_28000_128,54546 +ecmul_0_0_9_21000_96,54546 +ecmul_0_0_9935_28000_96,54546 +ecmul_0_0_9_28000_96,54546 +ecmul_1_2_0_21000_128,54996 +ecmul_1_2_0_21000_64,54996 +ecmul_1_2_0_21000_80,54996 +ecmul_1_2_0_21000_96,54996 +ecmul_1_2_0_28000_64,54996 +ecmul_1_2_0_28000_96,54996 +ecmul_1_2_1_21000_128,55008 +ecmul_1_2_1_21000_96,55008 +ecmul_1_2_1_28000_128,55008 +ecmul_1_2_0_28000_128,54996 +ecmul_1_2_1_28000_96,55008 +ecmul_1_2_0_28000_80,54996 +ecmul_1_2_2_21000_128,93108 +ecmul_1_2_2_21000_96,93108 +ecmul_1_2_2_28000_128,93108 +ecmul_1_2_2_28000_96,93108 +ecmul_1_2_340282366920938463463374607431768211456_21000_128,239382 +ecmul_1_2_340282366920938463463374607431768211456_21000_80,239382 +ecmul_1_2_340282366920938463463374607431768211456_21000_96,239382 +ecmul_1_2_340282366920938463463374607431768211456_28000_128,239382 +ecmul_1_2_5616_21000_128,527424 +ecmul_1_2_340282366920938463463374607431768211456_28000_80,239382 +ecmul_1_2_5616_21000_96,527424 +ecmul_1_2_5616_28000_128,527424 +ecmul_1_2_5617_21000_128,493410 +ecmul_1_2_5617_21000_96,493410 +ecmul_1_2_340282366920938463463374607431768211456_28000_96,239382 +ecmul_1_2_5617_28000_128,493410 +ecmul_1_2_9935_21000_128,753546 +ecmul_1_2_5617_28000_96,493410 +ecmul_1_2_616_28000_96,527424 +ecmul_1_2_9935_28000_96,753546 +ecmul_1_2_9935_21000_96,753546 +ecmul_1_2_9935_28000_128,753546 +ecmul_1_2_9_21000_128,96390 +ecmul_1_2_9_21000_96,96390 +ecmul_1_2_9_28000_128,96390 +ecmul_1_2_9_28000_96,96390 +ecmul_7827_6598_0_21000_128,54996 +ecmul_7827_6598_0_21000_80,54996 +ecmul_7827_6598_0_21000_96,54996 +ecmul_7827_6598_0_28000_128,54996 +ecmul_7827_6598_0_21000_64,54996 +ecmul_7827_6598_0_28000_64,54996 +ecmul_7827_6598_0_28000_80,54996 +ecmul_7827_6598_0_28000_96,54996 +ecmul_7827_6598_1456_21000_128,239340 +ecmul_7827_6598_1456_28000_96,239340 +ecmul_7827_6598_1456_21000_80,239340 +ecmul_7827_6598_1456_21000_96,239340 +ecmul_7827_6598_1456_28000_80,239340 +ecmul_7827_6598_1456_28000_128,239340 +ecmul_7827_6598_1_21000_128,55008 +ecmul_7827_6598_1_21000_96,55008 +ecmul_7827_6598_1_28000_128,55008 +ecmul_7827_6598_1_28000_96,55008 +ecmul_7827_6598_2_21000_128,90840 +ecmul_7827_6598_2_21000_96,90840 +ecmul_7827_6598_2_28000_128,90840 +ecmul_7827_6598_2_28000_96,90840 +ecmul_7827_6598_5616_21000_128,526626 +ecmul_7827_6598_5616_28000_128,526626 +ecmul_7827_6598_5616_21000_96,526626 +ecmul_7827_6598_5617_28000_128,493410 +ecmul_7827_6598_5616_28000_96,526626 +ecmul_7827_6598_5617_21000_128,493410 +ecmul_7827_6598_5617_21000_96,493410 +ecmul_7827_6598_9935_28000_128,754734 +ecmul_7827_6598_5617_28000_96,493410 +ecmul_7827_6598_9935_21000_128,754734 +ecmul_7827_6598_9935_21000_96,754734 +ecmul_7827_6598_9_28000_128,96822 +ecmul_7827_6598_9935_28000_96,754734 +ecmul_7827_6598_9_21000_96,96822 +ecmul_7827_6598_9_28000_96,96822 +ecmul_7827_6598_9_21000_128,96822 diff --git a/tests/gas_reports_3/ecpairing_report.csv b/tests/gas_reports_3/ecpairing_report.csv new file mode 100644 index 00000000..d8cf4a68 --- /dev/null +++ b/tests/gas_reports_3/ecpairing_report.csv @@ -0,0 +1,18 @@ +test, gas +ecpairing_one_point_fail,6675152 +ecpairing_one_point_insufficient_gas,6675152 +ecpairing_empty_data_insufficient_gas,71566 +ecpairing_one_point_with_g1_zero,1559074 +ecpairing_empty_data,71566 +ecpairing_one_point_with_g2_zero,72880 +ecpairing_three_point_fail_1,19880182 +ecpairing_two_point_match_2,13278732 +ecpairing_two_point_fail_2,13277832 +ecpairing_two_point_fail_1,13278594 +ecpairing_three_point_match_1,13277910 +ecpairing_two_point_match_1,13278732 +ecpairing_two_points_with_one_g2_zero,6676184 +ecpairing_two_point_match_3,13277166 +ecpairing_two_point_match_4,13276878 +ecpairing_two_point_match_5,1560106 +ecpairing_two_point_oog,13278732 diff --git a/tests/gas_reports_3/modexp_report.csv b/tests/gas_reports_3/modexp_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports_3/modexp_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports_3/p256verify_report.csv b/tests/gas_reports_3/p256verify_report.csv new file mode 100644 index 00000000..60159140 --- /dev/null +++ b/tests/gas_reports_3/p256verify_report.csv @@ -0,0 +1,4 @@ +test, gas +p256verify_valid_signature_one,1668249 +p256verify_invalid_signature,1652901 +p256verify_valid_signature_two,1659075 diff --git a/tests/gas_reports_3/secp256k1verify_report.csv b/tests/gas_reports_3/secp256k1verify_report.csv new file mode 100644 index 00000000..c8a13c3a --- /dev/null +++ b/tests/gas_reports_3/secp256k1verify_report.csv @@ -0,0 +1,4 @@ +test, gas +secp256k1verify_valid_signature_one,1527275 +secp256k1verify_invalid_signature,1548449 +secp256k1verify_valid_signature_two,1550975 diff --git a/tests/gas_reports_s/ecadd_report.csv b/tests/gas_reports_s/ecadd_report.csv new file mode 100644 index 00000000..0eb5496e --- /dev/null +++ b/tests/gas_reports_s/ecadd_report.csv @@ -0,0 +1,29 @@ +test, gas +ecadd_0_0_0_0_25000_192,53991 +ecadd_0_0_0_0_21000_192,53991 +ecadd_0_0_0_0_25000_128,53991 +ecadd_0_0_0_0_21000_80,53991 +ecadd_0_0_0_0_21000_0,53973 +ecadd_0_0_0_0_21000_128,53991 +ecadd_0_0_0_0_25000_0,53973 +ecadd_0_0_0_0_21000_64,53991 +ecadd_0_0_1_2_21000_128,54465 +ecadd_0_0_1_2_25000_128,54465 +ecadd_0_0_1_2_25000_192,54465 +ecadd_0_0_0_0_25000_64,53991 +ecadd_0_0_0_0_25000_80,53991 +ecadd_0_0_1_2_21000_192,54465 +ecadd_1145_3932_2969_1336_25000_128,90285 +ecadd_1_2_0_0_21000_128,54507 +ecadd_1145_3932_1145_4651_21000_192,54573 +ecadd_1145_3932_1145_4651_25000_192,54573 +ecadd_1145_3932_2969_1336_21000_128,90285 +ecadd_1_2_0_0_21000_192,54507 +ecadd_1_2_0_0_21000_64,54507 +ecadd_1_2_0_0_25000_64,54507 +ecadd_1_2_1_2_21000_128,92469 +ecadd_1_2_1_2_25000_128,92469 +ecadd_1_2_1_2_25000_192,92469 +ecadd_1_2_0_0_25000_192,54507 +ecadd_1_2_0_0_25000_128,54507 +ecadd_1_2_1_2_21000_192,92469 diff --git a/tests/gas_reports_s/ecmul_report.csv b/tests/gas_reports_s/ecmul_report.csv new file mode 100644 index 00000000..916d8ad6 --- /dev/null +++ b/tests/gas_reports_s/ecmul_report.csv @@ -0,0 +1,119 @@ +test, gas +ecmul_0_0_0_21000_40,54066 +ecmul_0_0_0_21000_64,54066 +ecmul_0_0_0_28000_128,54066 +ecmul_0_0_0_28000_0,54048 +ecmul_0_0_0_21000_80,54066 +ecmul_0_0_0_21000_0,54048 +ecmul_0_0_0_21000_96,54066 +ecmul_0_0_0_28000_64,54066 +ecmul_0_0_0_28000_80,54066 +ecmul_0_0_0_21000_128,54066 +ecmul_0_0_0_28000_96,54066 +ecmul_0_0_1_21000_96,54066 +ecmul_0_0_1_28000_96,54066 +ecmul_0_0_0_28000_40,54066 +ecmul_0_0_2_21000_128,54066 +ecmul_0_0_2_28000_128,54066 +ecmul_0_0_1_21000_128,54066 +ecmul_0_0_2_28000_96,54066 +ecmul_0_0_1_28000_128,54066 +ecmul_0_0_340282366920938463463374607431768211456_21000_128,54066 +ecmul_0_0_2_21000_96,54066 +ecmul_0_0_340282366920938463463374607431768211456_21000_80,54066 +ecmul_0_0_340282366920938463463374607431768211456_28000_80,54066 +ecmul_0_0_340282366920938463463374607431768211456_28000_96,54066 +ecmul_0_0_5616_21000_128,54066 +ecmul_0_0_5616_21000_96,54066 +ecmul_0_0_340282366920938463463374607431768211456_21000_96,54066 +ecmul_0_0_5616_28000_96,54066 +ecmul_0_0_5617_21000_96,54066 +ecmul_0_0_340282366920938463463374607431768211456_28000_128,54066 +ecmul_0_0_5617_28000_96,54066 +ecmul_0_0_5616_28000_128,54066 +ecmul_0_0_9935_21000_96,54066 +ecmul_0_0_5617_28000_128,54066 +ecmul_0_0_9935_21000_128,54066 +ecmul_0_0_5617_21000_128,54066 +ecmul_0_0_9935_28000_128,54066 +ecmul_0_0_9_21000_128,54066 +ecmul_0_0_9_28000_128,54066 +ecmul_0_0_9935_28000_96,54066 +ecmul_0_0_9_28000_96,54066 +ecmul_0_0_9_21000_96,54066 +ecmul_1_2_0_21000_128,54534 +ecmul_1_2_0_21000_64,54534 +ecmul_1_2_0_21000_80,54534 +ecmul_1_2_0_21000_96,54534 +ecmul_1_2_0_28000_128,54534 +ecmul_1_2_0_28000_64,54534 +ecmul_1_2_0_28000_80,54534 +ecmul_1_2_0_28000_96,54534 +ecmul_1_2_1_21000_96,54546 +ecmul_1_2_1_28000_96,54546 +ecmul_1_2_2_21000_128,92658 +ecmul_1_2_2_21000_96,92658 +ecmul_1_2_2_28000_128,92658 +ecmul_1_2_2_28000_96,92658 +ecmul_1_2_340282366920938463463374607431768211456_21000_80,230568 +ecmul_1_2_340282366920938463463374607431768211456_21000_128,230568 +ecmul_1_2_1_28000_128,54546 +ecmul_1_2_1_21000_128,54546 +ecmul_1_2_340282366920938463463374607431768211456_28000_128,230568 +ecmul_1_2_340282366920938463463374607431768211456_28000_80,230568 +ecmul_1_2_5616_21000_128,509172 +ecmul_1_2_5617_21000_96,475146 +ecmul_1_2_340282366920938463463374607431768211456_21000_96,230568 +ecmul_1_2_5616_28000_128,509172 +ecmul_1_2_5616_21000_96,509172 +ecmul_1_2_5617_21000_128,475146 +ecmul_1_2_5617_28000_96,475146 +ecmul_1_2_340282366920938463463374607431768211456_28000_96,230568 +ecmul_1_2_5617_28000_128,475146 +ecmul_1_2_9935_21000_96,733290 +ecmul_1_2_616_28000_96,509172 +ecmul_1_2_9935_21000_128,733290 +ecmul_1_2_9_21000_96,95814 +ecmul_1_2_9935_28000_128,733290 +ecmul_1_2_9935_28000_96,733290 +ecmul_1_2_9_21000_128,95814 +ecmul_1_2_9_28000_128,95814 +ecmul_1_2_9_28000_96,95814 +ecmul_7827_6598_0_21000_128,54534 +ecmul_7827_6598_0_28000_80,54534 +ecmul_7827_6598_0_21000_64,54534 +ecmul_7827_6598_0_21000_80,54534 +ecmul_7827_6598_0_21000_96,54534 +ecmul_7827_6598_0_28000_128,54534 +ecmul_7827_6598_0_28000_64,54534 +ecmul_7827_6598_0_28000_96,54534 +ecmul_7827_6598_1456_21000_128,230526 +ecmul_7827_6598_1_21000_128,54546 +ecmul_7827_6598_1456_21000_96,230526 +ecmul_7827_6598_1456_28000_128,230526 +ecmul_7827_6598_1456_21000_80,230526 +ecmul_7827_6598_1456_28000_96,230526 +ecmul_7827_6598_1_21000_96,54546 +ecmul_7827_6598_1456_28000_80,230526 +ecmul_7827_6598_1_28000_128,54546 +ecmul_7827_6598_1_28000_96,54546 +ecmul_7827_6598_2_21000_128,90390 +ecmul_7827_6598_2_21000_96,90390 +ecmul_7827_6598_2_28000_128,90390 +ecmul_7827_6598_2_28000_96,90390 +ecmul_7827_6598_5616_21000_128,508374 +ecmul_7827_6598_5616_21000_96,508374 +ecmul_7827_6598_5616_28000_128,508374 +ecmul_7827_6598_5617_28000_96,475146 +ecmul_7827_6598_5617_21000_128,475146 +ecmul_7827_6598_5617_21000_96,475146 +ecmul_7827_6598_9935_21000_96,734478 +ecmul_7827_6598_5616_28000_96,508374 +ecmul_7827_6598_9935_21000_128,734478 +ecmul_7827_6598_9_21000_128,96246 +ecmul_7827_6598_5617_28000_128,475146 +ecmul_7827_6598_9935_28000_128,734478 +ecmul_7827_6598_9935_28000_96,734478 +ecmul_7827_6598_9_21000_96,96246 +ecmul_7827_6598_9_28000_128,96246 +ecmul_7827_6598_9_28000_96,96246 diff --git a/tests/gas_reports_s/ecpairing_report.csv b/tests/gas_reports_s/ecpairing_report.csv new file mode 100644 index 00000000..ddee1ce7 --- /dev/null +++ b/tests/gas_reports_s/ecpairing_report.csv @@ -0,0 +1,18 @@ +test, gas +ecpairing_one_point_with_g1_zero,1553506 +ecpairing_empty_data_insufficient_gas,65998 +ecpairing_empty_data,65998 +ecpairing_one_point_insufficient_gas,6448214 +ecpairing_one_point_fail,6448214 +ecpairing_one_point_with_g2_zero,67312 +ecpairing_three_point_fail_1,19210504 +ecpairing_three_point_match_1,12829602 +ecpairing_two_point_match_3,12828858 +ecpairing_two_point_match_1,12830424 +ecpairing_two_point_match_2,12830424 +ecpairing_two_point_fail_1,12830286 +ecpairing_two_point_fail_2,12829524 +ecpairing_two_point_oog,12830424 +ecpairing_two_point_match_4,12828570 +ecpairing_two_points_with_one_g2_zero,6449246 +ecpairing_two_point_match_5,1554538 diff --git a/tests/gas_reports_s/modexp_report.csv b/tests/gas_reports_s/modexp_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports_s/modexp_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports_s/p256verify_report.csv b/tests/gas_reports_s/p256verify_report.csv new file mode 100644 index 00000000..da623924 --- /dev/null +++ b/tests/gas_reports_s/p256verify_report.csv @@ -0,0 +1,4 @@ +test, gas +p256verify_valid_signature_one,1686795 +p256verify_invalid_signature,1677813 +p256verify_valid_signature_two,1684743 diff --git a/tests/gas_reports_s/secp256k1verify_report.csv b/tests/gas_reports_s/secp256k1verify_report.csv new file mode 100644 index 00000000..b8814773 --- /dev/null +++ b/tests/gas_reports_s/secp256k1verify_report.csv @@ -0,0 +1,4 @@ +test, gas +secp256k1verify_invalid_signature,1574797 +secp256k1verify_valid_signature_one,1552423 +secp256k1verify_valid_signature_two,1575355 diff --git a/tests/gas_reports_z/ecadd_report.csv b/tests/gas_reports_z/ecadd_report.csv new file mode 100644 index 00000000..06ef1121 --- /dev/null +++ b/tests/gas_reports_z/ecadd_report.csv @@ -0,0 +1,29 @@ +test, gas +ecadd_0_0_0_0_25000_192,53755 +ecadd_0_0_0_0_21000_192,53755 +ecadd_0_0_0_0_21000_128,53755 +ecadd_0_0_0_0_25000_128,53755 +ecadd_0_0_0_0_21000_0,53737 +ecadd_0_0_0_0_21000_80,53755 +ecadd_0_0_0_0_21000_64,53755 +ecadd_0_0_0_0_25000_0,53737 +ecadd_0_0_0_0_25000_64,53755 +ecadd_0_0_1_2_21000_192,54547 +ecadd_0_0_1_2_21000_128,54547 +ecadd_0_0_1_2_25000_128,54547 +ecadd_0_0_1_2_25000_192,54547 +ecadd_0_0_0_0_25000_80,53755 +ecadd_1145_3932_1145_4651_25000_192,54805 +ecadd_1145_3932_2969_1336_25000_128,90133 +ecadd_1145_3932_1145_4651_21000_192,54805 +ecadd_1_2_0_0_21000_128,54589 +ecadd_1_2_0_0_21000_192,54589 +ecadd_1_2_0_0_21000_64,54589 +ecadd_1145_3932_2969_1336_21000_128,90133 +ecadd_1_2_0_0_25000_128,54589 +ecadd_1_2_0_0_25000_192,54589 +ecadd_1_2_1_2_25000_192,91969 +ecadd_1_2_1_2_25000_128,91969 +ecadd_1_2_0_0_25000_64,54589 +ecadd_1_2_1_2_21000_128,91969 +ecadd_1_2_1_2_21000_192,91969 diff --git a/tests/gas_reports_z/ecmul_report.csv b/tests/gas_reports_z/ecmul_report.csv new file mode 100644 index 00000000..ac10bf9d --- /dev/null +++ b/tests/gas_reports_z/ecmul_report.csv @@ -0,0 +1,119 @@ +test, gas +ecmul_0_0_0_28000_0,53822 +ecmul_0_0_0_21000_96,53840 +ecmul_0_0_0_21000_64,53840 +ecmul_0_0_0_21000_80,53840 +ecmul_0_0_0_21000_40,53840 +ecmul_0_0_0_28000_40,53840 +ecmul_0_0_0_21000_0,53822 +ecmul_0_0_0_21000_128,53840 +ecmul_0_0_0_28000_128,53840 +ecmul_0_0_0_28000_80,53840 +ecmul_0_0_0_28000_96,53840 +ecmul_0_0_1_21000_128,53840 +ecmul_0_0_1_21000_96,53840 +ecmul_0_0_1_28000_96,53840 +ecmul_0_0_1_28000_128,53840 +ecmul_0_0_2_21000_96,53840 +ecmul_0_0_2_28000_128,53840 +ecmul_0_0_0_28000_64,53840 +ecmul_0_0_2_28000_96,53840 +ecmul_0_0_2_21000_128,53840 +ecmul_0_0_340282366920938463463374607431768211456_21000_128,53840 +ecmul_0_0_340282366920938463463374607431768211456_28000_128,53840 +ecmul_0_0_340282366920938463463374607431768211456_21000_96,53840 +ecmul_0_0_340282366920938463463374607431768211456_21000_80,53840 +ecmul_0_0_5616_28000_96,53840 +ecmul_0_0_5616_28000_128,53840 +ecmul_0_0_5616_21000_96,53840 +ecmul_0_0_5617_21000_128,53840 +ecmul_0_0_340282366920938463463374607431768211456_28000_96,53840 +ecmul_0_0_340282366920938463463374607431768211456_28000_80,53840 +ecmul_0_0_5616_21000_128,53840 +ecmul_0_0_5617_28000_96,53840 +ecmul_0_0_5617_28000_128,53840 +ecmul_0_0_9935_21000_96,53840 +ecmul_0_0_9935_28000_96,53840 +ecmul_0_0_9935_28000_128,53840 +ecmul_0_0_9_21000_128,53840 +ecmul_0_0_9_21000_96,53840 +ecmul_0_0_5617_21000_96,53840 +ecmul_0_0_9_28000_128,53840 +ecmul_0_0_9935_21000_128,53840 +ecmul_0_0_9_28000_96,53840 +ecmul_1_2_0_21000_128,54524 +ecmul_1_2_0_21000_64,54524 +ecmul_1_2_0_21000_80,54524 +ecmul_1_2_0_21000_96,54524 +ecmul_1_2_0_28000_128,54524 +ecmul_1_2_0_28000_64,54524 +ecmul_1_2_0_28000_80,54524 +ecmul_1_2_0_28000_96,54524 +ecmul_1_2_1_21000_128,54554 +ecmul_1_2_1_21000_96,54554 +ecmul_1_2_1_28000_128,54554 +ecmul_1_2_2_21000_128,92624 +ecmul_1_2_2_28000_96,92624 +ecmul_1_2_2_28000_128,92624 +ecmul_1_2_340282366920938463463374607431768211456_21000_128,288992 +ecmul_1_2_340282366920938463463374607431768211456_21000_80,288992 +ecmul_1_2_2_21000_96,92624 +ecmul_1_2_340282366920938463463374607431768211456_21000_96,288992 +ecmul_1_2_1_28000_96,54554 +ecmul_1_2_340282366920938463463374607431768211456_28000_128,288992 +ecmul_1_2_340282366920938463463374607431768211456_28000_96,288992 +ecmul_1_2_5616_21000_128,705974 +ecmul_1_2_5616_21000_96,705974 +ecmul_1_2_5617_28000_128,673196 +ecmul_1_2_5617_21000_128,673196 +ecmul_1_2_5616_28000_128,705974 +ecmul_1_2_340282366920938463463374607431768211456_28000_80,288992 +ecmul_1_2_5617_21000_96,673196 +ecmul_1_2_9935_21000_96,1059242 +ecmul_1_2_616_28000_96,705974 +ecmul_1_2_9935_21000_128,1059242 +ecmul_1_2_5617_28000_96,673196 +ecmul_1_2_9_28000_128,98042 +ecmul_1_2_9935_28000_128,1059242 +ecmul_1_2_9935_28000_96,1059242 +ecmul_1_2_9_21000_96,98042 +ecmul_1_2_9_21000_128,98042 +ecmul_1_2_9_28000_96,98042 +ecmul_7827_6598_0_21000_128,54524 +ecmul_7827_6598_0_21000_64,54524 +ecmul_7827_6598_0_21000_80,54524 +ecmul_7827_6598_0_28000_80,54524 +ecmul_7827_6598_0_28000_128,54524 +ecmul_7827_6598_0_21000_96,54524 +ecmul_7827_6598_0_28000_64,54524 +ecmul_7827_6598_0_28000_96,54524 +ecmul_7827_6598_1456_28000_80,289004 +ecmul_7827_6598_1456_21000_80,289004 +ecmul_7827_6598_1456_28000_96,289004 +ecmul_7827_6598_1456_21000_96,289004 +ecmul_7827_6598_1456_28000_128,289004 +ecmul_7827_6598_1456_21000_128,289004 +ecmul_7827_6598_1_28000_128,54554 +ecmul_7827_6598_1_28000_96,54554 +ecmul_7827_6598_1_21000_128,54554 +ecmul_7827_6598_2_21000_128,90512 +ecmul_7827_6598_2_21000_96,90512 +ecmul_7827_6598_2_28000_128,90512 +ecmul_7827_6598_1_21000_96,54554 +ecmul_7827_6598_2_28000_96,90512 +ecmul_7827_6598_5616_21000_128,705206 +ecmul_7827_6598_5617_21000_128,673196 +ecmul_7827_6598_5616_28000_128,705206 +ecmul_7827_6598_5616_21000_96,705206 +ecmul_7827_6598_5616_28000_96,705206 +ecmul_7827_6598_9935_21000_128,1060454 +ecmul_7827_6598_5617_21000_96,673196 +ecmul_7827_6598_5617_28000_128,673196 +ecmul_7827_6598_5617_28000_96,673196 +ecmul_7827_6598_9_21000_128,98462 +ecmul_7827_6598_9935_21000_96,1060454 +ecmul_7827_6598_9935_28000_128,1060454 +ecmul_7827_6598_9935_28000_96,1060454 +ecmul_7827_6598_9_21000_96,98462 +ecmul_7827_6598_9_28000_128,98462 +ecmul_7827_6598_9_28000_96,98462 diff --git a/tests/gas_reports_z/ecpairing_report.csv b/tests/gas_reports_z/ecpairing_report.csv new file mode 100644 index 00000000..ce2d79bd --- /dev/null +++ b/tests/gas_reports_z/ecpairing_report.csv @@ -0,0 +1,18 @@ +test, gas +ecpairing_one_point_insufficient_gas,9715269 +ecpairing_empty_data_insufficient_gas,58474 +ecpairing_empty_data,58474 +ecpairing_one_point_with_g1_zero,2742166 +ecpairing_one_point_fail,9715269 +ecpairing_one_point_with_g2_zero,60040 +ecpairing_three_point_match_1,19371482 +ecpairing_two_point_match_4,19370210 +ecpairing_three_point_fail_1,29026711 +ecpairing_two_point_fail_1,19371908 +ecpairing_two_point_match_2,19372046 +ecpairing_two_point_match_1,19372046 +ecpairing_two_point_match_3,19370402 +ecpairing_two_point_fail_2,19371080 +ecpairing_two_point_match_5,2743438 +ecpairing_two_point_oog,19372046 +ecpairing_two_points_with_one_g2_zero,9716541 diff --git a/tests/gas_reports_z/modexp_report.csv b/tests/gas_reports_z/modexp_report.csv new file mode 100644 index 00000000..bcf23489 --- /dev/null +++ b/tests/gas_reports_z/modexp_report.csv @@ -0,0 +1 @@ +test, gas diff --git a/tests/gas_reports_z/p256verify_report.csv b/tests/gas_reports_z/p256verify_report.csv new file mode 100644 index 00000000..4515867a --- /dev/null +++ b/tests/gas_reports_z/p256verify_report.csv @@ -0,0 +1,4 @@ +test, gas +p256verify_valid_signature_one,2070647 +p256verify_invalid_signature,2058851 +p256verify_valid_signature_two,2067593 diff --git a/tests/gas_reports_z/secp256k1verify_report.csv b/tests/gas_reports_z/secp256k1verify_report.csv new file mode 100644 index 00000000..f447fceb --- /dev/null +++ b/tests/gas_reports_z/secp256k1verify_report.csv @@ -0,0 +1,4 @@ +test, gas +secp256k1verify_invalid_signature,1912217 +secp256k1verify_valid_signature_one,1884365 +secp256k1verify_valid_signature_two,1912721 diff --git a/tests/tests/ecpairing_tests.rs b/tests/tests/ecpairing_tests.rs index a51ebbf1..6565bcb2 100644 --- a/tests/tests/ecpairing_tests.rs +++ b/tests/tests/ecpairing_tests.rs @@ -1,7 +1,7 @@ use zksync_web3_rs::{types::Bytes, zks_utils::ECPAIRING_PRECOMPILE_ADDRESS}; mod test_utils; -use test_utils::{era_call, eth_call, parse_call_result}; +use test_utils::{era_call, eth_call, parse_call_result, write_ecpairing_gas_result}; // Puts the given data into the ECPAIRING precompile #[tokio::test] @@ -20,7 +20,8 @@ async fn ecpairing_empty_data_insufficient_gas() { ) .await .unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -53,7 +54,8 @@ async fn ecpairing_perturb_zeropoint_by_one() { async fn ecpairing_one_point_with_g1_zero() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -79,7 +81,8 @@ async fn ecpairing_one_point_with_g2_zero_and_g1_invalid() { async fn ecpairing_two_point_match_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -91,7 +94,8 @@ async fn ecpairing_two_point_match_1() { async fn ecpairing_two_point_fail_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -103,7 +107,8 @@ async fn ecpairing_two_point_fail_1() { async fn ecpairing_two_point_oog() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa000000000000000000000000000000000000000000000000000000000000000130644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -115,7 +120,8 @@ async fn ecpairing_two_point_oog() { async fn ecpairing_three_point_fail_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f00cacf3523caf879d7d05e30549f1e6fdce364cbb8724b0329c6c2a39d4f018e0692e55db067300e6e3fe56218fa2f940054e57e7ef92bf7d475a9d8a8502fd200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f00cacf3523caf879d7d05e30549f1e6fdce364cbb8724b0329c6c2a39d4f018e0692e55db067300e6e3fe56218fa2f940054e57e7ef92bf7d475a9d8a8502fd200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -127,7 +133,8 @@ async fn ecpairing_three_point_fail_1() { async fn ecpairing_one_point_insufficient_gas() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -151,7 +158,8 @@ async fn ecpairing_empty_data() { ) .await .unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -163,7 +171,8 @@ async fn ecpairing_empty_data() { async fn ecpairing_two_point_match_4() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -182,7 +191,8 @@ async fn ecpairing_perturb_g2_by_one() { async fn ecpairing_three_point_match_1() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd030427000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000021a2c3013d2ea92e13c800cde68ef56a294b883f6ac35d25f587c09b1b3c635f7290158a80cd3d66530f74dc94c94adb88f5cdb481acca997b6e60071f08a115f2f997f3dbd66a7afe07fe7862ce239edba9e05c5afff7f8a1259c9733b2dfbb929d1691530ca701b4a106054688728c9972c8512e9789e9567aae23e302ccd75000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -194,7 +204,8 @@ async fn ecpairing_three_point_match_1() { async fn ecpairing_two_point_match_5() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -206,7 +217,8 @@ async fn ecpairing_two_point_match_5() { async fn ecpairing_two_point_match_2() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -218,7 +230,8 @@ async fn ecpairing_two_point_match_2() { async fn ecpairing_two_point_fail_2() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd03042700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002105384b6dd6c48634b9fe89cb3e19667c1fe6736c69df070d674c95a42b3b8242c0d8e67f0f2c14c43734b430d8be4265af8c4f7a67deb0b029fd2dff99cc6b9015eaec465d922580c7de5d4a5c26de75eaf2af6841b7412ef2eebd1e051076f1b4c21849e48de12d1bae2bad3299717aa8664ade430e19dec72a6e10a39b0ab").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("105456a333e6d636854f987ea7bb713dfd0ae8371a72aea313ae0c32c0bf10160cf031d41b41557f3e7e3ba0c51bebe5da8e6ecd855ec50fc87efcdeac168bcc0476be093a6d2b4bbf907172049874af11e1b6267606e00804d3ff0037ec57fd3010c68cb50161b7d1d96bb71edfec9880171954e56871abf3d93cc94d745fa114c059d74e5b6c4ec14ae5864ebe23a71781d86c29fb8fb6cce94f70d3de7a2101b33461f39d9e887dbb100f170a2345dde3c07e256d1dfa2b657ba5cd03042700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002105384b6dd6c48634b9fe89cb3e19667c1fe6736c69df070d674c95a42b3b8242c0d8e67f0f2c14c43734b430d8be4265af8c4f7a67deb0b029fd2dff99cc6b9015eaec465d922580c7de5d4a5c26de75eaf2af6841b7412ef2eebd1e051076f1b4c21849e48de12d1bae2bad3299717aa8664ade430e19dec72a6e10a39b0ab").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -230,7 +243,8 @@ async fn ecpairing_two_point_fail_2() { async fn ecpairing_two_points_with_one_g2_zero() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -263,7 +277,8 @@ async fn ecpairing_perturb_zeropoint_by_curve_order() { async fn ecpairing_one_point_with_g2_zero() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -289,7 +304,8 @@ async fn ecpairing_bad_length_193() { async fn ecpairing_two_point_match_3() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002203e205db4f19b37b60121b83a7333706db86431c6d835849957ed8c3928ad7927dc7234fd11d3e8c36c59277c3e6f149d5cd3cfa9a62aee49f8130962b4b3b9195e8aa5b7827463722b8c153931579d3505566b4edf48d498e185f0509de15204bb53b8977e5f92a0bc372742c4830944a59b4fe6b1c0466e2a6dad122b5d2e030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd31a76dae6d3272396d0cbe61fced2bc532edac647851e3ac53ce1cc9c7e645a83198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" @@ -301,7 +317,8 @@ async fn ecpairing_two_point_match_3() { async fn ecpairing_one_point_fail() { let eth_response = eth_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); let era_response = era_call(ECPAIRING_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa").unwrap()))).await.unwrap(); - let (era_output, _) = parse_call_result(&era_response); + let (era_output, gas_used) = parse_call_result(&era_response); + write_ecpairing_gas_result(gas_used); assert_eq!( eth_response, era_output, "Puts the given data into the ECPAIRING precompile" diff --git a/tests/tests/modexp_tests.rs b/tests/tests/modexp_tests.rs index 68e4ef73..2e3c6a31 100644 --- a/tests/tests/modexp_tests.rs +++ b/tests/tests/modexp_tests.rs @@ -1,1504 +1,1504 @@ -use zksync_web3_rs::{types::Bytes, zks_utils::MODEXP_PRECOMPILE_ADDRESS}; - -#[cfg(test)] -mod test_utils; -use test_utils::{era_call, eth_call}; - -use crate::test_utils::{parse_call_result, write_modexp_gas_result}; - -#[tokio::test] -async fn modexp_0() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_1() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_2() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_3() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_4() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_5() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_6() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020038000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020038000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_7() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000080").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000080").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_8() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_9() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000101").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000101").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_10() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000304").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000304").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_11() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020004").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020004").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_12() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020300").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020300").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_13() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010304").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010304").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_14() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_15() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000203").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000203").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_16() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030006").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030006").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_17() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020306").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020306").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_18() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002020300").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002020300").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_19() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_20() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020203").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020203").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_21() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002023003").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002023003").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_22() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020230").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020230").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_23() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_24() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_25() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001001001010010").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001001001010010").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_26() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000064").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_27() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030006").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030006").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. -#[tokio::test] -async fn modexp_28() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(&[])) -} - -#[tokio::test] -async fn modexp_29() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_30() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_31() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010035ee4e488f45e64d2f07becd54646357381d32f30b74c299a8c25d5202c04938ef6c4764a04f10fc908b78c4486886000f6d290251a79681a83b950c7e5c37351").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010035ee4e488f45e64d2f07becd54646357381d32f30b74c299a8c25d5202c04938ef6c4764a04f10fc908b78c4486886000f6d290251a79681a83b950c7e5c37351").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_32() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000cd935b43e42204fcbfb734a6e27735e8e90204fcc1fd2727bb040f9eecb").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000cd935b43e42204fcbfb734a6e27735e8e90204fcc1fd2727bb040f9eecb").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_33() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060846813a8d2d451387340fa0597c6545ae63").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060846813a8d2d451387340fa0597c6545ae63").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_34() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d02534f82b1013f20d9c7d18d62cd95674d2e013f20d9c7d18d62cd95674d2f").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d02534f82b1013f20d9c7d18d62cd95674d2e013f20d9c7d18d62cd95674d2f").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_35() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120785e45de3d6be050ba3c4d33ff0bb2d010ace3b1dfe9c49f4c7a8075102fa19a86c010ace3b1dfe9c49f4c7a8075102fa19a86d").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120785e45de3d6be050ba3c4d33ff0bb2d010ace3b1dfe9c49f4c7a8075102fa19a86c010ace3b1dfe9c49f4c7a8075102fa19a86d").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. -#[tokio::test] -async fn modexp_36() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000ff2a1e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000ff2a1e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(&[])); -} - -#[tokio::test] -async fn modexp_37() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010001").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010001").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_0() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_1() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_2() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_3() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_4() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_5() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_6() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_7() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_8() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_9() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_10() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1_048_578. -#[tokio::test] -async fn modexp_tests_11() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); -} - -#[tokio::test] -async fn modexp_tests_12() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_13() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_14() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_15() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_16() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_17() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_18() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_19() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_20() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_21() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_22() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_23() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_24() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_25() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_26() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_27() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. -#[tokio::test] -async fn modexp_tests_28() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); -} - -#[tokio::test] -async fn modexp_tests_29() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_30() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_31() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_32() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_33() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_34() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_35() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_36() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_37() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_38() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_39() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_40() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_41() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_42() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_43() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_44() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_45() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. -#[tokio::test] -async fn modexp_tests_46() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); -} - -#[tokio::test] -async fn modexp_tests_47() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_48() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_49() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_50() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_51() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_52() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_53() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_54() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 16. -#[tokio::test] -async fn modexp_tests_55() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 16])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 32. -#[tokio::test] -async fn modexp_tests_56() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 32])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 64. -#[tokio::test] -async fn modexp_tests_57() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 64])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 100. -#[tokio::test] -async fn modexp_tests_58() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 100])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 128. -#[tokio::test] -async fn modexp_tests_59() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 128])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 4.097. -#[tokio::test] -async fn modexp_tests_60() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 4_097])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 -#[tokio::test] -async fn modexp_tests_61() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); -} - -#[tokio::test] -async fn modexp_tests_62() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_63() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_64() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_65() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_66() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_67() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_68() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_69() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_70() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_71() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_72() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_73() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_74() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_75() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_76() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_77() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. -#[tokio::test] -async fn modexp_tests_78() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); -} - -#[tokio::test] -async fn modexp_tests_79() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_80() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_81() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_82() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_83() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_84() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_85() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_86() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_87() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_88() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_89() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_90() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_91() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_92() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_93() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_94() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 -#[tokio::test] -async fn modexp_tests_95() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); -} - -#[tokio::test] -async fn modexp_tests_96() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_97() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_98() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_99() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_100() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_tests_101() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_102() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_103() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_104() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_105() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_106() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_107() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_108() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_109() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_110() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_111() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_112() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_tests_113() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME:This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 39.936. -#[tokio::test] -async fn modexp_tests_114() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000009c00").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000009c00").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 39_936])); -} - -// FIXME:This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 11.579. -#[tokio::test] -async fn modexp_tests_115() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000071140000000000000000000000000000000000000000000000000000000000002d3b").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000071140000000000000000000000000000000000000000000000000000000000002d3b").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 11_579])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. -#[tokio::test] -async fn modexp_tests_116() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 37_111])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. -#[tokio::test] -async fn modexp_tests_117() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000e7f00000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000e7f00000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 37_111])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 2.401. -#[tokio::test] -async fn modexp_tests_118() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000009610000000000000000000000000000000000000000000000000000000000000961").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000009610000000000000000000000000000000000000000000000000000000000000961").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 2_401])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 22000. -#[tokio::test] -async fn modexp_tests_119() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000578b00000000000000000000000000000000000000000000000000000000000055f0").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000578b00000000000000000000000000000000000000000000000000000000000055f0").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 22000])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. -#[tokio::test] -async fn modexp_tests_120() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(&[])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00` because of mod length being 1. -#[tokio::test] -async fn modexp_tests_121() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(&[0])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. -#[tokio::test] -async fn modexp_tests_122() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 37_111])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. -#[tokio::test] -async fn modexp_tests_123() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000001bd000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000001bd000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 97])); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. -#[tokio::test] -async fn modexp_tests_124() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 97])); -} - -#[tokio::test] -async fn modexp_tests_125() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000d7a1").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000d7a1").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 42.965 -#[tokio::test] -async fn modexp_tests_126() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000a7d5").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000a7d5").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(vec![0; 42_965])); -} - -#[tokio::test] -async fn modexp_random_input_0() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -// FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. -#[tokio::test] -async fn modexp_random_input_1() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000008000000000000000000000000000000000000000000000000000000000000400000000000000000000000a").unwrap()))).await.is_err()); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000008000000000000000000000000000000000000000000000000000000000000400000000000000000000000a").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(era_output, Bytes::from(&[])); -} - -#[tokio::test] -async fn modexp_random_input_2() { - assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001147000000000000000000000000000000000000000000000000000000000061660350000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.is_err()); - assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001147000000000000000000000000000000000000000000000000000000000061660350000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.is_err()); -} - -#[tokio::test] -async fn modexp_edge_cases_1() { - let eth_response = eth_call( - MODEXP_PRECOMPILE_ADDRESS, - None, - Some(Bytes::from(hex::decode("").unwrap())), - ) - .await - .unwrap(); - let era_response = era_call( - MODEXP_PRECOMPILE_ADDRESS, - None, - Some(Bytes::from(hex::decode("").unwrap())), - ) - .await - .unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_edge_cases_2() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_edge_cases_3() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000100").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000100").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_edge_cases_4() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001010200").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001010200").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} - -#[tokio::test] -async fn modexp_edge_cases_5() { - let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02f1").unwrap()))).await.unwrap(); - let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02f1").unwrap()))).await.unwrap(); - let (era_output, gas_used) = parse_call_result(&era_response); - write_modexp_gas_result(gas_used); - assert_eq!(eth_response, era_output); -} +// use zksync_web3_rs::{types::Bytes, zks_utils::MODEXP_PRECOMPILE_ADDRESS}; + +// #[cfg(test)] +// mod test_utils; +// use test_utils::{era_call, eth_call}; + +// use crate::test_utils::{parse_call_result, write_modexp_gas_result}; + +// #[tokio::test] +// async fn modexp_0() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002003fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// }' + +// #[tokio::test] +// async fn modexp_1() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2efffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_2() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_3() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff800000000000000000000000000000000000000000000000000000000000000007").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_4() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003ffff80").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_5() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002003").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_6() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020038000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020038000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_7() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000080").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000080").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_8() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_9() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000101").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000101").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_10() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000304").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000304").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_11() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020004").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020004").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_12() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020300").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020300").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_13() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010304").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010304").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_14() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010204").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_15() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000203").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000203").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_16() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030006").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030006").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_17() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020306").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001020306").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_18() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002020300").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002020300").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_19() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000202030000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_20() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020203").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020203").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_21() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002023003").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002023003").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_22() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020230").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020230").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_23() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000202").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_24() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_25() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001001001010010").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001001001010010").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_26() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000064").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_27() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030006").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000000000000000020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030006").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. +// #[tokio::test] +// async fn modexp_28() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(&[])) +// } + +// #[tokio::test] +// async fn modexp_29() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_30() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_31() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010035ee4e488f45e64d2f07becd54646357381d32f30b74c299a8c25d5202c04938ef6c4764a04f10fc908b78c4486886000f6d290251a79681a83b950c7e5c37351").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010035ee4e488f45e64d2f07becd54646357381d32f30b74c299a8c25d5202c04938ef6c4764a04f10fc908b78c4486886000f6d290251a79681a83b950c7e5c37351").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_32() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000cd935b43e42204fcbfb734a6e27735e8e90204fcc1fd2727bb040f9eecb").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000cd935b43e42204fcbfb734a6e27735e8e90204fcc1fd2727bb040f9eecb").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_33() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060846813a8d2d451387340fa0597c6545ae63").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000060846813a8d2d451387340fa0597c6545ae63").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_34() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d02534f82b1013f20d9c7d18d62cd95674d2e013f20d9c7d18d62cd95674d2f").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000d02534f82b1013f20d9c7d18d62cd95674d2e013f20d9c7d18d62cd95674d2f").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_35() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120785e45de3d6be050ba3c4d33ff0bb2d010ace3b1dfe9c49f4c7a8075102fa19a86c010ace3b1dfe9c49f4c7a8075102fa19a86d").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000120785e45de3d6be050ba3c4d33ff0bb2d010ace3b1dfe9c49f4c7a8075102fa19a86c010ace3b1dfe9c49f4c7a8075102fa19a86d").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. +// #[tokio::test] +// async fn modexp_36() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000ff2a1e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000ff2a1e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(&[])); +// } + +// #[tokio::test] +// async fn modexp_37() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010001").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000010001").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_0() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_1() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_2() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_3() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_4() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_5() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_6() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_7() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_8() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_9() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_10() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1_048_578. +// #[tokio::test] +// async fn modexp_tests_11() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); +// } + +// #[tokio::test] +// async fn modexp_tests_12() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_13() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_14() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_15() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_16() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_17() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_18() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_19() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_20() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_21() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_22() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_23() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_24() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_25() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_26() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_27() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. +// #[tokio::test] +// async fn modexp_tests_28() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); +// } + +// #[tokio::test] +// async fn modexp_tests_29() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_30() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_31() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_32() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_33() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_34() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_35() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_36() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_37() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_38() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_39() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_40() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_41() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_42() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_43() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_44() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_45() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. +// #[tokio::test] +// async fn modexp_tests_46() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); +// } + +// #[tokio::test] +// async fn modexp_tests_47() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_48() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_49() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_50() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_51() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_52() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_53() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_54() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 16. +// #[tokio::test] +// async fn modexp_tests_55() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 16])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 32. +// #[tokio::test] +// async fn modexp_tests_56() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 32])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 64. +// #[tokio::test] +// async fn modexp_tests_57() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 64])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 100. +// #[tokio::test] +// async fn modexp_tests_58() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 100])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 128. +// #[tokio::test] +// async fn modexp_tests_59() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 128])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 4.097. +// #[tokio::test] +// async fn modexp_tests_60() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 4_097])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 +// #[tokio::test] +// async fn modexp_tests_61() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); +// } + +// #[tokio::test] +// async fn modexp_tests_62() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_63() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_64() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff0000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_65() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff00000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_66() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffff000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_67() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_68() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_69() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_70() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_71() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_72() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_73() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_74() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_75() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_76() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_77() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578. +// #[tokio::test] +// async fn modexp_tests_78() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); +// } + +// #[tokio::test] +// async fn modexp_tests_79() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_80() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_81() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_82() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_83() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_84() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_85() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_86() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_87() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000004").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_88() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_89() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000010").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_90() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000020").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_91() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000040").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_92() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_93() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_94() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000001001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 1.048.578 +// #[tokio::test] +// async fn modexp_tests_95() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000100002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 1_048_578])); +// } + +// #[tokio::test] +// async fn modexp_tests_96() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000010000004").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_97() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000001000000008").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_98() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000ffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_99() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000ffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_100() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000ffffffffffffffff").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_tests_101() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_102() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_103() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_104() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_105() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_106() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_107() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_108() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_109() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_110() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_111() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_112() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_tests_113() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000064").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME:This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 39.936. +// #[tokio::test] +// async fn modexp_tests_114() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000009c00").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000009c00").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 39_936])); +// } + +// // FIXME:This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 11.579. +// #[tokio::test] +// async fn modexp_tests_115() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000071140000000000000000000000000000000000000000000000000000000000002d3b").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000071140000000000000000000000000000000000000000000000000000000000002d3b").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 11_579])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. +// #[tokio::test] +// async fn modexp_tests_116() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000900000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 37_111])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. +// #[tokio::test] +// async fn modexp_tests_117() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000e7f00000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000e7f00000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 37_111])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 2.401. +// #[tokio::test] +// async fn modexp_tests_118() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000009610000000000000000000000000000000000000000000000000000000000000961").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000003100000000000000000000000000000000000000000000000000000000000009610000000000000000000000000000000000000000000000000000000000000961").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 2_401])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 22000. +// #[tokio::test] +// async fn modexp_tests_119() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000578b00000000000000000000000000000000000000000000000000000000000055f0").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009100000000000000000000000000000000000000000000000000000000000000578b00000000000000000000000000000000000000000000000000000000000055f0").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 22000])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. +// #[tokio::test] +// async fn modexp_tests_120() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(&[])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00` because of mod length being 1. +// #[tokio::test] +// async fn modexp_tests_121() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(&[0])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 37.111. +// #[tokio::test] +// async fn modexp_tests_122() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f700000000000000000000000000000000000000000000000000000000000090f7").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 37_111])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. +// #[tokio::test] +// async fn modexp_tests_123() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000001bd000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000001bd000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 97])); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 97. +// #[tokio::test] +// async fn modexp_tests_124() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000910000000000000000000000000000000000000000000000000000000000000090f70000000000000000000000000000000000000000000000000000000000000061").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 97])); +// } + +// #[tokio::test] +// async fn modexp_tests_125() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000d7a1").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000009c000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000d7a1").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x00...000` because of mod length being 42.965 +// #[tokio::test] +// async fn modexp_tests_126() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000a7d5").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000d796000000000000000000000000000000000000000000000000000000000000a7d5").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(vec![0; 42_965])); +// } + +// #[tokio::test] +// async fn modexp_random_input_0() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000e300000000000000000000000000000000000000000000000000").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// // FIXME: This test fails on L1 with "out of gas" error and success on L2 returning `0x` because of mod length being 0. +// #[tokio::test] +// async fn modexp_random_input_1() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000008000000000000000000000000000000000000000000000000000000000000400000000000000000000000a").unwrap()))).await.is_err()); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000008000000000000000000000000000000000000000000000000000000000000400000000000000000000000a").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(era_output, Bytes::from(&[])); +// } + +// #[tokio::test] +// async fn modexp_random_input_2() { +// assert!(eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001147000000000000000000000000000000000000000000000000000000000061660350000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.is_err()); +// assert!(era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001147000000000000000000000000000000000000000000000000000000000061660350000000000000000000000000000000000000000000000000000000000000008").unwrap()))).await.is_err()); +// } + +// #[tokio::test] +// async fn modexp_edge_cases_1() { +// let eth_response = eth_call( +// MODEXP_PRECOMPILE_ADDRESS, +// None, +// Some(Bytes::from(hex::decode("").unwrap())), +// ) +// .await +// .unwrap(); +// let era_response = era_call( +// MODEXP_PRECOMPILE_ADDRESS, +// None, +// Some(Bytes::from(hex::decode("").unwrap())), +// ) +// .await +// .unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_edge_cases_2() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000001").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_edge_cases_3() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000100").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000100").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_edge_cases_4() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001010200").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001010200").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } + +// #[tokio::test] +// async fn modexp_edge_cases_5() { +// let eth_response = eth_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02f1").unwrap()))).await.unwrap(); +// let era_response = era_call(MODEXP_PRECOMPILE_ADDRESS, None, Some(Bytes::from(hex::decode("00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff02f1").unwrap()))).await.unwrap(); +// let (era_output, gas_used) = parse_call_result(&era_response); +// write_modexp_gas_result(gas_used); +// assert_eq!(eth_response, era_output); +// } diff --git a/tests/tests/secp256k1verify_tests.rs b/tests/tests/secp256k1verify_tests.rs index c2eb02a5..2f8259d7 100644 --- a/tests/tests/secp256k1verify_tests.rs +++ b/tests/tests/secp256k1verify_tests.rs @@ -143,15 +143,3 @@ async fn secp256k1verify_public_key_not_in_curve() { .to_string(); assert_eq!(era_response, EXECUTION_REVERTED) } - -// 1899fa5c2e77910f63db2d279ae19dea9ec0d2f3b0c8c532c572fe27cd1bedba -// 8c5056f413489ee720b4683ce930cad9c3b7e24a4d66b86a9aadaf1b8894bf8c -// 18d9533e1720ec3431130907948cc742587258045569caf86880b3e3d5aa66e0 -// b6e56e53302271f0c7917f53fe06ed6b0ee407b17df4fb31a5cafad9d1f2f4b9 -// 7cc9a1235fcb1392136e67f8590d1dbad166e2706dad4fdf9535b9d98ce760a0 - -// 0x1899fa5c2e77910f63db2d279ae19dea9ec0d2f3b0c8c532c572fe27cd1bedba -// 0x57e35a941054db36dd621975f9b35ceec81f3ffa9471c046115a3428edf0ee9c -// 0xa1246172f0c9a1aef67be23850ae60f6a4ce2e4654648a9b1756909df4fd4e64 -// 0xc16895b126617f6016d64f7d1096af1b42e3a800efd2ce9b1ec2ac115faf675a -// 0xfa8e77dcd37cf95a1c62c106b0c18756fd944bb79bf7522efd479bde327b9105 diff --git a/tests/tests/test_utils.rs b/tests/tests/test_utils.rs index 46c8cb2d..3fc95dea 100644 --- a/tests/tests/test_utils.rs +++ b/tests/tests/test_utils.rs @@ -9,7 +9,6 @@ static DEFAULT_L1_PROVIDER_URL: &str = "https://eth-mainnet.alchemyapi.io/v2/Lc7oIGYeL_QvInzI0Wiu_pOZZDEKBrdf"; static DEFAULT_L2_PROVIDER_URL: &str = "http://localhost:8011"; -#[allow(dead_code)] pub fn parse_call_result(bytes: &[u8]) -> (Bytes, u32) { let gas_used_bytes = bytes[0..4].to_vec(); let output = bytes[4..].to_vec(); @@ -27,31 +26,31 @@ fn write_line_to_report(used_gas: u32, report_to_write: &str) { let curr_thread = std::thread::current(); let test_name = curr_thread.name().unwrap(); - write!(file, "| {test_name} | {used_gas} | \n").unwrap(); + write!(file, "{test_name},{used_gas}\n").unwrap(); } pub fn write_modexp_gas_result(used_gas: u32) { - write_line_to_report(used_gas, "gas_reports/modexp_report.md"); + write_line_to_report(used_gas, "gas_reports/modexp_report.csv"); } pub fn write_ecadd_gas_result(used_gas: u32) { - write_line_to_report(used_gas, "gas_reports/ecadd_report.md"); + write_line_to_report(used_gas, "gas_reports/ecadd_report.csv"); } pub fn write_ecmul_gas_result(used_gas: u32) { - write_line_to_report(used_gas, "gas_reports/ecmul_report.md"); + write_line_to_report(used_gas, "gas_reports/ecmul_report.csv"); } pub fn write_ecpairing_gas_result(used_gas: u32) { - write_line_to_report(used_gas, "gas_reports/ecpairing_report.md"); + write_line_to_report(used_gas, "gas_reports/ecpairing_report.csv"); } pub fn write_p256verify_gas_result(used_gas: u32) { - write_line_to_report(used_gas, "gas_reports/p256verify_report.md"); + write_line_to_report(used_gas, "gas_reports/p256verify_report.csv"); } pub fn write_secp256k1verify_gas_result(used_gas: u32) { - write_line_to_report(used_gas, "gas_reports/secp256k1verify_report.md"); + write_line_to_report(used_gas, "gas_reports/secp256k1verify_report.csv"); } pub fn eth_provider() -> Provider {