Update to the latest subxt

Writes a custom unsigned extrinic creator due to subxt having an internal error
with the scale metadata. While the code in our scope increased, it's much more
ergonomic to our usage. We may end up rewriting most of subxt, eventually.
This commit is contained in:
Luke Parker 2023-04-15 05:23:57 -04:00
parent ce883104b7
commit 28b6bc99ac
No known key found for this signature in database
7 changed files with 105 additions and 56 deletions

91
Cargo.lock generated
View file

@ -8441,16 +8441,58 @@ dependencies = [
[[package]]
name = "scale-decode"
version = "0.4.0"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d823d4be477fc33321f93d08fb6c2698273d044f01362dc27573a750deb7c233"
checksum = "c7e5527e4b3bf079d4c0b2f253418598c380722ba37ef20fac9088081407f2b6"
dependencies = [
"parity-scale-codec",
"primitive-types",
"scale-bits",
"scale-decode-derive",
"scale-info",
"thiserror",
]
[[package]]
name = "scale-decode-derive"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b38741b2f78e4391b94eac6b102af0f6ea2b0f7fe65adb55d7f4004f507854db"
dependencies = [
"darling",
"proc-macro-crate",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "scale-encode"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "15546e5efbb45f0fc2291f7e202dee8623274c5d8bbfdf9c6886cc8b44a7ced3"
dependencies = [
"parity-scale-codec",
"primitive-types",
"scale-bits",
"scale-encode-derive",
"scale-info",
"thiserror",
]
[[package]]
name = "scale-encode-derive"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd983cf0a9effd76138554ead18a6de542d1af175ac12fd5e91836c5c0268082"
dependencies = [
"darling",
"proc-macro-crate",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "scale-info"
version = "2.5.0"
@ -8479,15 +8521,16 @@ dependencies = [
[[package]]
name = "scale-value"
version = "0.6.0"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16a5e7810815bd295da73e4216d1dfbced3c7c7c7054d70fa5f6e4c58123fff4"
checksum = "11f549769261561e6764218f847e500588f9a79a289de49ce92f9e26642a3574"
dependencies = [
"either",
"frame-metadata",
"parity-scale-codec",
"scale-bits",
"scale-decode",
"scale-encode",
"scale-info",
"serde",
"thiserror",
@ -9363,16 +9406,16 @@ dependencies = [
[[package]]
name = "sp-core-hashing"
version = "6.0.0"
version = "8.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cbc2d1947252b7a4e403b0a260f596920443742791765ec111daa2bbf98eff25"
checksum = "27449abdfbe41b473e625bce8113745e81d65777dd1d5a8462cf24137930dad8"
dependencies = [
"blake2",
"blake2b_simd",
"byteorder",
"digest 0.10.6",
"sha2 0.10.6",
"sha3",
"sp-std 6.0.0",
"sp-std 7.0.0",
"twox-hash",
]
@ -9629,9 +9672,9 @@ source = "git+https://github.com/serai-dex/substrate#db8ca563accf52d0a3e0aa68f9c
[[package]]
name = "sp-std"
version = "6.0.0"
version = "7.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af0ee286f98455272f64ac5bb1384ff21ac029fbb669afbaf48477faff12760e"
checksum = "1de8eef39962b5b97478719c493bed2926cf70cb621005bbf68ebe58252ff986"
[[package]]
name = "sp-storage"
@ -10010,13 +10053,14 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142"
[[package]]
name = "subxt"
version = "0.27.1"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "54639dba6a113584083968b6a8f457dedae612abe1bd214762101ca29f12e332"
checksum = "53b9c4ddefcb2d87eb18a6336f65635c29208f766d0deefaa2a1a19f7426a993"
dependencies = [
"base58",
"blake2",
"derivative",
"either",
"frame-metadata",
"futures",
"getrandom 0.2.9",
@ -10028,11 +10072,12 @@ dependencies = [
"primitive-types",
"scale-bits",
"scale-decode",
"scale-encode",
"scale-info",
"scale-value",
"serde",
"serde_json",
"sp-core-hashing 6.0.0",
"sp-core-hashing 8.0.0",
"subxt-macro",
"subxt-metadata",
"thiserror",
@ -10041,9 +10086,9 @@ dependencies = [
[[package]]
name = "subxt-codegen"
version = "0.27.1"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b8e86cb719003f1cedf2710a6e55ca4c37aba4c989bbd3b81dd1c52af9e4827e"
checksum = "e924f41069e9273236398ff89662d6d336468a5d94faac812129d44547db0e7f"
dependencies = [
"darling",
"frame-metadata",
@ -10051,20 +10096,20 @@ dependencies = [
"hex",
"jsonrpsee",
"parity-scale-codec",
"proc-macro-error",
"proc-macro2",
"quote",
"scale-info",
"subxt-metadata",
"syn 1.0.109",
"thiserror",
"tokio",
]
[[package]]
name = "subxt-macro"
version = "0.27.1"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74c08de402a78c4c06c3ee3702c80e519efdcb65911348e018b6998d04404916"
checksum = "ced0b043a069ee039f8700d3dfda01be156e4229c82277c305bc8e79a7dd855d"
dependencies = [
"darling",
"proc-macro-error",
@ -10074,14 +10119,14 @@ dependencies = [
[[package]]
name = "subxt-metadata"
version = "0.27.1"
version = "0.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2593ab5f53435e6352675af4f9851342607f37785d84c7a3fb3139550d3c35f0"
checksum = "18be3b8f4308fe7369ee1df66ae59c2eca79de20eab57b0f41c75736e843300f"
dependencies = [
"frame-metadata",
"parity-scale-codec",
"scale-info",
"sp-core-hashing 6.0.0",
"sp-core-hashing 8.0.0",
]
[[package]]
@ -12044,9 +12089,9 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
[[package]]
name = "yap"
version = "0.7.2"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5fc77f52dc9e9b10d55d3f4462c3b7fc393c4f17975d641542833ab2d3bc26ef"
checksum = "e2a7eb6d82a11e4d0b8e6bda8347169aff4ccd8235d039bba7c47482d977dcf7"
[[package]]
name = "yasna"

View file

@ -21,7 +21,7 @@ scale-info = { version = "2", optional = true }
serai-runtime = { path = "../runtime", version = "0.1" }
sp-core = { git = "https://github.com/serai-dex/substrate" }
subxt = { version = "0.27", default-features = false, features = ["jsonrpsee-ws"], optional = true }
subxt = { version = "0.28", default-features = false, features = ["jsonrpsee-ws"], optional = true }
bitcoin = { version = "0.30", optional = true }

View file

@ -2,11 +2,9 @@ use serai_runtime::{in_instructions, InInstructions, Runtime};
pub use in_instructions::primitives;
use primitives::SignedBatch;
use subxt::{tx, utils::Encoded};
use subxt::utils::Encoded;
use crate::{Serai, SeraiError, scale_composite};
const PALLET: &str = "InInstructions";
use crate::{Serai, SeraiError};
pub type InInstructionsEvent = in_instructions::Event<Runtime>;
@ -23,10 +21,6 @@ impl Serai {
}
pub fn execute_batch(&self, batch: SignedBatch) -> Result<Encoded, SeraiError> {
self.unsigned(&tx::dynamic(
PALLET,
"execute_batch",
scale_composite(in_instructions::Call::<Runtime>::execute_batch { batch }),
))
self.unsigned::<InInstructions, _>(&in_instructions::Call::<Runtime>::execute_batch { batch })
}
}

View file

@ -2,8 +2,7 @@ use thiserror::Error;
use scale::{Encode, Decode};
mod scale_value;
pub(crate) use scale_value::{scale_value, scale_composite};
use subxt::ext::scale_value::Value;
pub(crate) use scale_value::{Value, Composite, scale_value, scale_composite};
use sp_core::{Pair as PairTrait, sr25519::Pair};
@ -16,7 +15,7 @@ use subxt::{
substrate::{BlakeTwo256, SubstrateHeader},
extrinsic_params::{BaseExtrinsicParams, BaseExtrinsicParamsBuilder},
},
tx::{Signer, DynamicTxPayload, TxClient},
tx::{Signer, Payload, TxClient},
rpc::types::ChainBlock,
Config as SubxtConfig, OnlineClient,
};
@ -89,9 +88,7 @@ impl Serai {
debug_assert!(storage.validate(&address).is_ok(), "invalid storage address");
storage
.at(Some(block.into()))
.await
.map_err(SeraiError::RpcError)?
.at(block.into())
.fetch(&address)
.await
.map_err(SeraiError::RpcError)?
@ -105,8 +102,7 @@ impl Serai {
filter: impl Fn(&E) -> bool,
) -> Result<Vec<E>, SeraiError> {
let mut res = vec![];
for event in self.0.events().at(Some(block.into())).await.map_err(SeraiError::RpcError)?.iter()
{
for event in self.0.events().at(block.into()).await.map_err(SeraiError::RpcError)?.iter() {
let event = event.map_err(|_| SeraiError::InvalidRuntime)?;
if PalletInfo::index::<P>().unwrap() == usize::from(event.pallet_index()) {
let mut with_variant: &[u8] =
@ -198,17 +194,28 @@ impl Serai {
.map_err(SeraiError::RpcError)
}
pub fn unsigned(&self, payload: &DynamicTxPayload<'static>) -> Result<Encoded, SeraiError> {
TxClient::new(self.0.offline())
.create_unsigned(payload)
.map(|tx| Encoded(tx.into_encoded()))
.map_err(|_| SeraiError::InvalidRuntime)
pub fn unsigned<P: 'static, C: Encode>(&self, call: &C) -> Result<Encoded, SeraiError> {
// TODO: Should Serai purge the old transaction code AND set this to 0/1?
const TRANSACTION_VERSION: u8 = 4;
// Protocol version
let mut bytes = vec![TRANSACTION_VERSION];
// Pallet index
bytes.push(u8::try_from(PalletInfo::index::<P>().unwrap()).unwrap());
// Call
bytes.extend(call.encode());
// Prefix the length
let mut complete_bytes = scale::Compact(u32::try_from(bytes.len()).unwrap()).encode();
complete_bytes.extend(bytes);
Ok(Encoded(complete_bytes))
}
pub fn sign<S: Send + Sync + Signer<SeraiConfig>>(
&self,
signer: &S,
payload: &DynamicTxPayload<'static>,
payload: &Payload<Composite<()>>,
nonce: u32,
params: BaseExtrinsicParamsBuilder<SeraiConfig, Tip>,
) -> Result<Encoded, SeraiError> {

View file

@ -1,6 +1,9 @@
use ::scale::Encode;
use scale_info::{MetaType, TypeInfo, Registry, PortableRegistry};
use subxt::ext::scale_value::{Composite, ValueDef, Value, scale};
use subxt::ext::scale_value;
pub(crate) use scale_value::{Composite, Value};
use scale_value::{ValueDef, scale};
pub(crate) fn scale_value<V: 'static + Encode + TypeInfo>(value: V) -> Value {
let mut registry = Registry::new();

View file

@ -6,9 +6,9 @@ use serai_runtime::{
pub use tokens::primitives;
use primitives::OutInstruction;
use subxt::tx::{self, DynamicTxPayload};
use subxt::tx::Payload;
use crate::{Serai, SeraiError, scale_value, scale_composite};
use crate::{Serai, SeraiError, Composite, scale_value, scale_composite};
const PALLET: &str = "Tokens";
@ -54,8 +54,8 @@ impl Serai {
))
}
pub fn burn(balance: Balance, instruction: OutInstruction) -> DynamicTxPayload<'static> {
tx::dynamic(
pub fn burn(balance: Balance, instruction: OutInstruction) -> Payload<Composite<()>> {
Payload::new(
PALLET,
"burn",
scale_composite(tokens::Call::<Runtime>::burn { balance, instruction }),

View file

@ -2,9 +2,9 @@ use serai_runtime::{validator_sets, ValidatorSets, Runtime};
pub use validator_sets::primitives;
use primitives::{ValidatorSet, ValidatorSetData, KeyPair};
use subxt::tx::{self, DynamicTxPayload};
use subxt::tx::Payload;
use crate::{primitives::NetworkId, Serai, SeraiError, scale_value, scale_composite};
use crate::{primitives::NetworkId, Serai, SeraiError, Composite, scale_value, scale_composite};
const PALLET: &str = "ValidatorSets";
@ -58,8 +58,8 @@ impl Serai {
.await
}
pub fn vote(network: NetworkId, key_pair: KeyPair) -> DynamicTxPayload<'static> {
tx::dynamic(
pub fn vote(network: NetworkId, key_pair: KeyPair) -> Payload<Composite<()>> {
Payload::new(
PALLET,
"vote",
scale_composite(validator_sets::Call::<Runtime>::vote { network, key_pair }),