diff --git a/substrate/client/src/serai/in_instructions.rs b/substrate/client/src/serai/in_instructions.rs index 7b8b3a75..bfcfc521 100644 --- a/substrate/client/src/serai/in_instructions.rs +++ b/substrate/client/src/serai/in_instructions.rs @@ -40,6 +40,8 @@ impl<'a> SeraiInInstructions<'a> { } pub fn execute_batch(batch: SignedBatch) -> Vec { - Serai::unsigned::(&in_instructions::Call::::execute_batch { batch }) + Serai::unsigned(&serai_runtime::RuntimeCall::InInstructions( + in_instructions::Call::::execute_batch { batch }, + )) } } diff --git a/substrate/client/src/serai/mod.rs b/substrate/client/src/serai/mod.rs index a96d528c..432f4722 100644 --- a/substrate/client/src/serai/mod.rs +++ b/substrate/client/src/serai/mod.rs @@ -13,7 +13,6 @@ pub use sp_core::{ sr25519::{Public, Pair}, }; -pub use subxt; use subxt::{ error::Error as SubxtError, config::{ @@ -21,7 +20,6 @@ use subxt::{ substrate::{BlakeTwo256, SubstrateHeader}, extrinsic_params::BaseExtrinsicParams, }, - tx::Signer, rpc::types::{ChainBlock, ChainBlockExtrinsic}, Config as SubxtConfig, OnlineClient, }; @@ -150,41 +148,32 @@ impl Serai { Ok(Serai(OnlineClient::::from_url(url).await.map_err(SeraiError::RpcError)?)) } - fn unsigned(call: &C) -> Vec { + fn unsigned(call: &serai_runtime::RuntimeCall) -> Vec { // TODO: Should Serai purge the old transaction code AND set this to 0/1? - const TRANSACTION_VERSION: u8 = 4; + const EXTRINSIC_FORMAT_VERSION: u8 = 4; - // Protocol version - let mut bytes = vec![TRANSACTION_VERSION]; - - // Pallet index - bytes.push(u8::try_from(PalletInfo::index::

().unwrap()).unwrap()); - // Call + let mut bytes = vec![EXTRINSIC_FORMAT_VERSION]; bytes.extend(call.encode()); - - // Prefix the length - let mut complete_bytes = Compact(u32::try_from(bytes.len()).unwrap()).encode(); - complete_bytes.extend(bytes); - complete_bytes + bytes } - pub fn sign>( + pub fn sign( &self, - signer: &S, + signer: &Pair, call: &serai_runtime::RuntimeCall, nonce: u32, tip: Tip, ) -> Vec { - const SPEC_VERSION: u32 = 100; - const IMPL_VERSION: u32 = 1; - const TRANSACTION_VERSION: u8 = 4; + const SPEC_VERSION: u32 = 1; + const TX_VERSION: u32 = 1; + const EXTRINSIC_FORMAT_VERSION: u8 = 4; let era = subxt::config::substrate::Era::Immortal; let extra = (era, Compact(nonce), tip); let genesis = self.0.genesis_hash(); let mortality_checkpoint = genesis; let mut signature_payload = - (call, extra, SPEC_VERSION, IMPL_VERSION, genesis, mortality_checkpoint).encode(); + (call, extra, SPEC_VERSION, TX_VERSION, genesis, mortality_checkpoint).encode(); if signature_payload.len() > 256 { use subxt::config::Hasher; signature_payload = BlakeTwo256::hash(&signature_payload).0.to_vec(); @@ -192,19 +181,20 @@ impl Serai { let signature = signer.sign(&signature_payload); let signed = 1 << 7; - let extrinsic = - (signed + TRANSACTION_VERSION, signer.address(), signature, extra, call).encode(); - let mut res = Compact(u32::try_from(extrinsic.len()).unwrap()).encode(); - res.extend(&extrinsic); - res + (signed + EXTRINSIC_FORMAT_VERSION, signer.public(), signature, extra, call).encode() } pub async fn publish(&self, tx: &[u8]) -> Result<(), SeraiError> { + let mut length_prefixed = Compact(u32::try_from(tx.len()).unwrap()).encode(); + length_prefixed.extend(tx); self .0 .rpc() .deref() - .request::("author_submitExtrinsic", subxt::rpc::rpc_params![hex::encode(tx)]) + .request::( + "author_submitExtrinsic", + subxt::rpc::rpc_params![hex::encode(length_prefixed)], + ) .await // Drop the hash, which is the hash of the raw extrinsic, as extrinsics are allowed to share // hashes and this hash is accordingly useless/unsafe @@ -386,23 +376,3 @@ impl<'a> TemporalSerai<'a> { SeraiValidatorSets(self) } } - -#[derive(Clone)] -pub struct PairSigner(Pair, ::AccountId); -impl PairSigner { - pub fn new(pair: Pair) -> Self { - let id = pair.public(); - PairSigner(pair, id) - } -} -impl Signer for PairSigner { - fn account_id(&self) -> &::AccountId { - &self.1 - } - fn address(&self) -> ::Address { - self.1.into() - } - fn sign(&self, payload: &[u8]) -> ::Signature { - self.0.sign(payload) - } -} diff --git a/substrate/client/src/serai/validator_sets.rs b/substrate/client/src/serai/validator_sets.rs index 09dfe943..b33a5f1a 100644 --- a/substrate/client/src/serai/validator_sets.rs +++ b/substrate/client/src/serai/validator_sets.rs @@ -81,10 +81,8 @@ impl<'a> SeraiValidatorSets<'a> { } pub fn set_keys(network: NetworkId, key_pair: KeyPair, signature: Signature) -> Vec { - Serai::unsigned::(&validator_sets::Call::::set_keys { - network, - key_pair, - signature, - }) + Serai::unsigned(&serai_runtime::RuntimeCall::ValidatorSets( + validator_sets::Call::::set_keys { network, key_pair, signature }, + )) } } diff --git a/substrate/client/tests/burn.rs b/substrate/client/tests/burn.rs index 704ca2b4..4638f942 100644 --- a/substrate/client/tests/burn.rs +++ b/substrate/client/tests/burn.rs @@ -20,7 +20,7 @@ use serai_client::{ primitives::{InInstruction, InInstructionWithBalance, Batch}, }, coins::{primitives::OutInstruction, CoinsEvent}, - PairSigner, Serai, SeraiCoins, + Serai, SeraiCoins, }; mod common; @@ -91,7 +91,7 @@ serai_test!( serai, &serai .sign( - &PairSigner::new(pair), + &pair, &SeraiCoins::burn_with_instruction(instruction.clone()), 0, Default::default(), diff --git a/substrate/client/tests/common/dex.rs b/substrate/client/tests/common/dex.rs index 1f446e00..4597238d 100644 --- a/substrate/client/tests/common/dex.rs +++ b/substrate/client/tests/common/dex.rs @@ -1,6 +1,6 @@ use serai_runtime::primitives::{Coin, Amount}; -use serai_client::{Serai, SeraiDex, PairSigner}; +use serai_client::{Serai, SeraiDex}; use sp_core::{sr25519::Pair, Pair as PairTrait}; use crate::common::tx::publish_tx; @@ -17,7 +17,7 @@ pub async fn add_liquidity( let address = pair.public(); let tx = serai.sign( - &PairSigner::new(pair), + &pair, &SeraiDex::add_liquidity(coin, coin_amount, sri_amount, Amount(1), Amount(1), address.into()), nonce, Default::default(), @@ -39,7 +39,7 @@ pub async fn swap( let address = pair.public(); let tx = serai.sign( - &PairSigner::new(pair), + &pair, &SeraiDex::swap(from_coin, to_coin, amount_in, amount_out_min, address.into()), nonce, Default::default(), diff --git a/substrate/client/tests/common/tx.rs b/substrate/client/tests/common/tx.rs index a2ab4961..a8e94de4 100644 --- a/substrate/client/tests/common/tx.rs +++ b/substrate/client/tests/common/tx.rs @@ -34,7 +34,7 @@ pub async fn publish_tx(serai: &Serai, tx: &[u8]) -> [u8; 32] { }; for transaction in block.transactions() { - if transaction.0 == tx[2 ..] { + if transaction.0 == tx { return block.hash(); } } diff --git a/substrate/runtime/src/lib.rs b/substrate/runtime/src/lib.rs index f471ce34..b6950c1a 100644 --- a/substrate/runtime/src/lib.rs +++ b/substrate/runtime/src/lib.rs @@ -88,8 +88,7 @@ pub mod opaque { pub const VERSION: RuntimeVersion = RuntimeVersion { spec_name: create_runtime_str!("serai"), impl_name: create_runtime_str!("core"), - // TODO: 1? Do we prefer some level of compatibility or our own path? - spec_version: 100, + spec_version: 1, impl_version: 1, apis: RUNTIME_API_VERSIONS, transaction_version: 1, diff --git a/tests/coordinator/src/tests/sign.rs b/tests/coordinator/src/tests/sign.rs index 08ff5eb2..8d593666 100644 --- a/tests/coordinator/src/tests/sign.rs +++ b/tests/coordinator/src/tests/sign.rs @@ -12,7 +12,7 @@ use ciphersuite::{group::GroupEncoding, Ciphersuite, Secp256k1}; use dkg::Participant; use serai_client::{ - PairTrait, PairSigner, + PairTrait, primitives::{ NetworkId, Coin, Amount, Balance, BlockHash, SeraiAddress, ExternalAddress, insecure_pair_from_name, @@ -211,7 +211,7 @@ async fn sign_test() { let balance = Balance { coin: Coin::Serai, amount: Amount(1_000_000_000) }; serai .publish(&serai.sign( - &PairSigner::new(insecure_pair_from_name("Ferdie")), + &insecure_pair_from_name("Ferdie"), &SeraiCoins::transfer(address, balance), 0, Default::default(), @@ -219,7 +219,7 @@ async fn sign_test() { .await .unwrap(); - (PairSigner::new(pair), address) + (pair, address) }; #[allow(clippy::inconsistent_digit_grouping)] diff --git a/tests/full-stack/src/tests/mint_and_burn.rs b/tests/full-stack/src/tests/mint_and_burn.rs index 639c0fc3..3a5252f5 100644 --- a/tests/full-stack/src/tests/mint_and_burn.rs +++ b/tests/full-stack/src/tests/mint_and_burn.rs @@ -16,7 +16,7 @@ use serai_client::{ validator_sets::primitives::{Session, ValidatorSet}, in_instructions::primitives::Shorthand, coins::primitives::{OutInstruction, OutInstructionWithBalance}, - PairTrait, PairSigner, SeraiCoins, + PairTrait, SeraiCoins, }; use crate::tests::*; @@ -249,7 +249,7 @@ async fn mint_and_burn_test() { let balance = Balance { coin: Coin::Serai, amount: Amount(1_000_000_000) }; serai .publish(&serai.sign( - &PairSigner::new(insecure_pair_from_name("Ferdie")), + &insecure_pair_from_name("Ferdie"), &SeraiCoins::transfer(address, balance), 0, Default::default(), @@ -257,7 +257,7 @@ async fn mint_and_burn_test() { .await .unwrap(); - (PairSigner::new(pair), address) + (pair, address) }; // Send in BTC