mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-23 01:28:00 +00:00
78a106f059
* Update frame-metadata to the latest branch Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Add outer enum types Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Extend the extrinsic with address,call,sign,extra types Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Codegen test Event, Error and Call for outer enums Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Revert "Codegen test Event, Error and Call for outer enums" This reverts commit db542dca0369eedd257a7ec031d5b5549bc46a88. * Update frame-metadata from the latest release Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update scale-info Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * codegen/error: Support v15 message Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Convert v14 to v15 Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata/retain: Adjust to extrinsic type for V15 Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata/validation: Adjust hashing for extrinsic types V15 Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * scripts: Fetch V15 and output codegen for full_client only Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt/blocks: Use extrinsic types directly Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * testing: Fetch V15 for build script Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Generate from latest polkadot version Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * codegen: Fetch legacy with old API for v14 only Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * rpc: Fetch metadata versions Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * client: Fetch latest unstable then V15 then V14 Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * testing: Adjust testing API to latest interface Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Adjust clippy Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Generate the `RuntimeError` type for V14 Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Remove testing files Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * testing/staking: Remove controller account from bond Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata/validation: Use specific variants for hashing RuntimeCall Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * XXX: Custom Substrate binary: must revert with next release Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * XXX: To revert: CI use hardcoded substrate Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * codegen: Use v15 outer enum types Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Retain outer enum types Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * codegen: Use outer enum types instead of generating them Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update artifacts Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Revert "XXX: Custom Substrate binary: must revert with next release" This reverts commit e9705298661919f5769720b35030759fb8a7b01d. Revert "XXX: To revert: CI use hardcoded substrate" This reverts commit b18a5a0985a56ee4ad99bc9a1c0f9cd733cf4271. * testing: Include env for dummy wat contracts Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Adjsut clippy Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * ci: Use new link for fetching latest substrate binary Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * tests: Include dummy RuntimeEvent into test metadata Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * ci: Bump light-client timeout tests to 25min Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata/validation: Use specific pallets as provided Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * testing: Rename metadata constant Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Use call_ty instead of signature_ty Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Rename retaining variant function Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Use Option<&[&str]> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * online_client: Fetch V15 metadata explicitely Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata/validation: Include the hash of the outer enum types Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Fix sign typo Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Update the artifacts Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Remove RootError RootEvent and RootExtrinsic traits Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update polkadot.rs Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata/tests: Ensure outer enum variants are retained Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * scripts: Include multiple pallets for our decoding purposes Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Apply clippy Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * artifacts: Update small metadata Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * error: Keep raw bytes for the ModuleError representation Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * error: Modify docs to not include links Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt/tests: Propagate `RuntimeCall` to outer enums Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * subxt: Provide proper byte slice for decoding Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update artifacts Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * cli/tests: Adjust expected pallets message Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Test conversion from v14 to v15 Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata: Fix typo Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Update subxt/src/blocks/extrinsic_types.rs Co-authored-by: James Wilson <james@jsdw.me> * metadata: Simplify type path for RuntimeError Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * metadata/validation: Use visited ids per outer enum Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * error: Remove RawModuleError Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> * Fix new clippy error from updated rust version Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> --------- Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> Co-authored-by: James Wilson <james@jsdw.me>
126 lines
4.7 KiB
Rust
126 lines
4.7 KiB
Rust
// Copyright 2019-2023 Parity Technologies (UK) Ltd.
|
|
// This file is dual-licensed as Apache-2.0 or GPL-3.0.
|
|
// see LICENSE for license details.
|
|
|
|
use codec::{Decode, Encode};
|
|
use std::{env, fs, path::Path};
|
|
use substrate_runner::{Error as SubstrateNodeError, SubstrateNode};
|
|
|
|
static SUBSTRATE_BIN_ENV_VAR: &str = "SUBSTRATE_NODE_PATH";
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
run().await;
|
|
}
|
|
|
|
async fn run() {
|
|
// Select substrate binary to run based on env var.
|
|
let substrate_bin = env::var(SUBSTRATE_BIN_ENV_VAR).unwrap_or_else(|_| "substrate".to_owned());
|
|
|
|
let mut node_builder = SubstrateNode::builder();
|
|
node_builder.binary_path(substrate_bin.clone());
|
|
|
|
let node = match node_builder.spawn() {
|
|
Ok(node) => node,
|
|
Err(SubstrateNodeError::Io(e)) if e.kind() == std::io::ErrorKind::NotFound => {
|
|
panic!(
|
|
"A substrate binary should be installed on your path for testing purposes. \
|
|
See https://github.com/paritytech/subxt/tree/master#integration-testing"
|
|
)
|
|
}
|
|
Err(e) => {
|
|
panic!("Cannot spawn substrate command '{substrate_bin}': {e}")
|
|
}
|
|
};
|
|
|
|
let port = node.ws_port();
|
|
|
|
// Download metadata from binary. Avoid Subxt dep on `subxt::rpc::types::Bytes`and just impl here.
|
|
// This may at least prevent this script from running so often (ie whenever we change Subxt).
|
|
const V15_METADATA_VERSION: u32 = 15;
|
|
let bytes = V15_METADATA_VERSION.encode();
|
|
let version: String = format!("0x{}", hex::encode(&bytes));
|
|
let raw: String = {
|
|
use client::ClientT;
|
|
client::build(&format!("ws://localhost:{port}"))
|
|
.await
|
|
.unwrap_or_else(|e| panic!("Failed to connect to node: {e}"))
|
|
.request(
|
|
"state_call",
|
|
client::rpc_params!["Metadata_metadata_at_version", &version],
|
|
)
|
|
.await
|
|
.unwrap_or_else(|e| panic!("Failed to obtain metadata from node: {e}"))
|
|
};
|
|
let raw_bytes = hex::decode(raw.trim_start_matches("0x"))
|
|
.unwrap_or_else(|e| panic!("Failed to hex-decode metadata: {e}"));
|
|
let bytes: Option<Vec<u8>> = Decode::decode(&mut &raw_bytes[..])
|
|
.unwrap_or_else(|e| panic!("Failed to decode metadata bytes: {e}"));
|
|
let metadata_bytes = bytes.expect("Metadata version not found");
|
|
|
|
// Save metadata to a file:
|
|
let out_dir = env::var_os("OUT_DIR").unwrap();
|
|
let metadata_path = Path::new(&out_dir).join("metadata.scale");
|
|
fs::write(&metadata_path, metadata_bytes).expect("Couldn't write metadata output");
|
|
|
|
// Write out our expression to generate the runtime API to a file. Ideally, we'd just write this code
|
|
// in lib.rs, but we must pass a string literal (and not `concat!(..)`) as an arg to `runtime_metadata_path`,
|
|
// and so we need to spit it out here and include it verbatim instead.
|
|
let runtime_api_contents = format!(
|
|
r#"
|
|
#[subxt::subxt(
|
|
runtime_metadata_path = "{}",
|
|
derive_for_all_types = "Eq, PartialEq",
|
|
)]
|
|
pub mod node_runtime {{}}
|
|
"#,
|
|
metadata_path
|
|
.to_str()
|
|
.expect("Path to metadata should be stringifiable")
|
|
);
|
|
let runtime_path = Path::new(&out_dir).join("runtime.rs");
|
|
fs::write(runtime_path, runtime_api_contents).expect("Couldn't write runtime rust output");
|
|
|
|
let substrate_path =
|
|
which::which(substrate_bin).expect("Cannot resolve path to substrate binary");
|
|
|
|
// Re-build if the substrate binary we're pointed to changes (mtime):
|
|
println!(
|
|
"cargo:rerun-if-changed={}",
|
|
substrate_path.to_string_lossy()
|
|
);
|
|
// Re-build if we point to a different substrate binary:
|
|
println!("cargo:rerun-if-env-changed={SUBSTRATE_BIN_ENV_VAR}");
|
|
// Re-build if this file changes:
|
|
println!("cargo:rerun-if-changed=build.rs");
|
|
}
|
|
|
|
// Use jsonrpsee to obtain metadata from the node.
|
|
mod client {
|
|
pub use jsonrpsee::{
|
|
client_transport::ws::{InvalidUri, Receiver, Sender, Uri, WsTransportClientBuilder},
|
|
core::{
|
|
client::{Client, ClientBuilder},
|
|
Error,
|
|
},
|
|
};
|
|
|
|
pub use jsonrpsee::core::{client::ClientT, rpc_params};
|
|
|
|
/// Build WS RPC client from URL
|
|
pub async fn build(url: &str) -> Result<Client, Error> {
|
|
let (sender, receiver) = ws_transport(url).await?;
|
|
Ok(ClientBuilder::default().build_with_tokio(sender, receiver))
|
|
}
|
|
|
|
async fn ws_transport(url: &str) -> Result<(Sender, Receiver), Error> {
|
|
let url: Uri = url
|
|
.parse()
|
|
.map_err(|e: InvalidUri| Error::Transport(e.into()))?;
|
|
WsTransportClientBuilder::default()
|
|
.build(url)
|
|
.await
|
|
.map_err(|e| Error::Transport(e.into()))
|
|
}
|
|
}
|