fix: Convert vendor/pezkuwi-subxt from submodule to regular directory
This commit is contained in:
@@ -0,0 +1 @@
|
||||
/target
|
||||
+2807
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,18 @@
|
||||
[package]
|
||||
name = "wasm-lightclient-tests"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
publish = false
|
||||
|
||||
[dev-dependencies]
|
||||
wasm-bindgen-test = "0.3.24"
|
||||
tracing-wasm = "0.2.1"
|
||||
tracing = "0.1.34"
|
||||
console_error_panic_hook = "0.1.7"
|
||||
serde_json = "1"
|
||||
futures-util = "0.3.30"
|
||||
|
||||
# This crate is not a part of the workspace, because it
|
||||
# requires the "jsonrpsee web unstable-light-client" features to be enabled, which we don't
|
||||
# want enabled for workspace builds in general.
|
||||
subxt = { path = "../../subxt", default-features = false, features = ["web", "jsonrpsee", "unstable-light-client"] }
|
||||
@@ -0,0 +1,76 @@
|
||||
#![cfg(target_arch = "wasm32")]
|
||||
|
||||
use futures_util::StreamExt;
|
||||
use subxt::{client::OnlineClient, config::PolkadotConfig, lightclient::LightClient};
|
||||
use wasm_bindgen_test::*;
|
||||
|
||||
wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser);
|
||||
|
||||
// Run the tests by calling:
|
||||
//
|
||||
// ```text
|
||||
// wasm-pack test --firefox --headless
|
||||
// ```
|
||||
//
|
||||
// Use the following to enable logs:
|
||||
// ```
|
||||
// console_error_panic_hook::set_once();
|
||||
// tracing_wasm::set_as_global_default();
|
||||
// ```
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
async fn light_client_works() {
|
||||
let api = connect_to_rpc_node().await;
|
||||
|
||||
tracing::info!("Subscribe to latest finalized blocks: ");
|
||||
|
||||
let mut blocks_sub = api
|
||||
.blocks()
|
||||
.subscribe_finalized()
|
||||
.await
|
||||
.expect("Cannot subscribe to finalized hashes")
|
||||
.take(3);
|
||||
|
||||
// For each block, print information about it:
|
||||
while let Some(block) = blocks_sub.next().await {
|
||||
let block = block.expect("Block not valid");
|
||||
|
||||
let block_number = block.header().number;
|
||||
let block_hash = block.hash();
|
||||
|
||||
tracing::info!("Block #{block_number}:");
|
||||
tracing::info!(" Hash: {block_hash}");
|
||||
}
|
||||
}
|
||||
|
||||
/// We connect to an RPC node because the light client can struggle to sync in
|
||||
/// time to a new local node for some reason. Because this can be brittle (eg RPC nodes can
|
||||
/// go down or have network issues), we try a few RPC nodes until we find one that works.
|
||||
async fn connect_to_rpc_node() -> OnlineClient<PolkadotConfig> {
|
||||
let rpc_node_urls = [
|
||||
"wss://rpc.polkadot.io",
|
||||
"wss://1rpc.io/dot",
|
||||
"wss://polkadot-public-rpc.blockops.network/ws",
|
||||
];
|
||||
|
||||
async fn do_connect(
|
||||
url: &str,
|
||||
) -> Result<OnlineClient<PolkadotConfig>, Box<dyn std::error::Error + Send + Sync + 'static>>
|
||||
{
|
||||
let chainspec = subxt::utils::fetch_chainspec_from_rpc_node(url).await?;
|
||||
let (_lc, rpc) = LightClient::relay_chain(chainspec.get())?;
|
||||
let api = OnlineClient::from_rpc_client(rpc).await?;
|
||||
Ok(api)
|
||||
}
|
||||
|
||||
for url in rpc_node_urls {
|
||||
let res = do_connect(url).await;
|
||||
|
||||
match res {
|
||||
Ok(api) => return api,
|
||||
Err(e) => tracing::warn!("Error connecting to RPC node {url}: {e}"),
|
||||
}
|
||||
}
|
||||
|
||||
panic!("Could not connect to any RPC node")
|
||||
}
|
||||
Reference in New Issue
Block a user