diff --git a/Cargo.lock b/Cargo.lock index fd73b40..a9119fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3102,6 +3102,7 @@ name = "pvq-test-runner" version = "0.1.0" dependencies = [ "clap", + "hex", "parity-scale-codec", "polkavm", "pvq-executor", @@ -3110,6 +3111,7 @@ dependencies = [ "pvq-extension-fungibles", "pvq-primitives", "scale-info", + "sp-core", "tracing", "tracing-subscriber", ] diff --git a/Cargo.toml b/Cargo.toml index 4c1f400..c20cd7b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -46,6 +46,7 @@ polkavm-derive = { path = "vendor/polkavm/crates/polkavm-derive", default-featur # polkadot-sdk sp-api = { path = "vendor/polkadot-sdk/substrate/primitives/api", default-features = false } +sp-core = { path = "vendor/polkadot-sdk/substrate/primitives/core", default-features = false } frame = { package = "polkadot-sdk-frame", path = "vendor/polkadot-sdk/substrate/frame", default-features = false } pallet-balances = { path = "vendor/polkadot-sdk/substrate/frame/balances", default-features = false } pallet-assets = { path = "vendor/polkadot-sdk/substrate/frame/assets", default-features = false } @@ -69,6 +70,7 @@ scale-info = { version = "2.11.3", default-features = false, features = [ "derive", ] } tracing = { version = "0.1.40", default-features = false } +hex = { version = "0.4" } # std clap = { version = "4.5.4", features = ["derive"] } diff --git a/README.md b/README.md index 2f9d162..de649dc 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,13 @@ Available PoC guest programs: - `guest-total-supply`: get the total supply of an asset - `guest-sum-balance-percent`: sum the balances of multiple accounts and calculate the percentage of the total supply +### RuntimeAPI PoC + +1. Use chopsticks to start a local chain with the RuntimeAPI enabled: `make run` +2. Build guest programs: `make guests` +3. Run test runner to display hex-encoded `args` in tracing logs: `cargo run -p pvq-test-runner -- --program output/` +4. Upload `program` and `args` in PJS UI. + ### XCM Integration PoC The test case of XCM integration is located in `vendor/polkadot-sdk/polkadot/xcm/xcm-simulator/example/src/tests.rs` diff --git a/poc/runtime/Cargo.toml b/poc/runtime/Cargo.toml index c3686c9..53bf2c5 100644 --- a/poc/runtime/Cargo.toml +++ b/poc/runtime/Cargo.toml @@ -54,4 +54,5 @@ std = [ "pvq-primitives/std", "pvq-extension-core/std", "pvq-extension-fungibles/std", + "pvq-runtime-api/std", ] diff --git a/pvq-test-runner/Cargo.toml b/pvq-test-runner/Cargo.toml index d6fd4ae..1d92a05 100644 --- a/pvq-test-runner/Cargo.toml +++ b/pvq-test-runner/Cargo.toml @@ -13,6 +13,7 @@ tracing = { workspace = true, features = ["std"] } tracing-subscriber = { workspace = true } parity-scale-codec = { workspace = true, features = ["std"] } scale-info = { workspace = true, features = ["std"] } +sp-core = { workspace = true, features = ["std"] } pvq-executor = { workspace = true, features = ["std"] } pvq-extension = { workspace = true, features = ["std"] } @@ -21,3 +22,5 @@ pvq-extension-fungibles = { workspace = true, features = ["std"] } pvq-primitives = { workspace = true, features = ["std"] } polkavm = { workspace = true, features = ["std"] } + +hex = { workspace = true, features = ["std"] } diff --git a/pvq-test-runner/src/lib.rs b/pvq-test-runner/src/lib.rs index f4fe1ab..c9f1777 100644 --- a/pvq-test-runner/src/lib.rs +++ b/pvq-test-runner/src/lib.rs @@ -1,5 +1,6 @@ use parity_scale_codec::Encode; use pvq_extension::{extensions_impl, ExtensionsExecutor, InvokeSource}; +use sp_core::crypto::{AccountId32, Ss58Codec}; #[derive(Encode)] #[allow(non_camel_case_types)] @@ -53,21 +54,28 @@ impl TestRunner { let mut input_data = Vec::new(); if program_path.contains("sum-balance") { - input_data.extend_from_slice(&0u32.encode()); - input_data.extend_from_slice(&vec![[0u8; 32], [1u8; 32]].encode()); + input_data.extend_from_slice(&21u32.encode()); + + let alice_account: [u8; 32] = + AccountId32::from_ss58check("5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY") + .expect("Failed to decode Alice's address") + .into(); + input_data.extend_from_slice(&vec![alice_account].encode()); } else if program_path.contains("total-supply") { - input_data.extend_from_slice(&0u32.encode()); + input_data.extend_from_slice(&21u32.encode()); } else if program_path.contains("transparent-call") { input_data.extend_from_slice(&4071833530116166512u64.encode()); + let alice_account = AccountId32::from_ss58check("5GrwvaEF5zXb26Fz9rcQpDWS57CtERHpNehXCPcNoHGKutQY") + .expect("Failed to decode Alice's address"); input_data.extend_from_slice( &ExtensionFungiblesFunctions::balance { - asset: 0, - who: [1u8; 32], + asset: 21u32, + who: alice_account.into(), } .encode(), ); } - + tracing::info!("Input data (hex): {}", hex::encode(&input_data)); input_data }