From 40a6211c13314ae12c448be51db1c00cb49744f0 Mon Sep 17 00:00:00 2001 From: Noah Citron Date: Thu, 8 Sep 2022 17:46:48 -0400 Subject: [PATCH] tests: add execution tests (#14) * add execution rpc trait * add account tests * add code and tx tests * add receipt tests * add get block tests --- Cargo.lock | 2 + client/src/client.rs | 3 +- execution/Cargo.toml | 2 + execution/src/evm.rs | 22 +-- execution/src/execution.rs | 7 +- execution/src/lib.rs | 2 +- execution/src/{rpc.rs => rpc/http_rpc.rs} | 25 +-- execution/src/rpc/mock_rpc.rs | 50 ++++++ execution/src/rpc/mod.rs | 25 +++ execution/testdata/code.json | 1 + execution/testdata/proof.json | 18 ++ execution/testdata/receipt.json | 32 ++++ execution/testdata/transaction.json | 21 +++ execution/tests/execution.rs | 203 ++++++++++++++++++++++ 14 files changed, 385 insertions(+), 28 deletions(-) rename execution/src/{rpc.rs => rpc/http_rpc.rs} (67%) create mode 100644 execution/src/rpc/mock_rpc.rs create mode 100644 execution/src/rpc/mod.rs create mode 100644 execution/testdata/code.json create mode 100644 execution/testdata/proof.json create mode 100644 execution/testdata/receipt.json create mode 100644 execution/testdata/transaction.json create mode 100644 execution/tests/execution.rs diff --git a/Cargo.lock b/Cargo.lock index bedb25c..28244f0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -980,6 +980,7 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" name = "execution" version = "0.1.0" dependencies = [ + "async-trait", "blst", "bytes", "common", @@ -992,6 +993,7 @@ dependencies = [ "reqwest", "revm", "serde", + "serde_json", "ssz-rs", "tokio", "toml", diff --git a/client/src/client.rs b/client/src/client.rs index 1519828..b919e1e 100644 --- a/client/src/client.rs +++ b/client/src/client.rs @@ -10,12 +10,13 @@ use consensus::rpc::nimbus_rpc::NimbusRpc; use consensus::types::{ExecutionPayload, Header}; use consensus::ConsensusClient; use execution::evm::Evm; +use execution::rpc::http_rpc::HttpRpc; use execution::types::{CallOpts, ExecutionBlock}; use execution::ExecutionClient; pub struct Client { consensus: ConsensusClient, - execution: ExecutionClient, + execution: ExecutionClient, config: Arc, payloads: HashMap, block_hashes: HashMap, u64>, diff --git a/execution/Cargo.toml b/execution/Cargo.toml index 376247f..a2a3657 100644 --- a/execution/Cargo.toml +++ b/execution/Cargo.toml @@ -10,6 +10,7 @@ reqwest = { version = "0.11", features = ["json"] } tokio = { version = "1", features = ["full"] } eyre = "0.6.8" serde = { version = "1.0.143", features = ["derive"] } +serde_json = "1.0.85" hex = "0.4.3" ssz-rs = { git = "https://github.com/ralexstokes/ssz-rs" } blst = "0.3.10" @@ -20,6 +21,7 @@ bytes = "1.2.1" futures = "0.3.23" toml = "0.5.9" triehash-ethereum = { git = "https://github.com/openethereum/parity-ethereum" } +async-trait = "0.1.57" common = { path = "../common" } consensus = { path = "../consensus" } diff --git a/execution/src/evm.rs b/execution/src/evm.rs index d959935..0256d11 100644 --- a/execution/src/evm.rs +++ b/execution/src/evm.rs @@ -11,18 +11,18 @@ use tokio::runtime::Runtime; use consensus::types::ExecutionPayload; -use crate::types::CallOpts; +use crate::{rpc::Rpc, types::CallOpts}; use super::ExecutionClient; -pub struct Evm { - evm: EVM, +pub struct Evm { + evm: EVM>, chain_id: u64, } -impl Evm { - pub fn new(execution: ExecutionClient, payload: ExecutionPayload, chain_id: u64) -> Self { - let mut evm: EVM = EVM::new(); +impl Evm { + pub fn new(execution: ExecutionClient, payload: ExecutionPayload, chain_id: u64) -> Self { + let mut evm: EVM> = EVM::new(); let db = ProofDB::new(execution, payload); evm.database(db); @@ -78,14 +78,14 @@ impl Evm { } } -struct ProofDB { - execution: ExecutionClient, +struct ProofDB { + execution: ExecutionClient, payload: ExecutionPayload, error: Option, } -impl ProofDB { - pub fn new(execution: ExecutionClient, payload: ExecutionPayload) -> Self { +impl ProofDB { + pub fn new(execution: ExecutionClient, payload: ExecutionPayload) -> Self { ProofDB { execution, payload, @@ -104,7 +104,7 @@ impl ProofDB { } } -impl Database for ProofDB { +impl Database for ProofDB { fn basic(&mut self, address: H160) -> AccountInfo { if is_precompile(&address) { return AccountInfo::default(); diff --git a/execution/src/execution.rs b/execution/src/execution.rs index 8e6e505..72505c2 100644 --- a/execution/src/execution.rs +++ b/execution/src/execution.rs @@ -17,11 +17,11 @@ use super::rpc::Rpc; use super::types::{Account, ExecutionBlock}; #[derive(Clone)] -pub struct ExecutionClient { - rpc: Rpc, +pub struct ExecutionClient { + rpc: R, } -impl ExecutionClient { +impl ExecutionClient { pub fn new(rpc: &str) -> Result { let rpc = Rpc::new(rpc)?; Ok(ExecutionClient { rpc }) @@ -175,6 +175,7 @@ impl ExecutionClient { let expected_receipt_root = ordered_trie_root(receipts_encoded); let expected_receipt_root = H256::from_slice(&expected_receipt_root.to_fixed_bytes()); + println!("{}", hex::encode(expected_receipt_root)); let payload_receipt_root = H256::from_slice(&payload.receipts_root); if expected_receipt_root != payload_receipt_root || !receipts.contains(&receipt) { diff --git a/execution/src/lib.rs b/execution/src/lib.rs index 7a7ae88..4bcf871 100644 --- a/execution/src/lib.rs +++ b/execution/src/lib.rs @@ -1,8 +1,8 @@ pub mod evm; +pub mod rpc; pub mod types; mod execution; pub use crate::execution::*; mod proof; -mod rpc; diff --git a/execution/src/rpc.rs b/execution/src/rpc/http_rpc.rs similarity index 67% rename from execution/src/rpc.rs rename to execution/src/rpc/http_rpc.rs index 7f709a1..e316236 100644 --- a/execution/src/rpc.rs +++ b/execution/src/rpc/http_rpc.rs @@ -1,20 +1,24 @@ +use async_trait::async_trait; use ethers::prelude::{Address, Http}; use ethers::providers::{Middleware, Provider}; use ethers::types::{BlockId, Bytes, EIP1186ProofResponse, Transaction, TransactionReceipt, H256}; use eyre::Result; +use super::Rpc; + #[derive(Clone)] -pub struct Rpc { +pub struct HttpRpc { provider: Provider, } -impl Rpc { - pub fn new(rpc: &str) -> Result { +#[async_trait] +impl Rpc for HttpRpc { + fn new(rpc: &str) -> Result { let provider = Provider::try_from(rpc)?; - Ok(Rpc { provider }) + Ok(HttpRpc { provider }) } - pub async fn get_proof( + async fn get_proof( &self, address: &Address, slots: &[H256], @@ -28,26 +32,23 @@ impl Rpc { Ok(proof_response) } - pub async fn get_code(&self, address: &Address, block: u64) -> Result> { + async fn get_code(&self, address: &Address, block: u64) -> Result> { let block = Some(BlockId::from(block)); let code = self.provider.get_code(*address, block).await?; Ok(code.to_vec()) } - pub async fn send_raw_transaction(&self, bytes: &Vec) -> Result { + async fn send_raw_transaction(&self, bytes: &Vec) -> Result { let bytes = Bytes::from(bytes.as_slice().to_owned()); Ok(self.provider.send_raw_transaction(bytes).await?.tx_hash()) } - pub async fn get_transaction_receipt( - &self, - tx_hash: &H256, - ) -> Result> { + async fn get_transaction_receipt(&self, tx_hash: &H256) -> Result> { let receipt = self.provider.get_transaction_receipt(*tx_hash).await?; Ok(receipt) } - pub async fn get_transaction(&self, tx_hash: &H256) -> Result> { + async fn get_transaction(&self, tx_hash: &H256) -> Result> { Ok(self.provider.get_transaction(*tx_hash).await?) } } diff --git a/execution/src/rpc/mock_rpc.rs b/execution/src/rpc/mock_rpc.rs new file mode 100644 index 0000000..027d0b1 --- /dev/null +++ b/execution/src/rpc/mock_rpc.rs @@ -0,0 +1,50 @@ +use std::{fs::read_to_string, path::PathBuf}; + +use async_trait::async_trait; +use common::utils::hex_str_to_bytes; +use ethers::types::{Address, EIP1186ProofResponse, Transaction, TransactionReceipt, H256}; +use eyre::Result; + +use super::Rpc; + +#[derive(Clone)] +pub struct MockRpc { + path: PathBuf, +} + +#[async_trait] +impl Rpc for MockRpc { + fn new(rpc: &str) -> Result { + let path = PathBuf::from(rpc); + Ok(MockRpc { path }) + } + + async fn get_proof( + &self, + _address: &Address, + _slots: &[H256], + _block: u64, + ) -> Result { + let proof = read_to_string(self.path.join("proof.json"))?; + Ok(serde_json::from_str(&proof)?) + } + + async fn get_code(&self, _address: &Address, _block: u64) -> Result> { + let code = read_to_string(self.path.join("code.json"))?; + hex_str_to_bytes(&code[0..code.len() - 1]) + } + + async fn send_raw_transaction(&self, _bytes: &Vec) -> Result { + Err(eyre::eyre!("not implemented")) + } + + async fn get_transaction_receipt(&self, _tx_hash: &H256) -> Result> { + let receipt = read_to_string(self.path.join("receipt.json"))?; + Ok(serde_json::from_str(&receipt)?) + } + + async fn get_transaction(&self, _tx_hash: &H256) -> Result> { + let tx = read_to_string(self.path.join("transaction.json"))?; + Ok(serde_json::from_str(&tx)?) + } +} diff --git a/execution/src/rpc/mod.rs b/execution/src/rpc/mod.rs new file mode 100644 index 0000000..f0583ce --- /dev/null +++ b/execution/src/rpc/mod.rs @@ -0,0 +1,25 @@ +use async_trait::async_trait; +use ethers::types::{Address, EIP1186ProofResponse, Transaction, TransactionReceipt, H256}; +use eyre::Result; + +pub mod http_rpc; +pub mod mock_rpc; + +#[async_trait] +pub trait Rpc: Send + Clone + 'static { + fn new(rpc: &str) -> Result + where + Self: Sized; + + async fn get_proof( + &self, + address: &Address, + slots: &[H256], + block: u64, + ) -> Result; + + async fn get_code(&self, address: &Address, block: u64) -> Result>; + async fn send_raw_transaction(&self, bytes: &Vec) -> Result; + async fn get_transaction_receipt(&self, tx_hash: &H256) -> Result>; + async fn get_transaction(&self, tx_hash: &H256) -> Result>; +} diff --git a/execution/testdata/code.json b/execution/testdata/code.json new file mode 100644 index 0000000..35d65f9 --- /dev/null +++ b/execution/testdata/code.json @@ -0,0 +1 @@ +0x6080604052600436106102345760003560e01c8063715018a61161012e578063c45ac050116100ab578063e985e9c51161006f578063e985e9c51461073f578063f19e75d414610788578063f2c4ce1e1461079b578063f2fde38b146107bb578063fb808e8a146107db57600080fd5b8063c45ac0501461067e578063c87b56dd1461069e578063ce7c2ac2146106be578063d79779b2146106f4578063e33b7de31461072a57600080fd5b806395d89b41116100f257806395d89b41146105d35780639852595c146105e8578063a22cb4651461061e578063a3f8eace1461063e578063b88d4fde1461065e57600080fd5b8063715018a6146105475780637b47ec1a1461055c5780638b83209b1461057c5780638da5cb5b1461059c57806395acfa27146105ba57600080fd5b80633a98ef39116101bc57806348b750441161018057806348b75044146104a75780634c261247146104c75780636352211e146104e75780636d5d40c61461050757806370a082311461052757600080fd5b80633a98ef39146103c45780633bbeaab5146103d95780633f6ef2341461040d578063406072a91461044157806342842e0e1461048757600080fd5b806318160ddd1161020357806318160ddd14610333578063191655871461035a57806323b872dd1461037a5780632db115441461039a5780632e95599a146103ad57600080fd5b806301ffc9a71461028257806306fdde03146102b7578063081812fc146102d9578063095ea7b31461031157600080fd5b3661027d577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b34801561028e57600080fd5b506102a261029d3660046120e9565b61080f565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc610861565b6040516102ae919061215e565b3480156102e557600080fd5b506102f96102f4366004612171565b6108f3565b6040516001600160a01b0390911681526020016102ae565b34801561031d57600080fd5b5061033161032c36600461219f565b610937565b005b34801561033f57600080fd5b5060025460015403600019015b6040519081526020016102ae565b34801561036657600080fd5b506103316103753660046121cb565b6109e4565b34801561038657600080fd5b506103316103953660046121e8565b610b62565b6103316103a8366004612171565b610cfd565b3480156103b957600080fd5b5060115461034c9081565b3480156103d057600080fd5b50600a5461034c565b3480156103e557600080fd5b5061034c7f00000000000000000000000000000000000000000000000000000000000001f481565b34801561041957600080fd5b5061034c7f00000000000000000000000000000000000000000000000000000000000001f481565b34801561044d57600080fd5b5061034c61045c366004612229565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b34801561049357600080fd5b506103316104a23660046121e8565b610ea3565b3480156104b357600080fd5b506103316104c2366004612229565b610ebe565b3480156104d357600080fd5b506103316104e2366004612262565b611061565b3480156104f357600080fd5b506102f9610502366004612171565b611087565b34801561051357600080fd5b50610331610522366004612171565b611092565b34801561053357600080fd5b5061034c6105423660046121cb565b61109f565b34801561055357600080fd5b506103316110ee565b34801561056857600080fd5b50610331610577366004612171565b611102565b34801561058857600080fd5b506102f9610597366004612171565b611174565b3480156105a857600080fd5b506000546001600160a01b03166102f9565b3480156105c657600080fd5b5061034c64e8d4a5100081565b3480156105df57600080fd5b506102cc6111a4565b3480156105f457600080fd5b5061034c6106033660046121cb565b6001600160a01b03166000908152600d602052604090205490565b34801561062a57600080fd5b506103316106393660046122e2565b6111b3565b34801561064a57600080fd5b5061034c6106593660046121cb565b611249565b34801561066a57600080fd5b50610331610679366004612326565b611291565b34801561068a57600080fd5b5061034c610699366004612229565b6112db565b3480156106aa57600080fd5b506102cc6106b9366004612171565b6113b5565b3480156106ca57600080fd5b5061034c6106d93660046121cb565b6001600160a01b03166000908152600c602052604090205490565b34801561070057600080fd5b5061034c61070f3660046121cb565b6001600160a01b03166000908152600f602052604090205490565b34801561073657600080fd5b50600b5461034c565b34801561074b57600080fd5b506102a261075a366004612229565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b610331610796366004612171565b611459565b3480156107a757600080fd5b506103316107b6366004612262565b61158d565b3480156107c757600080fd5b506103316107d63660046121cb565b6115a1565b3480156107e757600080fd5b5061034c7f00000000000000000000000000000000000000000000000000000000000001f481565b60006301ffc9a760e01b6001600160e01b03198316148061084057506380ac58cd60e01b6001600160e01b03198316145b8061085b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606003805461087090612406565b80601f016020809104026020016040519081016040528092919081815260200182805461089c90612406565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b5050505050905090565b60006108fe82611617565b61091b576040516333d1c03960e21b815260040160405180910390fd5b506000908152600760205260409020546001600160a01b031690565b600061094282611087565b9050336001600160a01b0382161461097b5761095e813361075a565b61097b576040516367d9dca160e11b815260040160405180910390fd5b600082815260076020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6001600160a01b0381166000908152600c6020526040902054610a5d5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b60648201526084015b60405180910390fd5b6000610a6882611249565b905080610acb5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610a54565b6001600160a01b0382166000908152600d602052604081208054839290610af3908490612457565b9250508190555080600b6000828254610b0c9190612457565b90915550610b1c9050828261164c565b604080516001600160a01b0384168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15050565b6000610b6d82611765565b9050836001600160a01b0316816001600160a01b031614610ba05760405162a1148160e81b815260040160405180910390fd5b60008281526007602052604090208054610bcc8187335b6001600160a01b039081169116811491141790565b610bf757610bda863361075a565b610bf757604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610c1e57604051633a954ecd60e21b815260040160405180910390fd5b8015610c2957600082555b6001600160a01b038681166000908152600660205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260056020526040902055600160e11b8316610cb45760018401600081815260056020526040902054610cb2576001548114610cb25760008181526005602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b323314610d4c5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610a54565b6011546000610d608364e8d4a5100061246f565b90508115801590610d715750814210155b610dbd5760405162461bcd60e51b815260206004820152601f60248201527f5075626c69632073616c6520686173206e6f74207374617274656420796574006044820152606401610a54565b80341015610e0d5760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f756768204554482073656e743a20636865636b2070726963656044820152606401610a54565b6002546001547f00000000000000000000000000000000000000000000000000000000000001f49185910360001901610e469190612457565b1115610e945760405162461bcd60e51b815260206004820152601660248201527f45786365656473206d6178696d756d20737570706c79000000000000000000006044820152606401610a54565b610e9e83826117ce565b505050565b610e9e83838360405180602001604052806000815250611291565b6001600160a01b0381166000908152600c6020526040902054610f325760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610a54565b6000610f3e83836112db565b905080610fa15760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610a54565b6001600160a01b03808416600090815260106020908152604080832093861683529290529081208054839290610fd8908490612457565b90915550506001600160a01b0383166000908152600f602052604081208054839290611005908490612457565b9091555061101690508383836117e1565b604080516001600160a01b038481168252602082018490528516917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a2505050565b611069611848565b6110756012838361203a565b50506013805460ff1916600117905550565b600061085b82611765565b61109a611848565b601155565b60006001600160a01b0382166110c8576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526006602052604090205467ffffffffffffffff1690565b6110f6611848565b61110060006118a2565b565b600061110d82611087565b90506001600160a01b03811633146111675760405162461bcd60e51b815260206004820152601260248201527f4e6f74206f776e6572206f6620746f6b656e00000000000000000000000000006044820152606401610a54565b611170826118ff565b5050565b6000600e82815481106111895761118961248e565b6000918252602090912001546001600160a01b031692915050565b60606004805461087090612406565b6001600160a01b0382163314156111dd5760405163b06307db60e01b815260040160405180910390fd5b3360008181526008602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080611255600b5490565b61125f9047612457565b905061128a8382611285866001600160a01b03166000908152600d602052604090205490565b61190a565b9392505050565b61129c848484610b62565b6001600160a01b0383163b156112d5576112b884848484611948565b6112d5576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6001600160a01b0382166000908152600f602052604081205481906040516370a0823160e01b81523060048201526001600160a01b038616906370a082319060240160206040518083038186803b15801561133557600080fd5b505afa158015611349573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136d91906124a4565b6113779190612457565b6001600160a01b038086166000908152601060209081526040808320938816835292905220549091506113ad908490839061190a565b949350505050565b60606113c082611617565b6113dd57604051630a14c4b560e41b815260040160405180910390fd5b60006113e7611a3f565b905060006113f3611a4e565b905061140160135460ff1690565b61140c579392505050565b815161142757604051806020016040528060008152506113ad565b8161143185611a5d565b6040516020016114429291906124bd565b604051602081830303815290604052949350505050565b611461611848565b6002546001547f00000000000000000000000000000000000000000000000000000000000001f4918391036000190161149a9190612457565b11156114e85760405162461bcd60e51b815260206004820152601460248201527f4e6f7420656e6f7567682072656d61696e696e670000000000000000000000006044820152606401610a54565b3360009081526006602052604090819020547f00000000000000000000000000000000000000000000000000000000000001f4916115329184911c67ffffffffffffffff16612457565b11156115805760405162461bcd60e51b815260206004820152601660248201527f43616e206e6f74206d696e742074686973206d616e79000000000000000000006044820152606401610a54565b61158a3382611a9f565b50565b611595611848565b610e9e6014838361203a565b6115a9611848565b6001600160a01b03811661160e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a54565b61158a816118a2565b60008160011115801561162b575060015482105b801561085b575050600090815260056020526040902054600160e01b161590565b8047101561169c5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a54565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146116e9576040519150601f19603f3d011682016040523d82523d6000602084013e6116ee565b606091505b5050905080610e9e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a54565b600081806001116117b5576001548110156117b557600081815260056020526040902054600160e01b81166117b3575b8061128a575060001901600081815260056020526040902054611795565b505b604051636f96cda160e11b815260040160405180910390fd5b6117d83383611a9f565b61117081611ab9565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b179052610e9e908490611b47565b6000546001600160a01b031633146111005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a54565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61158a816000611c19565b600a546001600160a01b0384166000908152600c602052604081205490918391611934908661246f565b61193e91906124fc565b6113ad919061251e565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061197d903390899088908890600401612535565b602060405180830381600087803b15801561199757600080fd5b505af19250505080156119c7575060408051601f3d908101601f191682019092526119c491810190612571565b60015b611a22573d8080156119f5576040519150601f19603f3d011682016040523d82523d6000602084013e6119fa565b606091505b508051611a1a576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b60606012805461087090612406565b60606014805461087090612406565b604080516080019081905280825b600183039250600a81066030018353600a900480611a8857611a8d565b611a6b565b50819003601f19909101908152919050565b611170828260405180602001604052806000815250611d5d565b80341015611b095760405162461bcd60e51b815260206004820152601660248201527f4e65656420746f2073656e64206d6f7265204554482e000000000000000000006044820152606401610a54565b8034111561158a57336108fc611b1f833461251e565b6040518115909202916000818181858888f19350505050158015611170573d6000803e3d6000fd5b6000611b9c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611dca9092919063ffffffff16565b805190915015610e9e5780806020019051810190611bba919061258e565b610e9e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a54565b6000611c2483611765565b905080600080611c4286600090815260076020526040902080549091565b915091508415611c8257611c57818433610bb7565b611c8257611c65833361075a565b611c8257604051632ce44b5f60e11b815260040160405180910390fd5b8015611c8d57600082555b6001600160a01b038316600081815260066020526040902080546fffffffffffffffffffffffffffffffff0190554260a01b17600360e01b17600087815260056020526040902055600160e11b8416611d145760018601600081815260056020526040902054611d12576001548114611d125760008181526005602052604090208590555b505b60405186906000906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4505060028054600101905550505050565b611d678383611dd9565b6001600160a01b0383163b15610e9e576001548281035b611d916000868380600101945086611948565b611dae576040516368d2bf6b60e11b815260040160405180910390fd5b818110611d7e578160015414611dc357600080fd5b5050505050565b60606113ad8484600085611ed0565b60015481611dfa5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526006602090815260408083208054680100000000000000018802019055848352600590915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611ea957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611e71565b5081611ec757604051622e076360e81b815260040160405180910390fd5b60015550505050565b606082471015611f315760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610a54565b6001600160a01b0385163b611f885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a54565b600080866001600160a01b03168587604051611fa491906125ab565b60006040518083038185875af1925050503d8060008114611fe1576040519150601f19603f3d011682016040523d82523d6000602084013e611fe6565b606091505b5091509150611ff6828286612001565b979650505050505050565b6060831561201057508161128a565b8251156120205782518084602001fd5b8160405162461bcd60e51b8152600401610a54919061215e565b82805461204690612406565b90600052602060002090601f01602090048101928261206857600085556120ae565b82601f106120815782800160ff198235161785556120ae565b828001600101855582156120ae579182015b828111156120ae578235825591602001919060010190612093565b506120ba9291506120be565b5090565b5b808211156120ba57600081556001016120bf565b6001600160e01b03198116811461158a57600080fd5b6000602082840312156120fb57600080fd5b813561128a816120d3565b60005b83811015612121578181015183820152602001612109565b838111156112d55750506000910152565b6000815180845261214a816020860160208601612106565b601f01601f19169290920160200192915050565b60208152600061128a6020830184612132565b60006020828403121561218357600080fd5b5035919050565b6001600160a01b038116811461158a57600080fd5b600080604083850312156121b257600080fd5b82356121bd8161218a565b946020939093013593505050565b6000602082840312156121dd57600080fd5b813561128a8161218a565b6000806000606084860312156121fd57600080fd5b83356122088161218a565b925060208401356122188161218a565b929592945050506040919091013590565b6000806040838503121561223c57600080fd5b82356122478161218a565b915060208301356122578161218a565b809150509250929050565b6000806020838503121561227557600080fd5b823567ffffffffffffffff8082111561228d57600080fd5b818501915085601f8301126122a157600080fd5b8135818111156122b057600080fd5b8660208285010111156122c257600080fd5b60209290920196919550909350505050565b801515811461158a57600080fd5b600080604083850312156122f557600080fd5b82356123008161218a565b91506020830135612257816122d4565b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561233c57600080fd5b84356123478161218a565b935060208501356123578161218a565b925060408501359150606085013567ffffffffffffffff8082111561237b57600080fd5b818701915087601f83011261238f57600080fd5b8135818111156123a1576123a1612310565b604051601f8201601f19908116603f011681019083821181831017156123c9576123c9612310565b816040528281528a60208487010111156123e257600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b600181811c9082168061241a57607f821691505b6020821081141561243b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561246a5761246a612441565b500190565b600081600019048311821515161561248957612489612441565b500290565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156124b657600080fd5b5051919050565b600083516124cf818460208801612106565b8351908301906124e3818360208801612106565b64173539b7b760d91b9101908152600501949350505050565b60008261251957634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561253057612530612441565b500390565b60006001600160a01b038087168352808616602084015250836040830152608060608301526125676080830184612132565b9695505050505050565b60006020828403121561258357600080fd5b815161128a816120d3565b6000602082840312156125a057600080fd5b815161128a816122d4565b600082516125bd818460208701612106565b919091019291505056fea26469706673582212200393b73eb717301d2d6a12012b7cf202b94dd5cab4b02c60261202415fcb8ec364736f6c63430008090033 diff --git a/execution/testdata/proof.json b/execution/testdata/proof.json new file mode 100644 index 0000000..cd58024 --- /dev/null +++ b/execution/testdata/proof.json @@ -0,0 +1,18 @@ +{ + "address": "0x14f9d4af749609c1438528c0cce1cc3f6d411c47", + "accountProof": [ + "0xf90211a071e881b8a14ffdfd37073cbfbcb6bb2c9231d0559440027fd00f0e8a2235aa34a0e84ac559924013eabff34253b21d302c3c30ad0496cae6a1ae2d93171f0ee2d7a0a6ef9fb82ab93a5ba0153998b19aaf272a7050506d8c3405964296d5f10b8d6aa04c95a5d292a544afefc594a747620e39eb172f8ba9bd1082668e0843cffefeefa0815f25eddd6abf24135df25e695fbe45567a1a8ee9bb83df9482b9e1ac5527dba0b9234f356908b44cc9ed4171894f6f40f4122fda4e5f5c82e984deec601a87fda0fe947db5baa6c4ccc8655f3cd3631c220f8dc07aafa44d2147be5d2ab21af555a0c75c86ef435e5d58f8161ca09e838b53af78e0b81f17ab67c702dcf465c48f08a05d4eb9221936f698f2338f560ead42b115a6dd409b15108579f082773166b0b4a052ac45eb7d301b373044ead47d2d4ee6f2313979540bca0ae798c0ccb3e61421a0b7433a507e6ffeef9624872b21a73c3fd5fb3d8f781d28da44b2bedda5208d5aa0522aa006cfd459900bf06651a03b426e6fcfd5532e093a807641bc10bbae9691a06f8fe64c907d1d2b75e411858e701c263a0622ef9335ae1433ea9e3bdf9d8315a024e3319b5c09742a511fc2d342eeaa1f1eb41a2a1c78f7a1ac9dab1bbd65f0d2a03bf8e1b5ced29303bb0045bf8b4fc6ae52f07d3136620d296901f494d7eaeebda0071e94edd3d657ad6f01ac0ca870dd174d48b904d4767906658c1db62fd716b780", + "0xf90211a0373c65c436fc03fe9fe3bc74631719de2de9ee93143830404f74f6d55ee8083da0e56bb1ef97ce46a4dfd53142a5f51986ce2103d68c2f609650173a65a5d74d03a040b5dac451091440dfd30276ad1bef64aafd51eebdda7071c8bd1337a606de19a027f8fadfbf130af518f236e2e337746585cc4d321f745d4caa24f1dc00676b05a00e5c404b0a407dbdd598ab842048fb294c910ef39f390adbc32bce46b2e34a71a0e43291d8b64138dd133accade91bd6a1a10b5bee1b336817f03ff375a17d7b1ca064d673999038d81f854510ad959267827e3bcd2841bae4ed3ad4e80c227acaf0a0c023b60b354c91de5144503087c0e47a8053a4ae94b81bb0201f4840cdc89ff6a0975eaf9e2c261da99052309b82ff2bd7675b005da56efa0c0efc341e3b68ed0fa088d9a8a786c5ed346781f0d470b90b82f0c7cac8c070959859fe3aba8e906b5ca0e8697941f517a90668257af41b975c0f1cdedc9762c3585e27b2eaec7eb41c4ca0f72a74ba3efd9e397daaa4ec939865e250978947b69e7069e026916201945ee4a07242ec29142d129f6927395d6ce481405f85d1453344529d99f98e20272fbc1aa06f33fb0bd4c80da83e3e85010cfeed3b19a665157e19806086d34c3b11846e67a0a4464bf01a4296d323821535817b20db9986f1ebcbcedd84803a09c53f4f0588a0e1d393beb40edab4c0aa74c566807f295c33a4a58f91d27f705b289fe41a51c980", + "0xf90211a0d8a32a972ccc40d028cfe098181fd498491d3205dedf45212119a40263608d79a0eba342773c0e6d2968acfcd885c54d5ab37bd5f85188fe46c764ed0e18f58350a0b94b1708163349d0281a4815d8320241fca4184f270f2ac5fcecd0f6eae9e3b1a043ddbf76e40f7cf55dcc248ee64bb3097e27553737ac53984d783f055b9caf3ea0843d7e62a73d0027d096fbb66e0f469043d4115ee22b1f28b5f1137a26ca8cdba0f015b37db0287d99cf919af2143e2d11302de8a679e21c1c5c66f5087158aa3da04d3464647b9bd42b67d4285446559e2bf719883a80526b18f79330898906b5fba0f6f7ab5218a48cc0e204b3fb68dbddf7ac79b168f0325ca915bb3ed1a3130be2a08910831666244e6983919fee3c477826f08255edee9351a9f865df1fc1c8d40ca04903a704c077aac79e59b5c44c3b79e3f6716015309a29b069b55453d3d15773a0b2ea8736d58291c8c31dbc20185702717f8c533b656fa1f570b4c52030c05479a0d04ddbbd951b8e5f37c5819e242d6d341bf3239519b8d4e1f874fa2de3082a4aa0397a19edf6b5f64a9b04d1428fd5ac953178c23510e3dcf50bb9614e556c5cbfa0bfb66a915ec5bc5344c3c7282ee62e94234664090763a1dab43a3f20e6199b31a01c2f46a9fc0f12c1a5f1f7ce20cac8d2827ee82b6e2acbea4c9628f81b1d130da05222b1d0263ac9bad858462ef349e6347b04167d5f2a62400332fcc18a595f2d80", + "0xf90211a0060b9dbbd560313dfa11d86e56f8117d76130d197f08a796770fcaca646b7e1fa0cbb0b6eb9383b11c038ff8a9d30df57042e819c6e4e83666486a9fc094ee3ec5a049de57ac42fa5258213ccff70ef43d6bba4948e0dbfc5851a42ca84c1255cc23a0957940bcb472f09053fbda2f73c59868dfd4a865dad792a1bc5dd7957f8f5376a05b1bde3ba31401a9a93e10156d06117aaacc4f9f56a0441f10ba8848f8f954a8a0cfa085c19fcc9e290c999abc7209e469d76a4115219d87e8f361d15829fe2d53a0849e508de302c48ce95e7ae5ff20969bccdd36e69c9e11f25fd9a2dd16b36319a03a56898360443bb212bd44bb6ffda43dc36912f6c7cfd9a4bb39e58c936270f9a068842c2394fcc47c2e87802e88aa1465d37f6e97828e1df33d1178e6b14692c3a0b052b4c48baff415ca25c11b9825696404226ec65bbfa0bbc214d61984e5aceea02bfdb2153896c75a21927912d7e422d811f30cdf0edbcb6cdf955398781d6b45a06e932ff247483a4dc084d3860a29ee16040b8002b564405bb9db6045f988d61da074734042a667e98e49ea665b5a90109a8fca222f0c0813d0ff6bae785497cd60a04ad321ecd7939bb4b754ee3b76fe1b06efd3a6d583fccf2c3049cfcfb7d27473a0890dbb8238beb7875f636725343cc47214582fb5e0c0937920815a37339a6960a0469b936445ed7be59190a11c49e1198d7b584d5e59d62d793265fbe8ce0a937480", + "0xf90211a01a991ab74e62008f16acbf7fbe7119469aea98f0b05308d279da5aa897fb9ce5a0dcd7d6ac32c17dda96d77f14115771757d9b3245bda0a1d457d3352b616437f9a0610fa0acd1afcc1b3209d9e561a619d729cfda4bfa639bf4108f63fd6666340aa0539fc55db43500d6b2abd40a064fc800fe814522921d2528df7afd8e80670b08a08065e71d206bf24e631661ecc0fb1351fc65b851f66a1fcf25b882fbccd69d8ba0e3c85725c51e251bf16bd8ddf396613454175833ecc083a20794a71a1b0ce91fa06768a52005a756d65276e791abbc6e64f0974044a4a1bfc0effd8e660778447ca05d1061535cdb4e2775810401d5f9d5f78765e1669ba2a3c003aae461466bb253a01e6f9ab043ac334d887f6c92b358acdc64709cbd725dedf53159b71ae1bdebfda0c799a3e48366551e882f3a0d494a3d9438def0a618089c2922da38f6fd9031c0a0019fa068a9bd23bdab5982bc0da260e11abdf4164445f67945ffd2512a74e27ba0df54f3672852d15d637ecf05a465c7213bfaea546dcad7a3653ba474067fe248a08f28bdc021a4753466a2c0e77cd5ac412c6863155f03a97ae9e2de7dd27edf8da035ae5bb7ee628fcc2bf3bbe12bbe4b5f5b1e5a6a4fdd5f7752dcd6b27d57ec77a07dc8f59a0a12dfbf045ff82165af0101b32e5cbf3d7ab2903a21919b9978efb7a069232faca7617690aa62a02344d2a2d54b8529d963d9f7c95a02ea3519cd41da80", + "0xf8f18080a00c668cef94cedbc21f3f2ff5795442f424c67c3bcbd300328660d8f2e6543b908080a05c86dc654307d6f084bc46ee572324e89bb3965211cf0216f03a5511f179d2daa0d6cabba9da3391114dbe866d21cd6bfde3496bb8f69786b1b1fafa224795226ba0d6d362d0161e94d6787b2165d61bf0ccc1b51c351b6178b647d1df2e1be69274a01338e1219a75007137581b7299d61cd66d74d3e7eed44e73cf166033c0030ed380a06b8cb01c204ddf7ae87ae9531ab3713d7679a630496e79c127c5d4662823d724a04d29b6aac81dfac338997a2a66a9338531732efb7f32ffb2a81df61a2291f8f78080808080", + "0xf851808080808080808080808080a032914585f84a102eefeca772a4f807beb731bfbc6b2c407c7685d0e1a294e6dba07784d7e02bf6c6a29570c630c76231a4ee251ba305f57148c1e140c1dcfe88d5808080", + "0xf86c9d3801d9ae5e62cc3f6bcde556599e2fe63f1fadf1dc7318cf0ae6482f84b84cf84a0186048c27395000a0f98486b87474ffe02e56b9e4b45558b99928e4c67bcd517918849e77bd68d113a0c6ca0679d7242fa080596f2fe2e6b172d9b927a6b52278343826e33745854327" + ], + "balance": "0x48c27395000", + "codeHash": "0xc6ca0679d7242fa080596f2fe2e6b172d9b927a6b52278343826e33745854327", + "nonce": "0x1", + "storageHash": "0xf98486b87474ffe02e56b9e4b45558b99928e4c67bcd517918849e77bd68d113", + "storageProof": [] +} diff --git a/execution/testdata/receipt.json b/execution/testdata/receipt.json new file mode 100644 index 0000000..f2800a1 --- /dev/null +++ b/execution/testdata/receipt.json @@ -0,0 +1,32 @@ +{ + "transactionHash": "0x2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f", + "blockHash": "0x6663f197e991f5a0bb235f33ec554b9bd48c37b4f5002d7ac2abdfa99f86ac14", + "blockNumber": "0x72e9b5", + "logs": [ + { + "transactionHash": "0x2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f", + "address": "0x326c977e6efc84e512bb9c30f76e30c160ed06fb", + "blockHash": "0x6663f197e991f5a0bb235f33ec554b9bd48c37b4f5002d7ac2abdfa99f86ac14", + "blockNumber": "0x72e9b5", + "data": "0x000000000000000000000000000000000000000000000001158e460913d00000", + "logIndex": "0x0", + "removed": false, + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000004281ecf07378ee595c564a59048801330f3084ee", + "0x0000000000000000000000007daccf9b3c1ae2fa5c55f1c978aeef700bc83be0" + ], + "transactionIndex": "0x0" + } + ], + "contractAddress": null, + "effectiveGasPrice": "0x9502f908", + "cumulativeGasUsed": "0xca6a", + "from": "0x4281ecf07378ee595c564a59048801330f3084ee", + "gasUsed": "0xca6a", + "logsBloom": "0x00000000000000040000000000000000000000000000100008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000004000000000020000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000800000000400000001000000000000000000000000000000000000000000000", + "status": "0x1", + "to": "0x326c977e6efc84e512bb9c30f76e30c160ed06fb", + "transactionIndex": "0x0", + "type": "0x2" +} diff --git a/execution/testdata/transaction.json b/execution/testdata/transaction.json new file mode 100644 index 0000000..67ecf84 --- /dev/null +++ b/execution/testdata/transaction.json @@ -0,0 +1,21 @@ +{ + "blockHash": "0x6663f197e991f5a0bb235f33ec554b9bd48c37b4f5002d7ac2abdfa99f86ac14", + "blockNumber": "0x72e9b5", + "hash": "0x2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f", + "accessList": [], + "chainId": "0x5", + "from": "0x4281ecf07378ee595c564a59048801330f3084ee", + "gas": "0xea60", + "gasPrice": "0x9502f908", + "input": "0xa9059cbb0000000000000000000000007daccf9b3c1ae2fa5c55f1c978aeef700bc83be0000000000000000000000000000000000000000000000001158e460913d00000", + "maxFeePerGas": "0x9502f910", + "maxPriorityFeePerGas": "0x9502f900", + "nonce": "0x623355", + "r": "0xe1445466b058b6f883c0222f1b1f3e2ad9bee7b5f688813d86e3fa8f93aa868c", + "s": "0x786d6e7f3aefa8fe73857c65c32e4884d8ba38d0ecfb947fbffb82e8ee80c167", + "to": "0x326c977e6efc84e512bb9c30f76e30c160ed06fb", + "transactionIndex": "0x0", + "type": "0x2", + "v": "0x0", + "value": "0x0" +} diff --git a/execution/tests/execution.rs b/execution/tests/execution.rs new file mode 100644 index 0000000..aba89f5 --- /dev/null +++ b/execution/tests/execution.rs @@ -0,0 +1,203 @@ +use std::collections::HashMap; +use std::str::FromStr; + +use ethers::types::{Address, H256, U256}; +use ethers::utils::keccak256; +use ssz_rs::{List, Vector}; + +use common::utils::hex_str_to_bytes; +use consensus::types::ExecutionPayload; +use execution::rpc::mock_rpc::MockRpc; +use execution::ExecutionClient; + +fn get_client() -> ExecutionClient { + ExecutionClient::new("testdata/").unwrap() +} + +#[tokio::test] +async fn test_get_account() { + let execution = get_client(); + let address = Address::from_str("14f9D4aF749609c1438528C0Cce1cC3f6D411c47").unwrap(); + + let mut payload = ExecutionPayload::default(); + payload.state_root = Vector::from_iter( + hex_str_to_bytes("0xaa02f5db2ee75e3da400d10f3c30e894b6016ce8a2501680380a907b6674ce0d") + .unwrap(), + ); + + let account = execution + .get_account(&address, None, &payload) + .await + .unwrap(); + + assert_eq!( + account.balance, + U256::from_str_radix("48c27395000", 16).unwrap() + ); +} + +#[tokio::test] +async fn test_get_account_bad_proof() { + let execution = get_client(); + let address = Address::from_str("14f9D4aF749609c1438528C0Cce1cC3f6D411c47").unwrap(); + let payload = ExecutionPayload::default(); + + let account_res = execution.get_account(&address, None, &payload).await; + + assert!(account_res.is_err()); +} + +#[tokio::test] +async fn test_get_code() { + let execution = get_client(); + let address = Address::from_str("14f9D4aF749609c1438528C0Cce1cC3f6D411c47").unwrap(); + + let mut payload = ExecutionPayload::default(); + payload.state_root = Vector::from_iter( + hex_str_to_bytes("0xaa02f5db2ee75e3da400d10f3c30e894b6016ce8a2501680380a907b6674ce0d") + .unwrap(), + ); + + let code = execution.get_code(&address, &payload).await.unwrap(); + let code_hash = keccak256(code); + + assert_eq!( + code_hash.as_slice(), + &hex_str_to_bytes("0xc6ca0679d7242fa080596f2fe2e6b172d9b927a6b52278343826e33745854327") + .unwrap() + ); +} + +#[tokio::test] +async fn test_get_code_bad_proof() { + let execution = get_client(); + let address = Address::from_str("14f9D4aF749609c1438528C0Cce1cC3f6D411c47").unwrap(); + + let payload = ExecutionPayload::default(); + + let code_res = execution.get_code(&address, &payload).await; + + assert!(code_res.is_err()); +} + +#[tokio::test] +async fn test_get_tx() { + let execution = get_client(); + let tx_hash = + H256::from_str("2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f").unwrap(); + + let mut payload = ExecutionPayload::default(); + payload.transactions.push(List::from_iter(hex_str_to_bytes("0x02f8b20583623355849502f900849502f91082ea6094326c977e6efc84e512bb9c30f76e30c160ed06fb80b844a9059cbb0000000000000000000000007daccf9b3c1ae2fa5c55f1c978aeef700bc83be0000000000000000000000000000000000000000000000001158e460913d00000c080a0e1445466b058b6f883c0222f1b1f3e2ad9bee7b5f688813d86e3fa8f93aa868ca0786d6e7f3aefa8fe73857c65c32e4884d8ba38d0ecfb947fbffb82e8ee80c167").unwrap())); + + let mut payloads = HashMap::new(); + payloads.insert(7530933, payload); + + let tx = execution + .get_transaction(&tx_hash, &payloads) + .await + .unwrap() + .unwrap(); + + assert_eq!(tx.hash(), tx_hash); +} + +#[tokio::test] +async fn test_get_tx_bad_proof() { + let execution = get_client(); + let tx_hash = + H256::from_str("2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f").unwrap(); + + let payload = ExecutionPayload::default(); + let mut payloads = HashMap::new(); + payloads.insert(7530933, payload); + + let tx_res = execution.get_transaction(&tx_hash, &payloads).await; + + assert!(tx_res.is_err()); +} + +#[tokio::test] +async fn test_get_tx_not_included() { + let execution = get_client(); + let tx_hash = + H256::from_str("2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f").unwrap(); + + let payloads = HashMap::new(); + + let tx_opt = execution + .get_transaction(&tx_hash, &payloads) + .await + .unwrap(); + + assert!(tx_opt.is_none()); +} + +#[tokio::test] +async fn test_get_receipt() { + let execution = get_client(); + let tx_hash = + H256::from_str("2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f").unwrap(); + + let mut payload = ExecutionPayload::default(); + + payload.receipts_root = Vector::from_iter( + hex_str_to_bytes("dd82a78eccb333854f0c99e5632906e092d8a49c27a21c25cae12b82ec2a113f") + .unwrap(), + ); + + payload.transactions.push(List::from_iter(hex_str_to_bytes("0x02f8b20583623355849502f900849502f91082ea6094326c977e6efc84e512bb9c30f76e30c160ed06fb80b844a9059cbb0000000000000000000000007daccf9b3c1ae2fa5c55f1c978aeef700bc83be0000000000000000000000000000000000000000000000001158e460913d00000c080a0e1445466b058b6f883c0222f1b1f3e2ad9bee7b5f688813d86e3fa8f93aa868ca0786d6e7f3aefa8fe73857c65c32e4884d8ba38d0ecfb947fbffb82e8ee80c167").unwrap())); + + let mut payloads = HashMap::new(); + payloads.insert(7530933, payload); + + let receipt = execution + .get_transaction_receipt(&tx_hash, &payloads) + .await + .unwrap() + .unwrap(); + + assert_eq!(receipt.transaction_hash, tx_hash); +} + +#[tokio::test] +async fn test_get_receipt_bad_proof() { + let execution = get_client(); + let tx_hash = + H256::from_str("2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f").unwrap(); + + let mut payload = ExecutionPayload::default(); + payload.transactions.push(List::from_iter(hex_str_to_bytes("0x02f8b20583623355849502f900849502f91082ea6094326c977e6efc84e512bb9c30f76e30c160ed06fb80b844a9059cbb0000000000000000000000007daccf9b3c1ae2fa5c55f1c978aeef700bc83be0000000000000000000000000000000000000000000000001158e460913d00000c080a0e1445466b058b6f883c0222f1b1f3e2ad9bee7b5f688813d86e3fa8f93aa868ca0786d6e7f3aefa8fe73857c65c32e4884d8ba38d0ecfb947fbffb82e8ee80c167").unwrap())); + + let mut payloads = HashMap::new(); + payloads.insert(7530933, payload); + + let receipt_res = execution.get_transaction_receipt(&tx_hash, &payloads).await; + + assert!(receipt_res.is_err()); +} + +#[tokio::test] +async fn test_get_receipt_not_included() { + let execution = get_client(); + let tx_hash = + H256::from_str("2dac1b27ab58b493f902dda8b63979a112398d747f1761c0891777c0983e591f").unwrap(); + + let payloads = HashMap::new(); + let receipt_opt = execution + .get_transaction_receipt(&tx_hash, &payloads) + .await + .unwrap(); + + assert!(receipt_opt.is_none()); +} + +#[test] +fn test_get_block() { + let execution = get_client(); + let mut payload = ExecutionPayload::default(); + payload.block_number = 12345; + + let block = execution.get_block(&payload).unwrap(); + + assert_eq!(block.number, 12345); +}