Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 28 additions & 5 deletions e2e/rust/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ use candid::{candid_method, Principal};
use ic_cdk_macros::update;

use evm_rpc_types::{
Block, BlockTag, EthMainnetService, Hex32, MultiRpcResult, ProviderError, RpcError, RpcService,
RpcServices,
Block, BlockTag, ConsensusStrategy, EthMainnetService, Hex32, MultiRpcResult, ProviderError,
RpcConfig, RpcError, RpcResult, RpcService, RpcServices,
};

fn main() {}
Expand Down Expand Up @@ -82,7 +82,13 @@ pub async fn test() {
EthMainnetService::Llama,
EthMainnetService::PublicNode,
])),
(),
Some(RpcConfig {
response_consensus: Some(ConsensusStrategy::Threshold {
total: None,
min: 2,
}),
..Default::default()
}),
BlockTag::Number(19709434_u32.into()),
),
10000000000,
Expand All @@ -103,8 +109,25 @@ pub async fn test() {
Err(err) => ic_cdk::trap(&format!("error in `eth_getBlockByNumber`: {:?}", err)),
},
MultiRpcResult::Inconsistent(results) => ic_cdk::trap(&format!(
"inconsistent results in `eth_getBlockByNumber`: {:?}",
results
"inconsistent results in `eth_getBlockByNumber`: {}",
debug_inconsistent(&results)
)),
}
}

fn debug_inconsistent(results: &[(RpcService, RpcResult<Block>)]) -> String {
results
.iter()
.map(|(service, result)| {
let res_str = match result {
// A block contains too much information and in case of inconsistencies
// not all results can be displayed, so we only display the block number
// assuming that responses with the same block number should be equal.
Ok(block) => format!("Ok({}, ...)", block.number),
Err(err) => format!("Err({err})"),
};
format!("{service:?}: {res_str}")
})
.collect::<Vec<_>>()
.join(", ")
}
10 changes: 5 additions & 5 deletions src/providers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ pub const PROVIDERS: &[Provider] = &[
auth: RpcAuth::UrlParameter {
url_pattern: "https://ethereum.blockpi.network/v1/rpc/{API_KEY}",
},
public_url: Some("https://ethereum.blockpi.network/v1/rpc/public"),
public_url: Some("https://ethereum.public.blockpi.network/v1/rpc/public"),
},
alias: Some(SupportedRpcService::EthMainnet(EthMainnetService::BlockPi)),
},
Expand Down Expand Up @@ -86,7 +86,7 @@ pub const PROVIDERS: &[Provider] = &[
auth: RpcAuth::UrlParameter {
url_pattern: "https://ethereum-sepolia.blockpi.network/v1/rpc/{API_KEY}",
},
public_url: Some("https://ethereum-sepolia.blockpi.network/v1/rpc/public"),
public_url: None,
},
alias: Some(SupportedRpcService::EthSepolia(EthSepoliaService::BlockPi)),
},
Expand Down Expand Up @@ -151,7 +151,7 @@ pub const PROVIDERS: &[Provider] = &[
auth: RpcAuth::UrlParameter {
url_pattern: "https://arbitrum.blockpi.network/v1/rpc/{API_KEY}",
},
public_url: Some("https://arbitrum.blockpi.network/v1/rpc/public"),
public_url: Some("https://arbitrum.public.blockpi.network/v1/rpc/public"),
},
alias: Some(SupportedRpcService::ArbitrumOne(L2MainnetService::BlockPi)),
},
Expand Down Expand Up @@ -194,7 +194,7 @@ pub const PROVIDERS: &[Provider] = &[
auth: RpcAuth::UrlParameter {
url_pattern: "https://base.blockpi.network/v1/rpc/{API_KEY}",
},
public_url: Some("https://base.blockpi.network/v1/rpc/public"),
public_url: Some("https://base.public.blockpi.network/v1/rpc/public"),
},
alias: Some(SupportedRpcService::BaseMainnet(L2MainnetService::BlockPi)),
},
Expand Down Expand Up @@ -239,7 +239,7 @@ pub const PROVIDERS: &[Provider] = &[
auth: RpcAuth::UrlParameter {
url_pattern: "https://optimism.blockpi.network/v1/rpc/{API_KEY}",
},
public_url: Some("https://optimism.blockpi.network/v1/rpc/public"),
public_url: Some("https://optimism.public.blockpi.network/v1/rpc/public"),
},
alias: Some(SupportedRpcService::OptimismMainnet(
L2MainnetService::BlockPi,
Expand Down
21 changes: 18 additions & 3 deletions src/types/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -120,13 +120,15 @@ fn arb_override_provider() -> impl Strategy<Value = OverrideProvider> {
}

mod override_provider {
use crate::memory::insert_api_key;
use crate::providers::PROVIDERS;
use crate::types::{OverrideProvider, RegexSubstitution};
use crate::types::{ApiKey, OverrideProvider, RegexSubstitution};
use evm_rpc_types::RpcApi;
use ic_management_canister_types::HttpHeader;

#[test]
fn should_override_provider_with_localhost() {
setup_api_keys();
Comment thread
gregorydemay marked this conversation as resolved.
let override_provider = override_to_localhost();
for provider in PROVIDERS {
let overriden_provider = override_provider.apply(provider.api());
Expand All @@ -142,6 +144,7 @@ mod override_provider {

#[test]
fn should_be_noop_when_empty() {
setup_api_keys();
let no_override = OverrideProvider::default();
for provider in PROVIDERS {
let initial_api = provider.api();
Expand All @@ -152,6 +155,7 @@ mod override_provider {

#[test]
fn should_use_replacement_pattern() {
setup_api_keys();
let identity_override = OverrideProvider {
override_url: Some(RegexSubstitution {
pattern: "(?<url>.*)".into(),
Expand All @@ -160,13 +164,15 @@ mod override_provider {
};
for provider in PROVIDERS {
let initial_api = provider.api();
let overriden_provider = identity_override.apply(initial_api.clone());
assert_eq!(overriden_provider, Ok(initial_api))
let overriden_provider = identity_override.apply(initial_api.clone()).unwrap();
assert_eq!(overriden_provider.headers, None);
assert_eq!(overriden_provider.url, initial_api.url)
}
}

#[test]
fn should_override_headers() {
setup_api_keys();
let identity_override = OverrideProvider {
override_url: Some(RegexSubstitution {
pattern: "(.*)".into(),
Expand All @@ -192,6 +198,15 @@ mod override_provider {
}
}

fn setup_api_keys() {
for provider in PROVIDERS {
insert_api_key(
provider.provider_id,
ApiKey::try_from("unit-test-key".to_string()).unwrap(),
)
}
}

fn override_to_localhost() -> OverrideProvider {
OverrideProvider {
override_url: Some(RegexSubstitution {
Expand Down