Support constructing and submitting V5 transactions (#1931)

* TransactionExtensions basic support for V5 VerifySignature and renames

* WIP: subxt-core v5 transaction support

* Subxt to support V5 extrinsics

* WIP tests failing with wsm trap error

* Actually encode mortality to fix tx encode issue

* fmt

* rename to sign_with_account_and_signature

* Add explicit methods for v4 and v5 ext construction

* clippy

* fix wasm example and no mut self where not needed

* fix doc example

* another doc fix

* Add tests for tx encoding and fix v5 encode issue

* add copyright and todo

* refactor APIs to have clear v4/v5 split in core and slightly nicer split in subxt proper

* rename Partial/SubmittableExtrinsic to *Transaction

* Remove SignerT::address since it's not needed

* doc fixes

* fmt

* doc fixes

* Fix comment number

* Clarify panic behaviour of inject_signature

* fmt
This commit is contained in:
James Wilson
2025-03-11 11:14:27 +00:00
committed by GitHub
parent dcb9c27fcc
commit b6b9ac65c7
50 changed files with 1368 additions and 781 deletions
+45 -16
View File
@@ -1,6 +1,6 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 3
version = 4
[[package]]
name = "addr2line"
@@ -1784,15 +1784,6 @@ dependencies = [
"thiserror 1.0.58",
]
[[package]]
name = "polkadot-sdk"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb819108697967452fa6d8d96ab4c0d48cbaa423b3156499dcb24f1cf95d6775"
dependencies = [
"sp-crypto-hashing",
]
[[package]]
name = "poly1305"
version = "0.8.0"
@@ -2485,15 +2476,11 @@ dependencies = [
"async-trait",
"derive-where",
"either",
"finito",
"frame-metadata",
"futures",
"getrandom",
"hex",
"impl-serde",
"jsonrpsee",
"parity-scale-codec",
"polkadot-sdk",
"primitive-types",
"scale-bits",
"scale-decode",
@@ -2502,10 +2489,12 @@ dependencies = [
"scale-value",
"serde",
"serde_json",
"sp-crypto-hashing",
"subxt-core",
"subxt-lightclient",
"subxt-macro",
"subxt-metadata",
"subxt-rpcs",
"thiserror 2.0.11",
"tokio",
"tracing",
@@ -2544,7 +2533,6 @@ dependencies = [
"impl-serde",
"keccak-hash",
"parity-scale-codec",
"polkadot-sdk",
"primitive-types",
"scale-bits",
"scale-decode",
@@ -2553,6 +2541,7 @@ dependencies = [
"scale-value",
"serde",
"serde_json",
"sp-crypto-hashing",
"subxt-metadata",
"thiserror 2.0.11",
"tracing",
@@ -2605,11 +2594,36 @@ dependencies = [
"frame-metadata",
"hashbrown 0.14.5",
"parity-scale-codec",
"polkadot-sdk",
"scale-info",
"sp-crypto-hashing",
"thiserror 2.0.11",
]
[[package]]
name = "subxt-rpcs"
version = "0.39.0"
dependencies = [
"derive-where",
"finito",
"frame-metadata",
"futures",
"getrandom",
"hex",
"impl-serde",
"jsonrpsee",
"parity-scale-codec",
"primitive-types",
"serde",
"serde_json",
"subxt-core",
"subxt-lightclient",
"thiserror 2.0.11",
"tokio-util",
"tracing",
"url",
"wasm-bindgen-futures",
]
[[package]]
name = "subxt-utils-fetchmetadata"
version = "0.39.0"
@@ -2765,6 +2779,20 @@ dependencies = [
"tokio",
]
[[package]]
name = "tokio-util"
version = "0.7.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078"
dependencies = [
"bytes",
"futures-core",
"futures-io",
"futures-sink",
"pin-project-lite",
"tokio",
]
[[package]]
name = "toml_datetime"
version = "0.6.8"
@@ -2821,6 +2849,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675"
dependencies = [
"cfg-if",
"digest 0.10.7",
"rand",
"static_assertions",
]
+8 -8
View File
@@ -6,7 +6,7 @@ use subxt::{OnlineClient, PolkadotConfig};
use subxt::config::DefaultExtrinsicParamsBuilder;
use subxt::ext::codec::{Decode, Encode};
use subxt::tx::Payload as _;
use subxt::tx::SubmittableExtrinsic;
use subxt::tx::SubmittableTransaction;
use subxt::utils::{AccountId32, MultiSignature};
use crate::services::{extension_signature_for_extrinsic, get_accounts, polkadot, Account};
@@ -51,7 +51,7 @@ pub enum SigningStage {
pub enum SubmittingStage {
Initial {
signed_extrinsic: SubmittableExtrinsic<PolkadotConfig, OnlineClient<PolkadotConfig>>,
signed_extrinsic: SubmittableTransaction<PolkadotConfig, OnlineClient<PolkadotConfig>>,
},
Submitting,
Success {
@@ -70,7 +70,7 @@ pub enum Message {
SignWithAccount(usize),
ReceivedSignature(
MultiSignature,
SubmittableExtrinsic<PolkadotConfig, OnlineClient<PolkadotConfig>>,
SubmittableTransaction<PolkadotConfig, OnlineClient<PolkadotConfig>>,
),
SubmitSigned,
ExtrinsicFinalized {
@@ -166,15 +166,15 @@ impl Component for SigningExamplesComponent {
let params = DefaultExtrinsicParamsBuilder::new()
.nonce(account_nonce)
.build();
let Ok(partial_signed) =
api.tx().create_partial_signed_offline(&remark_call, params)
let Ok(mut partial_signed) =
api.tx().create_partial_offline(&remark_call, params)
else {
return Message::Error(anyhow!("PartialExtrinsic creation failed"));
return Message::Error(anyhow!("PartialTransaction creation failed"));
};
// Apply the signature
let signed_extrinsic = partial_signed
.sign_with_address_and_signature(&account_id.into(), &multi_signature);
.sign_with_account_and_signature(&account_id, &multi_signature);
// check the TX validity (to debug in the js console if the extrinsic would work)
let dry_res = signed_extrinsic.validate().await;
@@ -394,7 +394,7 @@ impl Component for SigningExamplesComponent {
}
async fn submit_wait_finalized_and_get_extrinsic_success_event(
extrinsic: SubmittableExtrinsic<PolkadotConfig, OnlineClient<PolkadotConfig>>,
extrinsic: SubmittableTransaction<PolkadotConfig, OnlineClient<PolkadotConfig>>,
) -> Result<polkadot::system::events::ExtrinsicSuccess, anyhow::Error> {
let events = extrinsic
.submit_and_watch()
+1 -1
View File
@@ -140,7 +140,7 @@ pub async fn extension_signature_for_extrinsic(
let signed_extensions: Vec<String> = api
.metadata()
.extrinsic()
.signed_extensions()
.transaction_extensions()
.iter()
.map(|e| e.identifier().to_string())
.collect();