From 69e5ef40fc92e02a563c2dca46d29a2ae724c51a Mon Sep 17 00:00:00 2001 From: Karim Date: Tue, 8 Nov 2022 23:57:08 +0000 Subject: [PATCH 1/4] Eth2Near: minor bug fixes (#843) * Fix contract type enum. * Fix beacon RPC route. * Add versioning for beacon RPC routes. * Move beacon RPC version to config. --- eth2near/eth2-contract-init/src/config.rs | 4 + .../eth2-contract-init/src/init_contract.rs | 5 +- eth2near/eth2near-block-relay-rs/Cargo.toml | 2 +- .../eth2near-block-relay-rs/src/config.rs | 4 + .../src/contract_type.rs | 6 +- .../src/eth2near_relay.rs | 26 +++-- .../src/last_slot_searcher.rs | 17 +++ eth2near/eth2near-block-relay-rs/src/main.rs | 26 +++-- .../eth2near-block-relay-rs/src/test_utils.rs | 6 +- .../eth_rpc_client/src/beacon_rpc_client.rs | 106 ++++++++++++------ .../src/execution_block_proof.rs | 1 + .../hand_made_finality_light_client_update.rs | 3 + 12 files changed, 148 insertions(+), 58 deletions(-) diff --git a/eth2near/eth2-contract-init/src/config.rs b/eth2near/eth2-contract-init/src/config.rs index 7e1ff3150..0dc82674c 100644 --- a/eth2near/eth2-contract-init/src/config.rs +++ b/eth2near/eth2-contract-init/src/config.rs @@ -1,6 +1,7 @@ use contract_wrapper::eth_network::EthNetwork; use contract_wrapper::near_network::NearNetwork; use contract_wrapper::near_rpc_client::NearRPCClient; +use eth_rpc_client::beacon_rpc_client; use reqwest::Url; use serde::Deserialize; use std::io::Read; @@ -51,6 +52,9 @@ pub struct Config { /// The trusted block root for checkpoint for contract initialization /// e.g.: 0x9cd0c5a8392d0659426b12384e8440c147510ab93eeaeccb08435a462d7bb1c7 pub init_block_root: Option, + + // Beacon rpc version (V1_1, V1_2) + pub beacon_rpc_version: beacon_rpc_client::BeaconRPCVersion, } impl Config { diff --git a/eth2near/eth2-contract-init/src/init_contract.rs b/eth2near/eth2-contract-init/src/init_contract.rs index 6b8d92b91..4aba0ca48 100644 --- a/eth2near/eth2-contract-init/src/init_contract.rs +++ b/eth2near/eth2-contract-init/src/init_contract.rs @@ -55,6 +55,7 @@ pub fn init_contract( &config.beacon_endpoint, config.eth_requests_timeout_seconds.unwrap_or(10), config.eth_requests_timeout_seconds.unwrap_or(10), + Some(config.beacon_rpc_version.clone()), ); let eth1_rpc_client = Eth1RPCClient::new(&config.eth1_endpoint); @@ -148,7 +149,7 @@ mod tests { use contract_wrapper::eth_client_contract_trait::EthClientContractTrait; use crate::init_contract::init_contract; use contract_wrapper::near_network::NearNetwork; - use eth_rpc_client::beacon_rpc_client::BeaconRPCClient; + use eth_rpc_client::beacon_rpc_client::{BeaconRPCClient, BeaconRPCVersion}; use crate::config_for_tests::ConfigForTests; const ONE_EPOCH_IN_SLOTS: u64 = 32; @@ -184,6 +185,7 @@ mod tests { max_submitted_blocks_by_account: Some(8000), trusted_signer_account_id: Some(eth_client_contract.get_signer_account_id().to_string()), init_block_root: None, + beacon_rpc_version: BeaconRPCVersion::V1_1, } } @@ -240,6 +242,7 @@ mod tests { &init_config.beacon_endpoint, init_config.eth_requests_timeout_seconds.unwrap_or(10), init_config.eth_requests_timeout_seconds.unwrap_or(10), + None, ); let last_finalized_slot_eth_network = beacon_rpc_client diff --git a/eth2near/eth2near-block-relay-rs/Cargo.toml b/eth2near/eth2near-block-relay-rs/Cargo.toml index 3fa35d8f1..db607ea2d 100644 --- a/eth2near/eth2near-block-relay-rs/Cargo.toml +++ b/eth2near/eth2near-block-relay-rs/Cargo.toml @@ -48,4 +48,4 @@ thread = "*" [dev-dependencies] workspaces = "0.5.0" -eth2-contract-init = { path = "../eth2-contract-init" } \ No newline at end of file +eth2-contract-init = { path = "../eth2-contract-init" } diff --git a/eth2near/eth2near-block-relay-rs/src/config.rs b/eth2near/eth2near-block-relay-rs/src/config.rs index 96fc43516..6a946ed7d 100644 --- a/eth2near/eth2near-block-relay-rs/src/config.rs +++ b/eth2near/eth2near-block-relay-rs/src/config.rs @@ -1,4 +1,5 @@ use crate::contract_type::ContractType; +use eth_rpc_client::beacon_rpc_client::BeaconRPCVersion; use contract_wrapper::eth_network::EthNetwork; use contract_wrapper::near_rpc_client::NearRPCClient; use contract_wrapper::near_network::NearNetwork; @@ -82,6 +83,9 @@ pub struct Config { /// Max number of unfinalized blocks allowed to be stored by one submitter account. /// It is used on initialization of the Eth2 client. pub max_submitted_blocks_by_account: Option, + + // Beacon rpc version (V1_1, V1_2) + pub beacon_rpc_version: BeaconRPCVersion, } impl Config { diff --git a/eth2near/eth2near-block-relay-rs/src/contract_type.rs b/eth2near/eth2near-block-relay-rs/src/contract_type.rs index 443df6922..4533029d3 100644 --- a/eth2near/eth2near-block-relay-rs/src/contract_type.rs +++ b/eth2near/eth2near-block-relay-rs/src/contract_type.rs @@ -1,8 +1,8 @@ +use serde::Deserialize; use std::error::Error; use std::fmt; use std::fmt::{Display, Formatter}; use std::str::FromStr; -use serde::Deserialize; #[derive(Debug, Clone, Deserialize)] pub enum ContractType { @@ -34,8 +34,8 @@ impl Display for ContractType { impl ContractType { pub fn as_str(&self) -> &str { match self { - ContractType::Near => "NEAR", - ContractType::Dao => "DAO", + ContractType::Near => "Near", + ContractType::Dao => "Dao", ContractType::File => "File", } } diff --git a/eth2near/eth2near-block-relay-rs/src/eth2near_relay.rs b/eth2near/eth2near-block-relay-rs/src/eth2near_relay.rs index db6d177e7..d6cc444c0 100644 --- a/eth2near/eth2near-block-relay-rs/src/eth2near_relay.rs +++ b/eth2near/eth2near-block-relay-rs/src/eth2near_relay.rs @@ -1,10 +1,5 @@ -use std::cmp; -use eth_rpc_client::beacon_rpc_client::BeaconRPCClient; use crate::config::Config; -use eth_rpc_client::eth1_rpc_client::Eth1RPCClient; -use eth_rpc_client::hand_made_finality_light_client_update::HandMadeFinalityLightClientUpdate; use crate::last_slot_searcher::LastSlotSearcher; -use contract_wrapper::near_rpc_client::NearRPCClient; use crate::prometheus_metrics; use crate::prometheus_metrics::{ CHAIN_EXECUTION_BLOCK_HEIGHT_ON_ETH, CHAIN_EXECUTION_BLOCK_HEIGHT_ON_NEAR, @@ -12,18 +7,23 @@ use crate::prometheus_metrics::{ FAILS_ON_HEADERS_SUBMISSION, FAILS_ON_UPDATES_SUBMISSION, LAST_ETH_SLOT, LAST_ETH_SLOT_ON_NEAR, LAST_FINALIZED_ETH_SLOT, LAST_FINALIZED_ETH_SLOT_ON_NEAR, }; -use eth_rpc_client::errors::NoBlockForSlotError; +use bitvec::macros::internal::funty::Fundamental; use contract_wrapper::eth_client_contract_trait::EthClientContractTrait; +use contract_wrapper::near_rpc_client::NearRPCClient; +use eth_rpc_client::beacon_rpc_client::BeaconRPCClient; +use eth_rpc_client::errors::NoBlockForSlotError; +use eth_rpc_client::eth1_rpc_client::Eth1RPCClient; +use eth_rpc_client::hand_made_finality_light_client_update::HandMadeFinalityLightClientUpdate; use eth_types::eth2::LightClientUpdate; use eth_types::BlockHeader; use log::{debug, info, trace, warn}; use near_primitives::views::FinalExecutionStatus; +use std::cmp; use std::error::Error; use std::thread; use std::thread::sleep; use std::time::Duration; use std::vec::Vec; -use bitvec::macros::internal::funty::Fundamental; use types::Slot; const ONE_EPOCH_IN_SLOTS: u64 = 32; @@ -112,9 +112,11 @@ impl Eth2NearRelay { &config.beacon_endpoint, config.eth_requests_timeout_seconds, config.state_requests_timeout_seconds, + Some(config.beacon_rpc_version.clone()), ); let next_light_client_update = - Self::get_light_client_update_from_file(config, &beacon_rpc_client).expect("Error on parsing light client update"); + Self::get_light_client_update_from_file(config, &beacon_rpc_client) + .expect("Error on parsing light client update"); let max_submitted_blocks_by_account = eth_contract .get_max_submitted_blocks_by_account() @@ -715,12 +717,12 @@ impl Eth2NearRelay { #[cfg(test)] mod tests { - use eth_rpc_client::beacon_rpc_client::BeaconRPCClient; use crate::config_for_tests::ConfigForTests; use crate::eth2near_relay::{Eth2NearRelay, ONE_EPOCH_IN_SLOTS}; - use eth_rpc_client::hand_made_finality_light_client_update::HandMadeFinalityLightClientUpdate; - use eth_rpc_client::errors::NoBlockForSlotError; use crate::test_utils::{get_relay, get_relay_from_slot, get_relay_with_update_from_file}; + use eth_rpc_client::beacon_rpc_client::BeaconRPCClient; + use eth_rpc_client::errors::NoBlockForSlotError; + use eth_rpc_client::hand_made_finality_light_client_update::HandMadeFinalityLightClientUpdate; use eth_types::eth2::LightClientUpdate; use eth_types::BlockHeader; use std::thread::sleep; @@ -1010,6 +1012,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); if let Err(err) = relay.get_execution_block_by_slot(config_for_test.slot_without_block) { if err.downcast_ref::().is_some() { @@ -1191,6 +1194,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); relay diff --git a/eth2near/eth2near-block-relay-rs/src/last_slot_searcher.rs b/eth2near/eth2near-block-relay-rs/src/last_slot_searcher.rs index 71d09947c..e59095c64 100644 --- a/eth2near/eth2near-block-relay-rs/src/last_slot_searcher.rs +++ b/eth2near/eth2near-block-relay-rs/src/last_slot_searcher.rs @@ -471,6 +471,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -527,6 +528,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -603,6 +605,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -656,6 +659,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -719,6 +723,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -794,6 +799,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -814,6 +820,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); last_slot_searcher .linear_slot_search( @@ -835,6 +842,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -911,6 +919,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); if last_slot_searcher .binsearch_slot_range( @@ -937,6 +946,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -1014,6 +1024,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); if last_slot_searcher .binsearch_slot_forward( @@ -1040,6 +1051,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let last_slot_searcher = LastSlotSearcher::new(true); @@ -1127,6 +1139,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); if last_slot_searcher .binary_slot_search( @@ -1151,6 +1164,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let mut last_slot_searcher = LastSlotSearcher::new(true); @@ -1196,6 +1210,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); if last_slot_searcher .get_last_slot( @@ -1218,6 +1233,7 @@ mod tests { &config_for_test.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let mut last_slot_searcher = LastSlotSearcher::new(true); @@ -1264,6 +1280,7 @@ mod tests { "http://httpstat.us/504/", TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); if last_slot_searcher .get_last_slot( diff --git a/eth2near/eth2near-block-relay-rs/src/main.rs b/eth2near/eth2near-block-relay-rs/src/main.rs index 0b3b85cf0..f7ec8f42b 100644 --- a/eth2near/eth2near-block-relay-rs/src/main.rs +++ b/eth2near/eth2near-block-relay-rs/src/main.rs @@ -6,6 +6,7 @@ use contract_wrapper::{ dao_contract, dao_eth_client_contract, eth_client_contract, file_eth_client_contract, }; use eth2_to_near_relay::config::Config; +use eth2_to_near_relay::contract_type::ContractType; use eth2_to_near_relay::eth2near_relay::Eth2NearRelay; use eth2near_logger::SimpleLogger; use log::LevelFilter; @@ -47,7 +48,8 @@ fn get_dao_contract_wrapper(config: &Config) -> Box { &config.near_endpoint, &config.signer_account_id, &config.path_to_signer_secret_key, - &dao_contract_account_id.expect("No DAO contract account ID provided for relay running in DAO mode"), + &dao_contract_account_id + .expect("No DAO contract account ID provided for relay running in DAO mode"), )) } @@ -55,21 +57,24 @@ fn get_eth_client_contract(config: &Config) -> Box { let eth_contract_wrapper = get_eth_contract_wrapper(config); let eth_client = eth_client_contract::EthClientContract::new(eth_contract_wrapper); - match config.contract_type.as_str() { - "dao" => Box::new(dao_eth_client_contract::DaoEthClientContract::new( + match config.contract_type { + ContractType::Dao => Box::new(dao_eth_client_contract::DaoEthClientContract::new( eth_client, dao_contract::DAOContract::new(get_dao_contract_wrapper(config)), )), - "file" => Box::new(file_eth_client_contract::FileEthClientContract::new( + ContractType::File => Box::new(file_eth_client_contract::FileEthClientContract::new( eth_client, - config.output_dir.clone().expect("No output dir provided for relay running in FILE mode"), + config + .output_dir + .clone() + .expect("No output dir provided for relay running in FILE mode"), )), - _ => Box::new(eth_client), + ContractType::Near => Box::new(eth_client), } } fn init_log(args: &Arguments, config: &Config) { - let log_level_filter = match args.log_level.as_str() { + let log_level_filter = match args.log_level.to_lowercase().as_str() { "trace" => LevelFilter::Trace, "debug" => LevelFilter::Debug, "warn" => LevelFilter::Warn, @@ -90,7 +95,12 @@ fn init_log(args: &Arguments, config: &Config) { fn main() -> Result<(), Box> { let args = Arguments::parse(); - let config = Config::load_from_toml(args.config.clone().try_into().expect("Error on config parsing")); + let config = Config::load_from_toml( + args.config + .clone() + .try_into() + .expect("Error on config parsing"), + ); init_log(&args, &config); let mut eth2near_relay = Eth2NearRelay::init( diff --git a/eth2near/eth2near-block-relay-rs/src/test_utils.rs b/eth2near/eth2near-block-relay-rs/src/test_utils.rs index 5488afcd7..0835b7733 100644 --- a/eth2near/eth2near-block-relay-rs/src/test_utils.rs +++ b/eth2near/eth2near-block-relay-rs/src/test_utils.rs @@ -1,4 +1,4 @@ -use eth_rpc_client::beacon_rpc_client::BeaconRPCClient; +use eth_rpc_client::beacon_rpc_client::{BeaconRPCClient, BeaconRPCVersion}; use crate::config::Config; use crate::config_for_tests::ConfigForTests; use eth_rpc_client::eth1_rpc_client::Eth1RPCClient; @@ -108,7 +108,7 @@ pub fn init_contract_from_specific_slot( .unwrap(); let beacon_rpc_client = - BeaconRPCClient::new(&config_for_test.beacon_endpoint, TIMEOUT, TIMEOUT_STATE); + BeaconRPCClient::new(&config_for_test.beacon_endpoint, TIMEOUT, TIMEOUT_STATE, None); let eth1_rpc_client = Eth1RPCClient::new(&config_for_test.eth1_endpoint); let finality_header = beacon_rpc_client @@ -203,6 +203,7 @@ fn get_config(config_for_test: &ConfigForTests) -> Config { sleep_time_after_submission_secs: 5, hashes_gc_threshold: None, max_submitted_blocks_by_account: None, + beacon_rpc_version: BeaconRPCVersion::V1_1, } } @@ -227,6 +228,7 @@ fn get_init_config( max_submitted_blocks_by_account: Some(8000), trusted_signer_account_id: Some(eth_client_contract.get_signer_account_id().to_string()), init_block_root: None, + beacon_rpc_version: BeaconRPCVersion::V1_1, } } diff --git a/eth2near/eth_rpc_client/src/beacon_rpc_client.rs b/eth2near/eth_rpc_client/src/beacon_rpc_client.rs index 0611baa01..537a73704 100644 --- a/eth2near/eth_rpc_client/src/beacon_rpc_client.rs +++ b/eth2near/eth_rpc_client/src/beacon_rpc_client.rs @@ -1,7 +1,10 @@ +use crate::errors::{ + ErrorOnJsonParse, ExecutionPayloadError, FailOnGettingJson, MissSyncAggregationError, + NoBlockForSlotError, SignatureSlotNotFoundError, +}; use crate::execution_block_proof::ExecutionBlockProof; -use crate::errors::{ErrorOnJsonParse, ExecutionPayloadError, FailOnGettingJson, MissSyncAggregationError, NoBlockForSlotError, SignatureSlotNotFoundError}; -use crate::utils; use crate::light_client_snapshot_with_proof::LightClientSnapshotWithProof; +use crate::utils; use eth_types::eth2::BeaconBlockHeader; use eth_types::eth2::FinalizedHeaderUpdate; use eth_types::eth2::HeaderUpdate; @@ -13,6 +16,7 @@ use eth_types::eth2::SyncCommitteeUpdate; use eth_types::H256; use log::trace; use reqwest::blocking::Client; +use serde::Deserialize; use serde_json::{json, Value}; use std::error::Error; use std::string::String; @@ -20,6 +24,46 @@ use std::time::Duration; use types::MainnetEthSpec; use types::{BeaconBlockBody, BeaconState}; +#[derive(Debug, Clone, Deserialize)] +pub enum BeaconRPCVersion { + V1_1, + V1_2, +} + +struct BeaconRPCRoutes { + pub get_block_header: String, + pub get_block: String, + pub get_light_client_update: String, + pub get_light_client_finality_update: String, + pub get_bootstrap: String, + pub get_state: String, +} + +impl BeaconRPCRoutes { + pub fn new(version: BeaconRPCVersion) -> Self { + match version { + BeaconRPCVersion::V1_1 => Self { + get_block_header: "eth/v1/beacon/headers".to_string(), + get_block: "eth/v2/beacon/blocks".to_string(), + get_light_client_update: "eth/v1/beacon/light_client/updates".to_string(), + get_light_client_finality_update: "eth/v1/beacon/light_client/finality_update/" + .to_string(), + get_bootstrap: "eth/v1/beacon/light_client/bootstrap".to_string(), + get_state: "eth/v2/debug/beacon/states".to_string(), + }, + BeaconRPCVersion::V1_2 => Self { + get_block_header: "eth/v1/beacon/headers".to_string(), + get_block: "eth/v2/beacon/blocks".to_string(), + get_light_client_update: "eth/v1/beacon/light_client/updates".to_string(), + get_light_client_finality_update: "eth/v1/beacon/light_client/finality_update" + .to_string(), + get_bootstrap: "eth/v1/beacon/light_client/bootstrap".to_string(), + get_state: "eth/v2/debug/beacon/states".to_string(), + }, + } + } +} + /// `BeaconRPCClient` allows getting beacon block body, beacon block header /// and light client updates /// using Beacon RPC API (https://ethereum.github.io/beacon-APIs/) @@ -27,22 +71,20 @@ pub struct BeaconRPCClient { endpoint_url: String, client: Client, client_state_request: Client, + routes: BeaconRPCRoutes, } impl BeaconRPCClient { - const URL_HEADER_PATH: &'static str = "eth/v1/beacon/headers"; - const URL_BODY_PATH: &'static str = "eth/v2/beacon/blocks"; - const URL_GET_LIGHT_CLIENT_UPDATE_API: &'static str = "eth/v1/beacon/light_client/updates"; - const URL_FINALITY_LIGHT_CLIENT_UPDATE_PATH: &'static str = - "eth/v1/beacon/light_client/finality_update/"; - const URL_GET_BOOTSTRAP: &'static str = "eth/v1/beacon/light_client/bootstrap"; - const URL_STATE_PATH: &'static str = "eth/v2/debug/beacon/states"; - const SLOTS_PER_EPOCH: u64 = 32; const EPOCHS_PER_PERIOD: u64 = 256; /// Creates `BeaconRPCClient` for the given BeaconAPI `endpoint_url` - pub fn new(endpoint_url: &str, timeout_seconds: u64, timeout_state_seconds: u64) -> Self { + pub fn new( + endpoint_url: &str, + timeout_seconds: u64, + timeout_state_seconds: u64, + version: Option, + ) -> Self { Self { endpoint_url: endpoint_url.to_string(), client: reqwest::blocking::Client::builder() @@ -53,6 +95,7 @@ impl BeaconRPCClient { .timeout(Duration::from_secs(timeout_state_seconds)) .build() .expect("Error on building blocking client for state request."), + routes: BeaconRPCRoutes::new(version.unwrap_or(BeaconRPCVersion::V1_1)), } } @@ -67,7 +110,10 @@ impl BeaconRPCClient { &self, block_id: &str, ) -> Result, Box> { - let url = format!("{}/{}/{}", self.endpoint_url, Self::URL_BODY_PATH, block_id); + let url = format!( + "{}/{}/{}", + self.endpoint_url, self.routes.get_block, block_id + ); let json_str = &self.get_json_from_raw_request(&url)?; @@ -90,9 +136,7 @@ impl BeaconRPCClient { ) -> Result> { let url = format!( "{}/{}/{}", - self.endpoint_url, - Self::URL_HEADER_PATH, - block_id + self.endpoint_url, self.routes.get_block_header, block_id ); let json_str = &self.get_json_from_raw_request(&url)?; @@ -113,9 +157,7 @@ impl BeaconRPCClient { ) -> Result> { let url = format!( "{}/{}?start_period={}&count=1", - self.endpoint_url, - Self::URL_GET_LIGHT_CLIENT_UPDATE_API, - period + self.endpoint_url, self.routes.get_light_client_update, period ); let light_client_update_json_str = self.get_json_from_raw_request(&url)?; @@ -147,9 +189,7 @@ impl BeaconRPCClient { ) -> Result> { let url = format!( "{}/{}/{}", - self.endpoint_url, - Self::URL_GET_BOOTSTRAP, - block_root + self.endpoint_url, self.routes.get_bootstrap, block_root ); let light_client_snapshot_json_str = self.get_json_from_raw_request(&url)?; @@ -200,9 +240,7 @@ impl BeaconRPCClient { let url = format!( "{}/{}/{}", - self.endpoint_url, - Self::URL_BODY_PATH, - beacon_block_hash_str + self.endpoint_url, self.routes.get_block, beacon_block_hash_str ); let block_json_str = &self.get_json_from_raw_request(&url)?; let v: Value = serde_json::from_str(block_json_str)?; @@ -223,8 +261,7 @@ impl BeaconRPCClient { pub fn get_finality_light_client_update(&self) -> Result> { let url = format!( "{}/{}", - self.endpoint_url, - Self::URL_FINALITY_LIGHT_CLIENT_UPDATE_PATH + self.endpoint_url, self.routes.get_light_client_finality_update, ); let light_client_update_json_str = self.get_json_from_raw_request(&url)?; @@ -265,9 +302,7 @@ impl BeaconRPCClient { ) -> Result, Box> { let url_request = format!( "{}/{}/{}", - self.endpoint_url, - Self::URL_STATE_PATH, - state_id + self.endpoint_url, self.routes.get_state, state_id ); let json_str = Self::get_json_from_client(&self.client_state_request, &url_request)?; @@ -486,11 +521,11 @@ mod tests { use crate::beacon_rpc_client::BeaconRPCClient; use crate::config_for_tests::ConfigForTests; use crate::utils::read_json_file_from_data_dir; + use crate::utils::trim_quotes; use serde_json::Value; use types::BeaconBlockBody; use types::BeaconBlockHeader; use types::MainnetEthSpec; - use crate::utils::trim_quotes; const TIMEOUT_SECONDS: u64 = 30; const TIMEOUT_STATE_SECONDS: u64 = 1000; @@ -553,7 +588,8 @@ mod tests { "{}/eth/v2/beacon/blocks/{}", config.beacon_endpoint, config.first_slot ); - let beacon_rpc_client = BeaconRPCClient::new(&url, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS); + let beacon_rpc_client = + BeaconRPCClient::new(&url, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, None); let rpc_json_str = beacon_rpc_client.get_json_from_raw_request(&url); assert_eq!(rpc_json_str.unwrap(), file_json_str.trim()); } @@ -566,6 +602,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ) .get_beacon_block_body_for_block_id(&config.first_slot.to_string()) .unwrap(); @@ -573,6 +610,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ) .get_beacon_block_header_for_block_id(&config.first_slot.to_string()) .unwrap(); @@ -585,6 +623,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ) .get_beacon_block_header_for_block_id(&format!("{}", config.first_slot)) .unwrap(); @@ -627,6 +666,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ) .get_beacon_block_body_for_block_id(&config.first_slot.to_string()) .unwrap(); @@ -652,7 +692,8 @@ mod tests { assert!(!BeaconRPCClient::new( "https://lodestar-goerli.chainsafe.io", TIMEOUT_SECONDS, - TIMEOUT_STATE_SECONDS + TIMEOUT_STATE_SECONDS, + None ) .is_syncing() .unwrap()); @@ -699,6 +740,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let file_json_str = std::fs::read_to_string(&config.path_to_light_client_update) .expect("Unable to read file"); diff --git a/eth2near/eth_rpc_client/src/execution_block_proof.rs b/eth2near/eth_rpc_client/src/execution_block_proof.rs index 7ee19d96f..51cb9e24a 100644 --- a/eth2near/eth_rpc_client/src/execution_block_proof.rs +++ b/eth2near/eth_rpc_client/src/execution_block_proof.rs @@ -218,6 +218,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let beacon_block_body = beacon_rpc_client diff --git a/eth2near/eth_rpc_client/src/hand_made_finality_light_client_update.rs b/eth2near/eth_rpc_client/src/hand_made_finality_light_client_update.rs index bf85821de..74aa4e617 100644 --- a/eth2near/eth_rpc_client/src/hand_made_finality_light_client_update.rs +++ b/eth2near/eth_rpc_client/src/hand_made_finality_light_client_update.rs @@ -373,6 +373,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let light_client_period = @@ -409,6 +410,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let hand_made_light_client_update = HandMadeFinalityLightClientUpdate::get_finality_light_client_update_from_file( @@ -435,6 +437,7 @@ mod tests { &config.beacon_endpoint, TIMEOUT_SECONDS, TIMEOUT_STATE_SECONDS, + None, ); let hand_made_light_client_update = HandMadeFinalityLightClientUpdate::get_light_client_update_from_file_with_next_sync_committee( From 3e859904f445105850c2a08b5a4b0fdc7680c841 Mon Sep 17 00:00:00 2001 From: Alexey Lapitsky Date: Wed, 30 Nov 2022 14:07:02 +0100 Subject: [PATCH 2/4] chore(backstage): client-eth2.bridge.near address (#847) Add the new client address --- contracts/near/eth-client/.catalog-info.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/near/eth-client/.catalog-info.yaml b/contracts/near/eth-client/.catalog-info.yaml index 860d853cd..c718efb16 100644 --- a/contracts/near/eth-client/.catalog-info.yaml +++ b/contracts/near/eth-client/.catalog-info.yaml @@ -17,5 +17,6 @@ spec: system: bridge-protocol deployedAt: - contract:near/mainnet/client.bridge.near + - contract:near/mainnet/client-eth2.bridge.near interactsWith: - relayer:near/mainnet/relayer.bridge.near From aef936406ce3a03c551d91df901761931e57e255 Mon Sep 17 00:00:00 2001 From: Alexey Lapitsky Date: Sat, 21 Jan 2023 23:17:33 +0100 Subject: [PATCH 3/4] chore(backstage): updated schema for deprecated contracts (#864) --- contracts/eth/nearbridge/.catalog-info.yaml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/eth/nearbridge/.catalog-info.yaml b/contracts/eth/nearbridge/.catalog-info.yaml index cddc1774c..5ed91d74e 100644 --- a/contracts/eth/nearbridge/.catalog-info.yaml +++ b/contracts/eth/nearbridge/.catalog-info.yaml @@ -42,7 +42,8 @@ spec: lifecycle: production system: bridge-protocol deployedAt: - - contract-deprecated:ethereum/mainnet/0x3be7df8db39996a837041bb8ee0dadf60f767038 - contract:ethereum/mainnet/0x3FEFc5A4B1c02f21cBc8D3613643ba0635b9a873 interactsWith: - relayer:ethereum/mainnet/0x015e634c7c1311a9034220c28d3d12b7f710a3b1 + deprecated: + - contract:ethereum/mainnet/0x3be7df8db39996a837041bb8ee0dadf60f767038 From d8e3def0cf2e07d5a840796ea4b3ef063a1c1e04 Mon Sep 17 00:00:00 2001 From: Karim Date: Thu, 16 Feb 2023 03:13:54 +0200 Subject: [PATCH 4/4] Fix prover unit tests and disable integration tests (#876) Co-authored-by: Kirill --- .github/workflows/contracts-near.yml | 6 + contracts/near/Cargo.lock | 1138 +---------------- contracts/near/eth-client/src/tests.rs | 6 +- contracts/near/eth-prover/Cargo.toml | 6 +- contracts/near/eth-prover/src/tests.rs | 38 +- contracts/near/eth-prover/test.sh | 1 + .../{tests => tests_ignore}/spec.rs | 0 .../{tests => tests_ignore}/utils.rs | 0 contracts/near/eth2-client/test.sh | 1 + contracts/near/res/eth_prover.wasm | Bin 177265 -> 178585 bytes 10 files changed, 98 insertions(+), 1098 deletions(-) rename contracts/near/eth-prover/{tests => tests_ignore}/spec.rs (100%) rename contracts/near/eth-prover/{tests => tests_ignore}/utils.rs (100%) diff --git a/.github/workflows/contracts-near.yml b/.github/workflows/contracts-near.yml index 5023c8f7a..a276db210 100644 --- a/.github/workflows/contracts-near.yml +++ b/.github/workflows/contracts-near.yml @@ -28,6 +28,12 @@ jobs: fi timeout-minutes: 40 + - job-name: test eth-prover + cmd: | + cd contracts/near/eth-prover + ./test.sh + timeout-minutes: 40 + - job-name: test eth-client cmd: | cd contracts/near/eth-client diff --git a/contracts/near/Cargo.lock b/contracts/near/Cargo.lock index 8064fa9e2..f3f019c17 100644 --- a/contracts/near/Cargo.lock +++ b/contracts/near/Cargo.lock @@ -100,15 +100,6 @@ name = "amcl" version = "0.3.0" source = "git+https://github.com/sigp/milagro_bls?tag=v1.4.2#16655aa033175a90c10ef02aa144e2835de23aec" -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "anyhow" version = "1.0.58" @@ -218,17 +209,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi 0.3.9", -] - [[package]] name = "autocfg" version = "0.1.7" @@ -304,40 +284,6 @@ dependencies = [ "zip", ] -[[package]] -name = "bincode" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5753e2a71534719bf3f4e57006c3a4f0d2c672a4b676eec84161f763eca87dbf" -dependencies = [ - "byteorder", - "serde", -] - -[[package]] -name = "bindgen" -version = "0.53.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c72a978d268b1d70b0e963217e60fdabd9523a941457a6c42a7315d15c7e89e5" -dependencies = [ - "bitflags 1.2.1", - "cexpr", - "cfg-if 0.1.10", - "clang-sys", - "clap", - "env_logger", - "lazy_static", - "lazycell", - "log 0.4.17", - "peeking_take_while", - "proc-macro2 1.0.39", - "quote 1.0.18", - "regex", - "rustc-hash", - "shlex", - "which", -] - [[package]] name = "bitflags" version = "0.9.1" @@ -384,25 +330,13 @@ dependencies = [ "wyz 0.5.0", ] -[[package]] -name = "blake2" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94cb07b0da6a73955f8fb85d24c466778e70cda767a568229b104f0264089330" -dependencies = [ - "byte-tools", - "crypto-mac 0.7.0", - "digest 0.8.1", - "opaque-debug 0.2.3", -] - [[package]] name = "blake2" version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" dependencies = [ - "crypto-mac 0.8.0", + "crypto-mac", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -418,21 +352,6 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "blake3" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "423897d97e11b810c9da22458400b28ec866991c711409073662eb34dc44bfff" -dependencies = [ - "arrayref", - "arrayvec 0.5.1", - "cc", - "cfg-if 0.1.10", - "constant_time_eq", - "crypto-mac 0.7.0", - "digest 0.8.1", -] - [[package]] name = "block-buffer" version = "0.7.3" @@ -505,60 +424,29 @@ dependencies = [ "zeroize", ] -[[package]] -name = "borsh" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7769f8f6fdc6ac7617bbc8bc7ef9dc263cd459d99d21cf2ab4afc3bc8d7d70d" -dependencies = [ - "borsh-derive 0.6.2", -] - [[package]] name = "borsh" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" dependencies = [ - "borsh-derive 0.9.3", + "borsh-derive", "hashbrown 0.11.2", ] -[[package]] -name = "borsh-derive" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2689a82a5fe57f9e71997b16bea340da338c7fb8db400b8d9d55b59010540d8" -dependencies = [ - "borsh-derive-internal 0.6.2", - "borsh-schema-derive-internal 0.6.2", - "syn 1.0.96", -] - [[package]] name = "borsh-derive" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" dependencies = [ - "borsh-derive-internal 0.9.3", - "borsh-schema-derive-internal 0.9.3", + "borsh-derive-internal", + "borsh-schema-derive-internal", "proc-macro-crate 0.1.5", "proc-macro2 1.0.39", "syn 1.0.96", ] -[[package]] -name = "borsh-derive-internal" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39b621f19e9891a34f679034fa2238260e27c0eddfe2804e9fb282061cf9b294" -dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", -] - [[package]] name = "borsh-derive-internal" version = "0.9.3" @@ -570,17 +458,6 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "borsh-schema-derive-internal" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "befebdb9e223ae4528b3d597dbbfb5c68566822d2a3de3e260f235360773ba29" -dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", -] - [[package]] name = "borsh-schema-derive-internal" version = "0.9.3" @@ -592,12 +469,6 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "bs58" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" - [[package]] name = "bs58" version = "0.4.0" @@ -678,17 +549,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "c2-chacha" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "217192c943108d8b13bac38a1d51df9ce8a407a3f5a71ab633980665e68fbd9a" -dependencies = [ - "byteorder", - "ppv-lite86", - "stream-cipher", -] - [[package]] name = "c2-chacha" version = "0.3.3" @@ -705,32 +565,11 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" -[[package]] -name = "cached" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "083dc50149e37dfaab1ffe2c3af03576b79550f1e419a5091b28a7191db1c45b" -dependencies = [ - "once_cell", -] - [[package]] name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cexpr" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4aedb84272dbe89af497cf81375129abda4fc0a9e7c5d317498c15cc30c0d27" -dependencies = [ - "nom", -] [[package]] name = "cfg-if" @@ -767,32 +606,6 @@ dependencies = [ "generic-array 0.14.4", ] -[[package]] -name = "clang-sys" -version = "0.29.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6837df1d5cba2397b835c8530f51723267e16abbf83892e9e5af4f0e5dd10a" -dependencies = [ - "glob", - "libc", - "libloading", -] - -[[package]] -name = "clap" -version = "2.33.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfa80d47f954d53a35a64987ca1422f495b8d6483c0fe9f7117b36c2a792129" -dependencies = [ - "ansi_term", - "atty", - "bitflags 1.2.1", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - [[package]] name = "cloudabi" version = "0.0.3" @@ -964,16 +777,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434400df11d95d556bac068ddfedd482915eb18fe8bea89bc80b6e4b1c179e5" -dependencies = [ - "generic-array 0.12.3", - "subtle 1.0.0", -] - [[package]] name = "crypto-mac" version = "0.8.0" @@ -981,7 +784,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" dependencies = [ "generic-array 0.14.4", - "subtle 2.2.3", + "subtle", ] [[package]] @@ -1014,19 +817,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "curve25519-dalek" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d85653f070353a16313d0046f173f70d1aadd5b42600a14de626f0dfb3473a5" -dependencies = [ - "byteorder", - "digest 0.8.1", - "rand_core 0.5.1", - "subtle 2.2.3", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "3.2.0" @@ -1036,7 +826,7 @@ dependencies = [ "byteorder", "digest 0.9.0", "rand_core 0.5.1", - "subtle 2.2.3", + "subtle", "zeroize", ] @@ -1060,7 +850,7 @@ dependencies = [ "ident_case", "proc-macro2 1.0.39", "quote 1.0.18", - "strsim 0.10.0", + "strsim", "syn 1.0.96", ] @@ -1161,31 +951,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "dynasm" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a814e1edeb85dd2a3c6fc0d6bf76d02ca5695d438c70ecee3d90774f3259c5" -dependencies = [ - "bitflags 1.2.1", - "byteorder", - "lazy_static", - "owning_ref", - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", -] - -[[package]] -name = "dynasmrt" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a393aaeb4441a48bcf47b5b6155971f82cc1eb77e22855403ccc0415ac8328d" -dependencies = [ - "byteorder", - "memmap", -] - [[package]] name = "easy-ext" version = "0.2.0" @@ -1211,7 +976,7 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" dependencies = [ - "curve25519-dalek 3.2.0", + "curve25519-dalek", "ed25519", "rand 0.7.3", "serde", @@ -1225,15 +990,6 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -[[package]] -name = "elastic-array" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d63720ea2bc2e1b79f7aa044d9dc0b825f9ccb6930b32120f8fb9e873aa84bc" -dependencies = [ - "heapsize", -] - [[package]] name = "encode_unicode" version = "0.3.6" @@ -1249,40 +1005,6 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "atty", - "humantime", - "log 0.4.17", - "regex", - "termcolor", -] - -[[package]] -name = "errno" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b480f641ccf0faf324e20c1d3e53d81b7484c698b42ea677f6907ae4db195371" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi 0.3.9", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14ca354e36190500e1e1fb267c647932382b54053c50b14970856c0b00a35067" -dependencies = [ - "gcc", - "libc", -] - [[package]] name = "error-chain" version = "0.12.2" @@ -1298,7 +1020,7 @@ version = "0.1.0" dependencies = [ "admin-controlled", "arrutil", - "borsh 0.9.3", + "borsh", "eth-types", "ethash", "futures", @@ -1320,26 +1042,24 @@ name = "eth-prover" version = "0.1.0" dependencies = [ "admin-controlled", - "borsh 0.9.3", + "borsh", "eth-types", "hex 0.4.2", "indicatif", "lazy_static", - "near-crypto 0.1.0", - "near-primitives 0.1.0", - "near-runtime-standalone", + "near-crypto 0.14.0", + "near-primitives 0.14.0", "near-sdk", "rlp", "serde", "serde_json", - "wee_alloc", ] [[package]] name = "eth-types" version = "0.1.0" dependencies = [ - "borsh 0.9.3", + "borsh", "derive_more 0.99.17", "eth2_serde_utils", "eth2_ssz", @@ -1363,7 +1083,7 @@ dependencies = [ "anyhow", "bitvec 1.0.0", "bls", - "borsh 0.9.3", + "borsh", "eth-types", "eth2-utility", "ethereum-types 0.9.2", @@ -1383,7 +1103,7 @@ name = "eth2-utility" version = "0.1.0" dependencies = [ "bitvec 1.0.0", - "borsh 0.9.3", + "borsh", "eth-types", "ethereum-types 0.9.2", "hex 0.4.2", @@ -1543,12 +1263,6 @@ dependencies = [ "synstructure", ] -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - [[package]] name = "fastrand" version = "1.8.0" @@ -1648,12 +1362,6 @@ dependencies = [ "percent-encoding 2.1.0", ] -[[package]] -name = "fs_extra" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2a4a2034423744d2cc7ca2068453168dcdb82c438419e639a26bd87839c674" - [[package]] name = "fuchsia-cprng" version = "0.1.1" @@ -1764,12 +1472,6 @@ dependencies = [ "pin-utils", ] -[[package]] -name = "gcc" -version = "0.3.55" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2" - [[package]] name = "generic-array" version = "0.12.3" @@ -1819,12 +1521,6 @@ version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - [[package]] name = "h2" version = "0.1.26" @@ -1892,15 +1588,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "heck" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -dependencies = [ - "unicode-segmentation", -] - [[package]] name = "heck" version = "0.4.0" @@ -1994,15 +1681,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - [[package]] name = "hyper" version = "0.10.16" @@ -2130,12 +1808,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "if_chain" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3360c7b59e5ffa2653671fb74b4741a5d343c03f331c0a4aeda42b5c2b0ec7d" - [[package]] name = "impl-codec" version = "0.2.0" @@ -2209,7 +1881,6 @@ checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg 1.1.0", "hashbrown 0.12.2", - "serde", ] [[package]] @@ -2269,36 +1940,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" -[[package]] -name = "jemalloc-sys" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d3b9f3f5c9b31aa0f5ed3260385ac205db665baa41d49bb8338008ae94ede45" -dependencies = [ - "cc", - "fs_extra", - "libc", -] - -[[package]] -name = "jemallocator" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43ae63fcfc45e99ab3d1b29a46782ad679e98436c3169d15a167a1108a724b69" -dependencies = [ - "jemalloc-sys", - "libc", -] - -[[package]] -name = "jobserver" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c71313ebb9439f74b00d9d2dcec36440beaf57a6aa0623068441dd7cd81a7f2" -dependencies = [ - "libc", -] - [[package]] name = "js-sys" version = "0.3.59" @@ -2349,40 +1990,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f" - [[package]] name = "libc" version = "0.2.126" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836" -[[package]] -name = "libloading" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b111a074963af1d37a139918ac6d49ad1d0d5e47f72fd55388619691a7d753" -dependencies = [ - "cc", - "winapi 0.3.9", -] - -[[package]] -name = "librocksdb-sys" -version = "6.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883213ae3d09bfc3d104aefe94b25ebb183b6f4d3a515b23b14817e1f4854005" -dependencies = [ - "bindgen", - "cc", - "glob", - "libc", -] - [[package]] name = "libz-sys" version = "1.1.8" @@ -2459,16 +2072,6 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" -[[package]] -name = "memmap" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" -dependencies = [ - "libc", - "winapi 0.3.9", -] - [[package]] name = "memoffset" version = "0.5.4" @@ -2609,7 +2212,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de83d74a9241be8cc4eb3055216966b58bf8c463e8e285c0dc553925acdd19fa" dependencies = [ - "borsh 0.9.3", + "borsh", "serde", ] @@ -2619,7 +2222,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71d258582a1878e6db67400b0504a5099db85718d22c2e07f747fe1706ae7150" dependencies = [ - "borsh 0.9.3", + "borsh", "serde", ] @@ -2634,7 +2237,7 @@ dependencies = [ "derive_more 0.99.17", "near-crypto 0.14.0", "near-primitives 0.14.0", - "num-rational 0.3.2", + "num-rational", "serde", "serde_json", "sha2 0.10.2", @@ -2681,34 +2284,10 @@ dependencies = [ "near-primitives 0.14.0", "serde", "serde_json", - "strum 0.24.1", + "strum", "thiserror", ] -[[package]] -name = "near-crypto" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "arrayref", - "blake2 0.8.1", - "borsh 0.6.2", - "bs58 0.3.1", - "c2-chacha 0.2.4", - "curve25519-dalek 2.1.0", - "digest 0.8.1", - "ed25519-dalek", - "lazy_static", - "libc", - "parity-secp256k1", - "rand 0.7.3", - "rand_core 0.5.1", - "serde", - "serde_json", - "sha2 0.8.2", - "subtle 2.2.3", -] - [[package]] name = "near-crypto" version = "0.13.0" @@ -2716,11 +2295,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8ecf0b8b31aa7f4e60f629f72213a2617ca4a5f45cd1ae9ed2cf7cecfebdbb7" dependencies = [ "arrayref", - "blake2 0.9.2", - "borsh 0.9.3", - "bs58 0.4.0", - "c2-chacha 0.3.3", - "curve25519-dalek 3.2.0", + "blake2", + "borsh", + "bs58", + "c2-chacha", + "curve25519-dalek", "derive_more 0.99.17", "ed25519-dalek", "libc", @@ -2732,7 +2311,7 @@ dependencies = [ "rand_core 0.5.1", "serde", "serde_json", - "subtle 2.2.3", + "subtle", "thiserror", ] @@ -2743,11 +2322,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e75673d69fd7365508f3d32483669fe45b03bfb34e4d9363e90adae9dfb416c" dependencies = [ "arrayref", - "blake2 0.9.2", - "borsh 0.9.3", - "bs58 0.4.0", - "c2-chacha 0.3.3", - "curve25519-dalek 3.2.0", + "blake2", + "borsh", + "bs58", + "c2-chacha", + "curve25519-dalek", "derive_more 0.99.17", "ed25519-dalek", "near-account-id 0.14.0", @@ -2758,7 +2337,7 @@ dependencies = [ "rand_core 0.5.1", "serde", "serde_json", - "subtle 2.2.3", + "subtle", "thiserror", ] @@ -2768,7 +2347,7 @@ version = "0.4.0-beta.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bba462f54bc35289a1013ed3a2ebfa67cc8b12699f81c12dd67687f200c7b871" dependencies = [ - "borsh 0.9.3", + "borsh", "lazy_static", "log 0.4.17", "near-chain-configs", @@ -2799,16 +2378,6 @@ dependencies = [ "uuid", ] -[[package]] -name = "near-metrics" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "lazy_static", - "log 0.4.17", - "prometheus", -] - [[package]] name = "near-network-primitives" version = "0.14.0" @@ -2817,65 +2386,23 @@ checksum = "5aa998a1e70ebf8cf3efa76c4562ef36038cc88b4aee60efb708d14273910357" dependencies = [ "actix", "anyhow", - "borsh 0.9.3", + "borsh", "chrono", "near-crypto 0.14.0", "near-primitives 0.14.0", "serde", - "strum 0.24.1", + "strum", "tokio 1.20.1", "tracing", ] -[[package]] -name = "near-pool" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "borsh 0.6.2", - "near-crypto 0.1.0", - "near-primitives 0.1.0", - "rand 0.7.3", -] - -[[package]] -name = "near-primitives" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "base64 0.11.0", - "borsh 0.6.2", - "bs58 0.3.1", - "byteorder", - "chrono", - "derive_more 0.99.17", - "easy-ext", - "hex 0.4.2", - "jemallocator", - "lazy_static", - "near-crypto 0.1.0", - "near-rpc-error-macro 0.1.0", - "near-vm-errors 0.9.1", - "num-rational 0.2.4", - "primitive-types 0.7.2", - "rand 0.7.3", - "reed-solomon-erasure", - "regex", - "serde", - "serde_json", - "sha2 0.8.2", - "smart-default", - "validator", - "validator_derive", -] - [[package]] name = "near-primitives" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a2ba19282e79a4485a77736b679d276b09870bbf8042a18e0f0ae36347489c5" dependencies = [ - "borsh 0.9.3", + "borsh", "byteorder", "bytesize", "chrono", @@ -2886,7 +2413,7 @@ dependencies = [ "near-primitives-core 0.13.0", "near-rpc-error-macro 0.13.0", "near-vm-errors 0.13.0", - "num-rational 0.3.2", + "num-rational", "once_cell", "primitive-types 0.10.1", "rand 0.7.3", @@ -2894,7 +2421,7 @@ dependencies = [ "serde", "serde_json", "smart-default", - "strum 0.24.1", + "strum", "thiserror", ] @@ -2904,7 +2431,7 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ad1a9a1640539c81f065425c31bffcfbf6b31ef1aeaade59ce905f5df6ac860" dependencies = [ - "borsh 0.9.3", + "borsh", "byteorder", "bytesize", "chrono", @@ -2915,7 +2442,7 @@ dependencies = [ "near-primitives-core 0.14.0", "near-rpc-error-macro 0.14.0", "near-vm-errors 0.14.0", - "num-rational 0.3.2", + "num-rational", "once_cell", "primitive-types 0.10.1", "rand 0.7.3", @@ -2923,7 +2450,7 @@ dependencies = [ "serde", "serde_json", "smart-default", - "strum 0.24.1", + "strum", "thiserror", ] @@ -2934,14 +2461,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb561feb392bb8c4f540256073446e6689af087bf6356e8dddcf75fc279f201f" dependencies = [ "base64 0.11.0", - "borsh 0.9.3", - "bs58 0.4.0", + "borsh", + "bs58", "derive_more 0.99.17", "near-account-id 0.13.0", - "num-rational 0.3.2", + "num-rational", "serde", "sha2 0.10.2", - "strum 0.24.1", + "strum", ] [[package]] @@ -2951,25 +2478,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91d508f0fc340f6461e4e256417685720d3c4c00bb5a939b105160e49137caba" dependencies = [ "base64 0.11.0", - "borsh 0.9.3", - "bs58 0.4.0", + "borsh", + "bs58", "derive_more 0.99.17", "near-account-id 0.14.0", - "num-rational 0.3.2", + "num-rational", "serde", "sha2 0.10.2", - "strum 0.24.1", -] - -[[package]] -name = "near-rpc-error-core" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "proc-macro2 1.0.39", - "quote 1.0.18", - "serde", - "syn 1.0.96", + "strum", ] [[package]] @@ -2994,19 +2510,6 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "near-rpc-error-macro" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "near-rpc-error-core 0.1.0", - "proc-macro2 1.0.39", - "quote 1.0.18", - "serde", - "serde_json", - "syn 1.0.96", -] - [[package]] name = "near-rpc-error-macro" version = "0.13.0" @@ -3029,39 +2532,6 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "near-runtime-configs" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "near-primitives 0.1.0", - "near-runtime-fees", - "near-vm-logic 0.9.1", - "serde", -] - -[[package]] -name = "near-runtime-fees" -version = "0.9.1" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "num-rational 0.2.4", - "serde", -] - -[[package]] -name = "near-runtime-standalone" -version = "0.9.1" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "near-crypto 0.1.0", - "near-pool", - "near-primitives 0.1.0", - "near-runtime-configs", - "near-store", - "node-runtime", -] - [[package]] name = "near-sandbox-utils" version = "0.4.0" @@ -3083,14 +2553,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bda34e06e28fb9a09ac54efbdc49f0c9308780fc932aaa81c49c493fde974045" dependencies = [ "base64 0.13.0", - "borsh 0.9.3", - "bs58 0.4.0", + "borsh", + "bs58", "near-crypto 0.13.0", "near-primitives 0.13.0", "near-primitives-core 0.13.0", "near-sdk-macros", "near-sys", - "near-vm-logic 0.13.0", + "near-vm-logic", "serde", "serde_json", "wee_alloc", @@ -3108,27 +2578,6 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "near-store" -version = "0.1.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "borsh 0.6.2", - "byteorder", - "cached", - "derive_more 0.99.17", - "elastic-array", - "near-crypto 0.1.0", - "near-primitives 0.1.0", - "num_cpus", - "rand 0.7.3", - "rocksdb", - "serde", - "serde_json", - "strum 0.18.0", - "strum_macros 0.18.0", -] - [[package]] name = "near-sys" version = "0.2.0" @@ -3167,23 +2616,13 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "near-vm-errors" -version = "0.9.1" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "borsh 0.6.2", - "near-rpc-error-macro 0.1.0", - "serde", -] - [[package]] name = "near-vm-errors" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e02faf2bc1f6ef82b965cfe44389808fb5594f7aca4b596766117f4ce74df20" dependencies = [ - "borsh 0.9.3", + "borsh", "near-account-id 0.13.0", "near-rpc-error-macro 0.13.0", "serde", @@ -3195,27 +2634,12 @@ version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0da466a30f0446639cbd788c30865086fac3e8dcb07a79e51d2b0775ed4261e" dependencies = [ - "borsh 0.9.3", + "borsh", "near-account-id 0.14.0", "near-rpc-error-macro 0.14.0", "serde", ] -[[package]] -name = "near-vm-logic" -version = "0.9.1" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "base64 0.11.0", - "bs58 0.3.1", - "byteorder", - "near-runtime-fees", - "near-vm-errors 0.9.1", - "serde", - "sha2 0.8.2", - "sha3", -] - [[package]] name = "near-vm-logic" version = "0.13.0" @@ -3223,8 +2647,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f024d90451cd3c24d7a0a5cabf3636b192a60eb8e3ff0456f6c18b91152c346d" dependencies = [ "base64 0.13.0", - "borsh 0.9.3", - "bs58 0.4.0", + "borsh", + "bs58", "byteorder", "near-account-id 0.13.0", "near-crypto 0.13.0", @@ -3237,21 +2661,6 @@ dependencies = [ "sha3", ] -[[package]] -name = "near-vm-runner" -version = "0.9.1" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "cached", - "near-runtime-fees", - "near-vm-errors 0.9.1", - "near-vm-logic 0.9.1", - "parity-wasm", - "pwasm-utils", - "wasmer-runtime", - "wasmer-runtime-core", -] - [[package]] name = "net2" version = "0.2.37" @@ -3264,72 +2673,10 @@ dependencies = [ ] [[package]] -name = "nix" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229" -dependencies = [ - "bitflags 1.2.1", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - -[[package]] -name = "node-runtime" -version = "0.9.0" -source = "git+https://github.com/nearprotocol/nearcore.git#06674af003f0031d1ec2dbd226c309bde5b5d200" -dependencies = [ - "borsh 0.6.2", - "byteorder", - "cached", - "lazy_static", - "log 0.4.17", - "near-crypto 0.1.0", - "near-metrics", - "near-primitives 0.1.0", - "near-runtime-configs", - "near-runtime-fees", - "near-store", - "near-vm-errors 0.9.1", - "near-vm-logic 0.9.1", - "near-vm-runner", - "num-rational 0.2.4", - "rand 0.7.3", - "rocksdb", - "serde", - "serde_json", - "sha2 0.8.2", - "sha3", -] - -[[package]] -name = "nodrop" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" - -[[package]] -name = "nom" -version = "5.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af" -dependencies = [ - "memchr", - "version_check 0.9.2", -] - -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg 1.1.0", - "num-integer", - "num-traits", -] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" [[package]] name = "num-bigint" @@ -3362,19 +2709,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg 1.1.0", - "num-bigint 0.2.6", - "num-integer", - "num-traits", - "serde", -] - [[package]] name = "num-rational" version = "0.3.2" @@ -3382,7 +2716,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ "autocfg 1.1.0", - "num-bigint 0.3.2", + "num-bigint", "num-integer", "num-traits", "serde", @@ -3473,25 +2807,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "owning_ref" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" -dependencies = [ - "stable_deref_trait", -] - -[[package]] -name = "page_size" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd" -dependencies = [ - "libc", - "winapi 0.3.9", -] - [[package]] name = "parity-codec" version = "3.5.4" @@ -3552,12 +2867,6 @@ dependencies = [ "rand 0.7.3", ] -[[package]] -name = "parity-wasm" -version = "0.41.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865" - [[package]] name = "parking" version = "2.0.0" @@ -3586,16 +2895,6 @@ dependencies = [ "rustc_version 0.2.3", ] -[[package]] -name = "parking_lot" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.7.2", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -3637,20 +2936,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "parking_lot_core" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d58c7c768d4ba344e3e8d72518ac13e259d7c7ade24167003b8488e10b6740a3" -dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.56", - "smallvec 1.8.0", - "winapi 0.3.9", -] - [[package]] name = "parking_lot_core" version = "0.9.3" @@ -3664,12 +2949,6 @@ dependencies = [ "windows-sys", ] -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "percent-encoding" version = "1.0.1" @@ -3869,43 +3148,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prometheus" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0575e258dab62268e7236d7307caa38848acbda7ec7ab87bd9093791e999d20" -dependencies = [ - "cfg-if 0.1.10", - "fnv", - "lazy_static", - "protobuf", - "spin", - "thiserror", -] - -[[package]] -name = "protobuf" -version = "2.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e86d370532557ae7573551a1ec8235a0f8d6cb276c7c9e6aa490b511c447485" - -[[package]] -name = "pwasm-utils" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192" -dependencies = [ - "byteorder", - "log 0.4.17", - "parity-wasm", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - [[package]] name = "quote" version = "0.6.13" @@ -4279,16 +3521,6 @@ dependencies = [ "syn 1.0.96", ] -[[package]] -name = "rocksdb" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61aa17a99a2413cd71c1106691bf59dad7de0cd5099127f90e9d99c429c40d4a" -dependencies = [ - "libc", - "librocksdb-sys", -] - [[package]] name = "rust-argon2" version = "0.8.3" @@ -4307,12 +3539,6 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hex" version = "2.1.0" @@ -4435,16 +3661,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-bench" -version = "0.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd" -dependencies = [ - "byteorder", - "serde", -] - [[package]] name = "serde-big-array" version = "0.4.1" @@ -4454,15 +3670,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_bytes" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" -dependencies = [ - "serde", -] - [[package]] name = "serde_derive" version = "1.0.138" @@ -4480,7 +3687,6 @@ version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82c2c1fdcd807d1098552c5b9a36e425e42e9fbd7c6a37a8425f390f781f7fa7" dependencies = [ - "indexmap", "itoa 1.0.2", "ryu", "serde", @@ -4504,18 +3710,6 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" -[[package]] -name = "sha2" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a256f46ea78a0c0d9ff00077504903ac881a1dafdc20da66545699e7776b3e69" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - [[package]] name = "sha2" version = "0.9.3" @@ -4553,12 +3747,6 @@ dependencies = [ "opaque-debug 0.2.3", ] -[[package]] -name = "shlex" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" - [[package]] name = "signal-hook" version = "0.3.14" @@ -4638,18 +3826,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "stable_deref_trait" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8" - [[package]] name = "static_assertions" version = "0.2.5" @@ -4662,15 +3838,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" -[[package]] -name = "stream-cipher" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8131256a5896cabcf5eb04f4d6dacbe1aefda854b0d9896e09cb58829ec5638c" -dependencies = [ - "generic-array 0.12.3", -] - [[package]] name = "string" version = "0.2.1" @@ -4680,43 +3847,19 @@ dependencies = [ "bytes 0.4.12", ] -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - [[package]] name = "strsim" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" -[[package]] -name = "strum" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bd81eb48f4c437cadc685403cad539345bf703d78e63707418431cecd4522b" - [[package]] name = "strum" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros 0.24.1", -] - -[[package]] -name = "strum_macros" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87c85aa3f8ea653bfd3ddf25f7ee357ee4d204731f6aa9ad04002306f6e2774c" -dependencies = [ - "heck 0.3.1", - "proc-macro2 1.0.39", - "quote 1.0.18", - "syn 1.0.96", + "strum_macros", ] [[package]] @@ -4725,19 +3868,13 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9550962e7cf70d9980392878dfaf1dcc3ece024f4cf3bf3c46b978d0bad61d6c" dependencies = [ - "heck 0.4.0", + "heck", "proc-macro2 1.0.39", "quote 1.0.18", "rustversion", "syn 1.0.96", ] -[[package]] -name = "subtle" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d67a5a62ba6e01cb2192ff309324cb4875d0c451d55fe2319433abe7a05a8ee" - [[package]] name = "subtle" version = "2.2.3" @@ -4795,12 +3932,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "target-lexicon" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d" - [[package]] name = "tempfile" version = "3.1.0" @@ -4815,15 +3946,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "termcolor" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb6bfa289a4d7c5766392812c0a1f4c1ba45afa1ad47803c11e1f407d846d75f" -dependencies = [ - "winapi-util", -] - [[package]] name = "terminal_size" version = "0.1.12" @@ -4843,15 +3965,6 @@ dependencies = [ "libc", ] -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - [[package]] name = "thiserror" version = "1.0.31" @@ -5377,12 +4490,6 @@ dependencies = [ "smallvec 1.8.0", ] -[[package]] -name = "unicode-segmentation" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" - [[package]] name = "unicode-width" version = "0.1.7" @@ -5434,48 +4541,12 @@ dependencies = [ "getrandom 0.2.7", ] -[[package]] -name = "validator" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e60fadf92c22236de4028ceb0b8af50ed3430d41ad43d7a7d63b6bd1a8f47c38" -dependencies = [ - "idna 0.2.0", - "lazy_static", - "regex", - "serde", - "serde_derive", - "serde_json", - "url 2.2.2", -] - -[[package]] -name = "validator_derive" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d577dfb8ca9440a5c0b053d5a19b68f5c92ef57064bac87c8205c3f6072c20f" -dependencies = [ - "if_chain", - "lazy_static", - "proc-macro2 1.0.39", - "quote 1.0.18", - "regex", - "syn 1.0.96", - "validator", -] - [[package]] name = "vcpkg" version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6454029bf181f092ad1b853286f23e2c507d8e8194d01d92da4a55c274a5508c" -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.1.5" @@ -5488,12 +4559,6 @@ version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - [[package]] name = "waker-fn" version = "1.1.0" @@ -5599,74 +4664,6 @@ version = "0.2.82" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6598dd0bd3c7d51095ff6531a5b23e02acdc81804e30d8f07afb77b7215a140a" -[[package]] -name = "wasmer-runtime" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30259003902716aa4fb86fd66a2de555116adef545cbc5ab70afb74e74b44fc3" -dependencies = [ - "lazy_static", - "memmap", - "serde", - "serde_derive", - "wasmer-runtime-core", - "wasmer-singlepass-backend", -] - -[[package]] -name = "wasmer-runtime-core" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45d4253f097502423d8b19d54cb18745f61b984b9dbce32424cba7945cfef367" -dependencies = [ - "bincode", - "blake3", - "cc", - "digest 0.8.1", - "errno", - "hex 0.4.2", - "indexmap", - "lazy_static", - "libc", - "nix", - "page_size", - "parking_lot 0.10.2", - "rustc_version 0.2.3", - "serde", - "serde-bench", - "serde_bytes", - "serde_derive", - "smallvec 1.8.0", - "target-lexicon", - "wasmparser", - "winapi 0.3.9", -] - -[[package]] -name = "wasmer-singlepass-backend" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37cf84179dd5e92b784f7bc190b237f1184916a6d6d3f87d4dd94ca371a2cc25" -dependencies = [ - "bincode", - "byteorder", - "dynasm", - "dynasmrt", - "lazy_static", - "libc", - "nix", - "serde", - "serde_derive", - "smallvec 1.8.0", - "wasmer-runtime-core", -] - -[[package]] -name = "wasmparser" -version = "0.51.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a" - [[package]] name = "web-sys" version = "0.3.59" @@ -5749,15 +4746,6 @@ dependencies = [ "cc", ] -[[package]] -name = "which" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d011071ae14a2f6671d0b74080ae0cd8ebf3a6f8c9589a2cd45f23126fe29724" -dependencies = [ - "libc", -] - [[package]] name = "winapi" version = "0.2.8" @@ -5862,7 +4850,7 @@ dependencies = [ "anyhow", "async-trait", "base64 0.13.0", - "borsh 0.9.3", + "borsh", "chrono", "dirs 3.0.2", "hex 0.4.2", diff --git a/contracts/near/eth-client/src/tests.rs b/contracts/near/eth-client/src/tests.rs index 600cbba57..b25fb1fb3 100644 --- a/contracts/near/eth-client/src/tests.rs +++ b/contracts/near/eth-client/src/tests.rs @@ -156,7 +156,11 @@ use near_sdk::{testing_env, VMContext}; lazy_static! { static ref WEB3RS: web3::Web3 = { let (eloop, transport) = web3::transports::Http::new( - "https://mainnet.infura.io/v3/b5f870422ee5454fb11937e947154cd2", + format!( + "https://mainnet.infura.io/v3/{}", + std::env::var("ETH1_INFURA_API_KEY").unwrap() + ) + .as_str(), ) .unwrap(); eloop.into_remote(); diff --git a/contracts/near/eth-prover/Cargo.toml b/contracts/near/eth-prover/Cargo.toml index 0134f7d01..d47cffa21 100644 --- a/contracts/near/eth-prover/Cargo.toml +++ b/contracts/near/eth-prover/Cargo.toml @@ -8,7 +8,6 @@ edition = "2021" crate-type = ["cdylib", "rlib"] [dependencies] -wee_alloc = { version = "0.4.5", default-features = false, features = [] } eth-types = { path = "../eth-types", default-features = false } admin-controlled = { path = "../admin-controlled" } serde = { version = "1.0", features = ["derive"] } @@ -22,9 +21,8 @@ hex = "0.4.2" hex = "0.4.2" indicatif = "0.14" lazy_static = "*" -near-crypto = { git = "https://github.com/nearprotocol/nearcore.git" } -near-primitives = { git = "https://github.com/nearprotocol/nearcore.git" } -near-runtime-standalone = { git = "https://github.com/nearprotocol/nearcore.git" } +near-crypto = "0.14.0" +near-primitives = "0.14.0" [features] default = ["eip1559"] diff --git a/contracts/near/eth-prover/src/tests.rs b/contracts/near/eth-prover/src/tests.rs index 168670f29..2e909d706 100644 --- a/contracts/near/eth-prover/src/tests.rs +++ b/contracts/near/eth-prover/src/tests.rs @@ -29,15 +29,16 @@ mod tests { // TESTS - use near_sdk::MockedBlockchain; use near_sdk::{testing_env, VMContext}; - fn get_context(input: Vec, is_view: bool) -> VMContext { + fn get_context(input: Vec) -> VMContext { VMContext { - current_account_id: "alice.near".to_string(), - signer_account_id: "bob.near".to_string(), - signer_account_pk: vec![0, 1, 2], - predecessor_account_id: "carol.near".to_string(), + current_account_id: "alice.near".parse().unwrap(), + signer_account_id: "bob.near".parse().unwrap(), + signer_account_pk: "ed25519:6E8sCci9badyRkXb3JoRpBj5p8C6Tw41ELDZoiihKEtp" + .parse() + .unwrap(), + predecessor_account_id: "carol.near".parse().unwrap(), input, block_index: 0, block_timestamp: 0, @@ -46,16 +47,17 @@ mod tests { account_locked_balance: 0, storage_usage: 0, attached_deposit: 0, - prepaid_gas: 10u64.pow(18), - random_seed: vec![0, 1, 2], - is_view, + prepaid_gas: near_sdk::Gas(10u64.pow(18)), + random_seed: vec![1; 32].try_into().unwrap(), + view_config: None, output_data_receivers: vec![], } } #[test] + #[cfg_attr(feature = "eip1559", ignore)] fn simple_tx_res() { - testing_env!(get_context(vec![], false)); + testing_env!(get_context(vec![])); let contract = EthProver::init("ethbridge".to_string()); @@ -96,8 +98,9 @@ mod tests { } #[test] + #[cfg_attr(feature = "eip1559", ignore)] fn complex_tx_res() { - testing_env!(get_context(vec![], false)); + testing_env!(get_context(vec![])); let contract = EthProver::init("ethbridge".to_string()); @@ -214,6 +217,7 @@ mod tests { } #[test] + #[cfg_attr(feature = "eip1559", ignore)] fn complex_test2() { let log_index = 0; let receipt_index = 1; @@ -266,7 +270,7 @@ mod tests { Vec::from_hex("f901a70183012d99b9010000000000000000000000000000000000000001000000000000000000000000000000000000000000000002000000010000000000000000000000000000000000000000000008000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000400000000000000000000000000000000000000000000000000100000000000000000000004000080000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f89df89b94dac17f958d2ee523a2206206994597c13d831ec7f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000adb2b42f6bd96f5c65920b9ac88619dce4166f94a0000000000000000000000000658a36d8f840f73207af8df717d12046b2c75969a000000000000000000000000000000000000000000000000000000000042c1d80").unwrap(), ], ]; - testing_env!(get_context(vec![], false)); + testing_env!(get_context(vec![])); let contract = EthProver::init("ethbridge".to_string()); @@ -297,6 +301,7 @@ mod tests { } #[test] + #[cfg_attr(feature = "eip1559", ignore)] fn complex_test3() { let log_index = 0; let receipt_index = 0; @@ -365,7 +370,7 @@ mod tests { assert_eq!(borsh_proof, actual_borsh_proof); assert_eq!(borsh_skip_bridge_call, actual_borsh_skip_bridge_call); - testing_env!(get_context(vec![], false)); + testing_env!(get_context(vec![])); let contract = EthProver::init("ethbridge".to_string()); @@ -394,7 +399,7 @@ mod tests { let mut vm_config = VMConfig::free(); vm_config.limit_config.max_number_logs = u64::MAX; vm_config.limit_config.max_promises_per_function_call_action = u64::MAX; - testing_env!(get_context(vec![], false), vm_config, Default::default()); + testing_env!(get_context(vec![]), vm_config, Default::default()); let contract = EthProver::init("ethbridge".to_string()); let mut proofs = fs::read_dir(env::var("ETH_PROOF_DIR").unwrap()) @@ -454,12 +459,9 @@ mod tests { bar.finish(); } - use near_sdk::VMConfig; - #[test] pub fn test_verify_proof() { - let vm_config = VMConfig::free(); - testing_env!(get_context(vec![], false), vm_config, Default::default()); + testing_env!(get_context(vec![])); let expected_value = "f902a60183af4adfb9010000000000000000000000000000000000000000000000000000000000000000000800010000000000000002000100000000000000000000000000000000000000000000000000000008000008000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000010000000040000000000000000000000000000000200000000010000000000000000000000000000000000200080000000202000000000000000000000000000004000000000000002000000000000000000000000000000000000080000000000000000000000000000000000000000000200000004000000000000000000000000000000f9019bf89b94a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa0000000000000000000000000c22df065a81f6e0107e214991b9d7fb179d401b3a000000000000000000000000023ddd3e3692d1861ed57ede224608875809e127fa00000000000000000000000000000000000000000000000000000000005f5e100f8fc9423ddd3e3692d1861ed57ede224608875809e127ff863a0dd85dc56b5b4da387bf69c28ec19b1d66e793e0d51b567882fa31dc50bbd32c5a0000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48a0000000000000000000000000c22df065a81f6e0107e214991b9d7fb179d401b3b8800000000000000000000000000000000000000000000000000000000005f5e1000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a6d616b6b652e6e65617200000000000000000000000000000000000000000000"; let expected_root = "73733f420161b4189ea48140489bfada55d485fd580ab7e6f0f4b6de229f5177"; diff --git a/contracts/near/eth-prover/test.sh b/contracts/near/eth-prover/test.sh index fc6b002b1..dfe4fbc38 100755 --- a/contracts/near/eth-prover/test.sh +++ b/contracts/near/eth-prover/test.sh @@ -1,3 +1,4 @@ #!/usr/bin/env bash +RUST_BACKTRACE=1 cargo test --no-default-features --jobs 8 --package eth-prover -- --nocapture RUST_BACKTRACE=1 cargo test --jobs 8 --package eth-prover -- --nocapture diff --git a/contracts/near/eth-prover/tests/spec.rs b/contracts/near/eth-prover/tests_ignore/spec.rs similarity index 100% rename from contracts/near/eth-prover/tests/spec.rs rename to contracts/near/eth-prover/tests_ignore/spec.rs diff --git a/contracts/near/eth-prover/tests/utils.rs b/contracts/near/eth-prover/tests_ignore/utils.rs similarity index 100% rename from contracts/near/eth-prover/tests/utils.rs rename to contracts/near/eth-prover/tests_ignore/utils.rs diff --git a/contracts/near/eth2-client/test.sh b/contracts/near/eth2-client/test.sh index 6565d4d67..092e6a5d7 100755 --- a/contracts/near/eth2-client/test.sh +++ b/contracts/near/eth2-client/test.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash +rustup target add wasm32-unknown-unknown cargo build --target wasm32-unknown-unknown --release --no-default-features --features logs RUST_BACKTRACE=1 cargo test --jobs 8 --package eth2-client -- --nocapture diff --git a/contracts/near/res/eth_prover.wasm b/contracts/near/res/eth_prover.wasm index 21d76039b3c1abd5bcf24879ed1598d919a9ff8c..40aa39ec787f9783e5d97d5e402546b12857e8bc 100755 GIT binary patch delta 35633 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%0An)pq zi-&zrT)E@Nj>#Q1QcZYR^oEmm@L`b~!+bd1*&EM&aNVZ5PY}~GXLt=)7bIVT6fuHb zx8rhJ-51aOaNU7Ry);HNQ!fq?p{n2!Q7zwF1k+P&ZhHM+*vXIYM_kiA~hr_*U*j2RxPKCjG|6R@_^Y~-_Y%4V-xR} zR!FnbIr%)GxOykOv`V@ZY3>pye^r(8t1IJ&x}FChgA1siri=TFTzQrTtpr%h(oU~O zItFM?{+cT3caW~(m;W)+d4B2lk!CG-${$3URn18Ys1n-M&Ibqwprs!|U8Mah!08aJ zM-G8DNY`QfvKmi`NX&g@X)|z-xECNti3X{*Gez3)ehsZI7&m^@u)*F32aXvsaKt#E zjRKtQ^N7I@jhis4B4;|_JZ#2~7&6X5F9nR%c<_kv!?)s@s~A3Tl&c)iZaj}2JbL`# z5%&(>uMW->u|>xKW|i(fYTS^KBS2)>_`&CG5;j>tFxfV;w512~SZl_P8#83Y{a#l( z;6X^=`@q041MeL-c#QY%yBh(f3Pmf zLyL<)f~(7r5revqy?5jwFy>G8QRF>_%P}{PtoR4i-gzRK&ZtxKM0>pQS8qN%z8=jDR}wOrGE37* z-vni3pTtRbM4CsjKQ~Vx&D=UI;d!AL7xTm|n}}-?E`OZKNSEO1J!0(mQKLpS7&C70 zph``if=p|!)orYlH?{1a`J$e?=pdTC3)co*3vfM&Yb>t&aNU8c6RtXF_5V*-ktQ6C z3Iwj-ni{Tea2>?;I0UjstG&+_Ce2dZDmGgcaT6m)?zM zuG-1}8_#UKoOCD};g26yB^_QR9ih`{6$GkPK^Tm*uApr4QqkQrq`afyYJdt^_j!Og z=?!@1ikvBW=;Xe-%Qs3)E8UcF?-HSBv&B3pyLx zKPmz)iz=%@1J`(U$7<0lV#&???v2a!D(=zo0Ib-Erzn{TjY&A^ zPEK02+#q_zPX`*$uM&4&|2gt_Ks~!bG|WE&Fi+{<;LcM29(QKnhlX?_(mdhucz8gC zJtx{{IaHhVG+cE7?vFc90r%mK`YVd7hn|CDzou-{b7Hk8rNeE8UhQ=ON+vER%_|IM mu7eu8S>%S60*xn{jkIVeB941Di*^zI9kQ&f#!I5V`~Lwf+gI@b delta 34724 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