Add traits necessary for serai_abi::Transaction to be usable in-runtime

This commit is contained in:
Luke Parker
2025-02-26 05:05:35 -05:00
parent dff9a04a8c
commit 121a48b55c
13 changed files with 503 additions and 305 deletions

249
Cargo.lock generated
View File

@@ -1052,7 +1052,7 @@ dependencies = [
"bitflags 2.8.0", "bitflags 2.8.0",
"cexpr", "cexpr",
"clang-sys", "clang-sys",
"itertools 0.10.5", "itertools 0.12.1",
"lazy_static", "lazy_static",
"lazycell", "lazycell",
"proc-macro2", "proc-macro2",
@@ -2685,7 +2685,7 @@ checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f"
[[package]] [[package]]
name = "fork-tree" name = "fork-tree"
version = "13.0.1" version = "13.0.1"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
] ]
@@ -2718,7 +2718,7 @@ checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa"
[[package]] [[package]]
name = "frame-benchmarking" name = "frame-benchmarking"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-support", "frame-support",
"frame-support-procedural", "frame-support-procedural",
@@ -2742,7 +2742,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-executive" name = "frame-executive"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-support", "frame-support",
"frame-system", "frame-system",
@@ -2771,7 +2771,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-support" name = "frame-support"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"bitflags 1.3.2", "bitflags 1.3.2",
@@ -2806,7 +2806,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-support-procedural" name = "frame-support-procedural"
version = "31.0.0" version = "31.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"Inflector", "Inflector",
"cfg-expr", "cfg-expr",
@@ -2825,7 +2825,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-support-procedural-tools" name = "frame-support-procedural-tools"
version = "13.0.1" version = "13.0.1"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-support-procedural-tools-derive", "frame-support-procedural-tools-derive",
"proc-macro-crate 3.2.0", "proc-macro-crate 3.2.0",
@@ -2837,7 +2837,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-support-procedural-tools-derive" name = "frame-support-procedural-tools-derive"
version = "12.0.0" version = "12.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -2847,7 +2847,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-system" name = "frame-system"
version = "39.1.0" version = "39.1.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"frame-support", "frame-support",
@@ -2866,7 +2866,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-system-rpc-runtime-api" name = "frame-system-rpc-runtime-api"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"sp-api", "sp-api",
@@ -2875,7 +2875,7 @@ dependencies = [
[[package]] [[package]]
name = "frame-try-runtime" name = "frame-try-runtime"
version = "0.45.0" version = "0.45.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-support", "frame-support",
"parity-scale-codec", "parity-scale-codec",
@@ -5618,7 +5618,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-authorship" name = "pallet-authorship"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-support", "frame-support",
"frame-system", "frame-system",
@@ -5631,7 +5631,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-babe" name = "pallet-babe"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-benchmarking", "frame-benchmarking",
"frame-support", "frame-support",
@@ -5654,7 +5654,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-grandpa" name = "pallet-grandpa"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-benchmarking", "frame-benchmarking",
"frame-support", "frame-support",
@@ -5676,7 +5676,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-session" name = "pallet-session"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-support", "frame-support",
"frame-system", "frame-system",
@@ -5697,7 +5697,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-timestamp" name = "pallet-timestamp"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-benchmarking", "frame-benchmarking",
"frame-support", "frame-support",
@@ -5715,7 +5715,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-transaction-payment" name = "pallet-transaction-payment"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-benchmarking", "frame-benchmarking",
"frame-support", "frame-support",
@@ -5731,7 +5731,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-transaction-payment-rpc" name = "pallet-transaction-payment-rpc"
version = "42.0.0" version = "42.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"jsonrpsee", "jsonrpsee",
"pallet-transaction-payment-rpc-runtime-api", "pallet-transaction-payment-rpc-runtime-api",
@@ -5747,7 +5747,7 @@ dependencies = [
[[package]] [[package]]
name = "pallet-transaction-payment-rpc-runtime-api" name = "pallet-transaction-payment-rpc-runtime-api"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"pallet-transaction-payment", "pallet-transaction-payment",
"parity-scale-codec", "parity-scale-codec",
@@ -6306,7 +6306,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b" checksum = "d0f3e5beed80eb580c68e2c600937ac2c4eedabdfd5ef1e5b7ea4f3fba84497b"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"itertools 0.10.5", "itertools 0.13.0",
"log", "log",
"multimap", "multimap",
"once_cell", "once_cell",
@@ -6326,7 +6326,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3" checksum = "157c5a9d7ea5c2ed2d9fb8f495b64759f7816c7eaea54ba3978f0d63000162e3"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"itertools 0.10.5", "itertools 0.13.0",
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.98", "syn 2.0.98",
@@ -7076,7 +7076,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-allocator" name = "sc-allocator"
version = "30.0.0" version = "30.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"log", "log",
"sp-core", "sp-core",
@@ -7087,7 +7087,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-authority-discovery" name = "sc-authority-discovery"
version = "0.48.0" version = "0.48.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures", "futures",
@@ -7117,7 +7117,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-basic-authorship" name = "sc-basic-authorship"
version = "0.48.0" version = "0.48.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"futures", "futures",
"futures-timer", "futures-timer",
@@ -7139,7 +7139,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-block-builder" name = "sc-block-builder"
version = "0.43.0" version = "0.43.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"sp-api", "sp-api",
@@ -7154,7 +7154,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-chain-spec" name = "sc-chain-spec"
version = "41.0.0" version = "41.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"log", "log",
@@ -7180,7 +7180,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-chain-spec-derive" name = "sc-chain-spec-derive"
version = "12.0.0" version = "12.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"proc-macro-crate 3.2.0", "proc-macro-crate 3.2.0",
"proc-macro2", "proc-macro2",
@@ -7191,7 +7191,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-cli" name = "sc-cli"
version = "0.50.0" version = "0.50.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"chrono", "chrono",
@@ -7232,7 +7232,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-client-api" name = "sc-client-api"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"fnv", "fnv",
"futures", "futures",
@@ -7258,7 +7258,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-client-db" name = "sc-client-db"
version = "0.45.0" version = "0.45.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"hash-db", "hash-db",
"kvdb", "kvdb",
@@ -7284,7 +7284,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-consensus" name = "sc-consensus"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures", "futures",
@@ -7308,7 +7308,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-consensus-babe" name = "sc-consensus-babe"
version = "0.48.0" version = "0.48.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"fork-tree", "fork-tree",
@@ -7344,7 +7344,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-consensus-epochs" name = "sc-consensus-epochs"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"fork-tree", "fork-tree",
"parity-scale-codec", "parity-scale-codec",
@@ -7357,7 +7357,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-consensus-grandpa" name = "sc-consensus-grandpa"
version = "0.33.0" version = "0.33.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"ahash", "ahash",
"array-bytes", "array-bytes",
@@ -7401,7 +7401,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-consensus-slots" name = "sc-consensus-slots"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures", "futures",
@@ -7424,7 +7424,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-executor" name = "sc-executor"
version = "0.41.0" version = "0.41.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"parking_lot 0.12.3", "parking_lot 0.12.3",
@@ -7446,7 +7446,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-executor-common" name = "sc-executor-common"
version = "0.36.0" version = "0.36.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"sc-allocator", "sc-allocator",
"sp-maybe-compressed-blob", "sp-maybe-compressed-blob",
@@ -7458,7 +7458,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-executor-wasmtime" name = "sc-executor-wasmtime"
version = "0.36.0" version = "0.36.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"log", "log",
@@ -7474,7 +7474,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-informant" name = "sc-informant"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"console", "console",
"futures", "futures",
@@ -7491,7 +7491,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-keystore" name = "sc-keystore"
version = "34.0.0" version = "34.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"parking_lot 0.12.3", "parking_lot 0.12.3",
@@ -7505,7 +7505,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-network" name = "sc-network"
version = "0.48.0" version = "0.48.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"async-channel", "async-channel",
@@ -7551,7 +7551,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-network-common" name = "sc-network-common"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"bitflags 1.3.2", "bitflags 1.3.2",
"parity-scale-codec", "parity-scale-codec",
@@ -7562,7 +7562,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-network-gossip" name = "sc-network-gossip"
version = "0.48.0" version = "0.48.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"ahash", "ahash",
"futures", "futures",
@@ -7581,7 +7581,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-network-light" name = "sc-network-light"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"async-channel", "async-channel",
@@ -7602,7 +7602,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-network-sync" name = "sc-network-sync"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"async-channel", "async-channel",
@@ -7637,7 +7637,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-network-transactions" name = "sc-network-transactions"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"futures", "futures",
@@ -7656,7 +7656,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-network-types" name = "sc-network-types"
version = "0.15.0" version = "0.15.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"bs58", "bs58",
"ed25519-dalek", "ed25519-dalek",
@@ -7674,7 +7674,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-offchain" name = "sc-offchain"
version = "43.0.0" version = "43.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"futures", "futures",
"num_cpus", "num_cpus",
@@ -7698,7 +7698,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-proposer-metrics" name = "sc-proposer-metrics"
version = "0.18.0" version = "0.18.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"log", "log",
"substrate-prometheus-endpoint", "substrate-prometheus-endpoint",
@@ -7707,7 +7707,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-rpc" name = "sc-rpc"
version = "43.0.0" version = "43.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"futures", "futures",
"jsonrpsee", "jsonrpsee",
@@ -7737,7 +7737,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-rpc-api" name = "sc-rpc-api"
version = "0.47.0" version = "0.47.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"jsonrpsee", "jsonrpsee",
"parity-scale-codec", "parity-scale-codec",
@@ -7756,7 +7756,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-rpc-server" name = "sc-rpc-server"
version = "20.0.0" version = "20.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"dyn-clone", "dyn-clone",
"forwarded-header-value", "forwarded-header-value",
@@ -7780,7 +7780,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-rpc-spec-v2" name = "sc-rpc-spec-v2"
version = "0.48.0" version = "0.48.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"futures", "futures",
@@ -7812,7 +7812,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-service" name = "sc-service"
version = "0.49.0" version = "0.49.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"directories", "directories",
@@ -7875,7 +7875,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-state-db" name = "sc-state-db"
version = "0.37.0" version = "0.37.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"log", "log",
"parity-scale-codec", "parity-scale-codec",
@@ -7886,7 +7886,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-sysinfo" name = "sc-sysinfo"
version = "41.0.0" version = "41.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"derive_more", "derive_more",
"futures", "futures",
@@ -7907,7 +7907,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-telemetry" name = "sc-telemetry"
version = "28.0.0" version = "28.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"chrono", "chrono",
"futures", "futures",
@@ -7927,7 +7927,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-tracing" name = "sc-tracing"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"chrono", "chrono",
"console", "console",
@@ -7954,7 +7954,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-tracing-proc-macro" name = "sc-tracing-proc-macro"
version = "11.0.0" version = "11.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"proc-macro-crate 3.2.0", "proc-macro-crate 3.2.0",
"proc-macro2", "proc-macro2",
@@ -7965,7 +7965,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-transaction-pool" name = "sc-transaction-pool"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures", "futures",
@@ -7996,7 +7996,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-transaction-pool-api" name = "sc-transaction-pool-api"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures", "futures",
@@ -8012,7 +8012,7 @@ dependencies = [
[[package]] [[package]]
name = "sc-utils" name = "sc-utils"
version = "18.0.0" version = "18.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-channel", "async-channel",
"futures", "futures",
@@ -8266,9 +8266,11 @@ version = "0.1.0"
dependencies = [ dependencies = [
"bitvec", "bitvec",
"borsh", "borsh",
"frame-support",
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
"serai-primitives", "serai-primitives",
"serde",
"sp-core", "sp-core",
"sp-runtime", "sp-runtime",
] ]
@@ -8880,6 +8882,7 @@ dependencies = [
"borsh", "borsh",
"ciphersuite", "ciphersuite",
"dkg", "dkg",
"parity-scale-codec",
"sp-core", "sp-core",
"zeroize", "zeroize",
] ]
@@ -9192,38 +9195,12 @@ dependencies = [
"frame-executive", "frame-executive",
"frame-support", "frame-support",
"frame-system", "frame-system",
"frame-system-rpc-runtime-api",
"hashbrown 0.15.2",
"pallet-authorship",
"pallet-babe",
"pallet-grandpa",
"pallet-timestamp",
"pallet-transaction-payment",
"pallet-transaction-payment-rpc-runtime-api",
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
"serai-abi", "serai-abi",
"serai-coins-pallet",
"serai-dex-pallet",
"serai-economic-security-pallet",
"serai-emissions-pallet",
"serai-genesis-liquidity-pallet",
"serai-in-instructions-pallet",
"serai-primitives",
"serai-signals-pallet",
"serai-validator-sets-pallet",
"sp-api", "sp-api",
"sp-authority-discovery",
"sp-block-builder",
"sp-consensus-babe",
"sp-consensus-grandpa",
"sp-core", "sp-core",
"sp-inherents",
"sp-offchain",
"sp-runtime", "sp-runtime",
"sp-session",
"sp-std",
"sp-transaction-pool",
"sp-version", "sp-version",
"substrate-wasm-builder", "substrate-wasm-builder",
] ]
@@ -9583,7 +9560,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-api" name = "sp-api"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"hash-db", "hash-db",
"log", "log",
@@ -9604,7 +9581,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-api-proc-macro" name = "sp-api-proc-macro"
version = "21.0.0" version = "21.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"Inflector", "Inflector",
"blake2", "blake2",
@@ -9618,7 +9595,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-application-crypto" name = "sp-application-crypto"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
@@ -9630,7 +9607,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-arithmetic" name = "sp-arithmetic"
version = "26.0.0" version = "26.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"integer-sqrt", "integer-sqrt",
"num-traits", "num-traits",
@@ -9643,7 +9620,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-authority-discovery" name = "sp-authority-discovery"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
@@ -9655,7 +9632,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-block-builder" name = "sp-block-builder"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"sp-api", "sp-api",
"sp-inherents", "sp-inherents",
@@ -9665,7 +9642,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-blockchain" name = "sp-blockchain"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"futures", "futures",
"parity-scale-codec", "parity-scale-codec",
@@ -9684,7 +9661,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-consensus" name = "sp-consensus"
version = "0.41.0" version = "0.41.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"futures", "futures",
@@ -9699,7 +9676,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-consensus-babe" name = "sp-consensus-babe"
version = "0.41.0" version = "0.41.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"parity-scale-codec", "parity-scale-codec",
@@ -9717,7 +9694,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-consensus-grandpa" name = "sp-consensus-grandpa"
version = "22.0.0" version = "22.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"finality-grandpa", "finality-grandpa",
"log", "log",
@@ -9734,7 +9711,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-consensus-slots" name = "sp-consensus-slots"
version = "0.41.0" version = "0.41.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
@@ -9745,7 +9722,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-core" name = "sp-core"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"array-bytes", "array-bytes",
"bitflags 1.3.2", "bitflags 1.3.2",
@@ -9786,7 +9763,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-crypto-hashing" name = "sp-crypto-hashing"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"blake2b_simd", "blake2b_simd",
"byteorder", "byteorder",
@@ -9797,7 +9774,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-crypto-hashing-proc-macro" name = "sp-crypto-hashing-proc-macro"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"quote", "quote",
"sp-crypto-hashing", "sp-crypto-hashing",
@@ -9807,7 +9784,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-database" name = "sp-database"
version = "10.0.0" version = "10.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"kvdb", "kvdb",
"parking_lot 0.12.3", "parking_lot 0.12.3",
@@ -9816,7 +9793,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-debug-derive" name = "sp-debug-derive"
version = "14.0.0" version = "14.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@@ -9826,7 +9803,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-externalities" name = "sp-externalities"
version = "0.30.0" version = "0.30.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"environmental", "environmental",
"parity-scale-codec", "parity-scale-codec",
@@ -9836,7 +9813,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-genesis-builder" name = "sp-genesis-builder"
version = "0.16.0" version = "0.16.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
@@ -9848,7 +9825,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-inherents" name = "sp-inherents"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"impl-trait-for-tuples", "impl-trait-for-tuples",
@@ -9861,7 +9838,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-io" name = "sp-io"
version = "39.0.0" version = "39.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"bytes", "bytes",
"log", "log",
@@ -9882,7 +9859,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-keyring" name = "sp-keyring"
version = "40.0.0" version = "40.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"sp-core", "sp-core",
"sp-runtime", "sp-runtime",
@@ -9892,7 +9869,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-keystore" name = "sp-keystore"
version = "0.41.0" version = "0.41.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"parking_lot 0.12.3", "parking_lot 0.12.3",
@@ -9903,7 +9880,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-maybe-compressed-blob" name = "sp-maybe-compressed-blob"
version = "11.0.0" version = "11.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"thiserror 2.0.11", "thiserror 2.0.11",
"zstd 0.13.2", "zstd 0.13.2",
@@ -9912,7 +9889,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-metadata-ir" name = "sp-metadata-ir"
version = "0.8.0" version = "0.8.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-metadata", "frame-metadata",
"parity-scale-codec", "parity-scale-codec",
@@ -9922,7 +9899,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-offchain" name = "sp-offchain"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"sp-api", "sp-api",
"sp-core", "sp-core",
@@ -9932,7 +9909,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-panic-handler" name = "sp-panic-handler"
version = "13.0.1" version = "13.0.1"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"backtrace", "backtrace",
"regex", "regex",
@@ -9941,7 +9918,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-rpc" name = "sp-rpc"
version = "33.0.0" version = "33.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"rustc-hash 1.1.0", "rustc-hash 1.1.0",
"serde", "serde",
@@ -9951,7 +9928,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-runtime" name = "sp-runtime"
version = "40.1.0" version = "40.1.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"either", "either",
"hash256-std-hasher", "hash256-std-hasher",
@@ -9977,7 +9954,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-runtime-interface" name = "sp-runtime-interface"
version = "29.0.0" version = "29.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"bytes", "bytes",
"impl-trait-for-tuples", "impl-trait-for-tuples",
@@ -9995,7 +9972,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-runtime-interface-proc-macro" name = "sp-runtime-interface-proc-macro"
version = "18.0.0" version = "18.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"Inflector", "Inflector",
"expander", "expander",
@@ -10008,7 +9985,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-session" name = "sp-session"
version = "37.0.0" version = "37.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"scale-info", "scale-info",
@@ -10022,7 +9999,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-staking" name = "sp-staking"
version = "37.0.0" version = "37.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"impl-trait-for-tuples", "impl-trait-for-tuples",
"parity-scale-codec", "parity-scale-codec",
@@ -10035,7 +10012,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-state-machine" name = "sp-state-machine"
version = "0.44.0" version = "0.44.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"hash-db", "hash-db",
"log", "log",
@@ -10055,12 +10032,12 @@ dependencies = [
[[package]] [[package]]
name = "sp-std" name = "sp-std"
version = "14.0.0" version = "14.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
[[package]] [[package]]
name = "sp-storage" name = "sp-storage"
version = "22.0.0" version = "22.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"impl-serde", "impl-serde",
"parity-scale-codec", "parity-scale-codec",
@@ -10072,7 +10049,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-timestamp" name = "sp-timestamp"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"parity-scale-codec", "parity-scale-codec",
@@ -10084,7 +10061,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-tracing" name = "sp-tracing"
version = "17.0.1" version = "17.0.1"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"tracing", "tracing",
@@ -10095,7 +10072,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-transaction-pool" name = "sp-transaction-pool"
version = "35.0.0" version = "35.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"sp-api", "sp-api",
"sp-runtime", "sp-runtime",
@@ -10104,7 +10081,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-trie" name = "sp-trie"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"ahash", "ahash",
"hash-db", "hash-db",
@@ -10126,7 +10103,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-version" name = "sp-version"
version = "38.0.0" version = "38.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"impl-serde", "impl-serde",
"parity-scale-codec", "parity-scale-codec",
@@ -10143,7 +10120,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-version-proc-macro" name = "sp-version-proc-macro"
version = "15.0.0" version = "15.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"parity-scale-codec", "parity-scale-codec",
"proc-macro-warning", "proc-macro-warning",
@@ -10155,7 +10132,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-wasm-interface" name = "sp-wasm-interface"
version = "21.0.1" version = "21.0.1"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"impl-trait-for-tuples", "impl-trait-for-tuples",
@@ -10167,7 +10144,7 @@ dependencies = [
[[package]] [[package]]
name = "sp-weights" name = "sp-weights"
version = "31.0.0" version = "31.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"bounded-collections", "bounded-collections",
"parity-scale-codec", "parity-scale-codec",
@@ -10328,7 +10305,7 @@ dependencies = [
[[package]] [[package]]
name = "substrate-bip39" name = "substrate-bip39"
version = "0.6.0" version = "0.6.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"hmac", "hmac",
"pbkdf2", "pbkdf2",
@@ -10353,12 +10330,12 @@ dependencies = [
[[package]] [[package]]
name = "substrate-build-script-utils" name = "substrate-build-script-utils"
version = "11.0.0" version = "11.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
[[package]] [[package]]
name = "substrate-frame-rpc-system" name = "substrate-frame-rpc-system"
version = "42.0.0" version = "42.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"frame-system-rpc-runtime-api", "frame-system-rpc-runtime-api",
"futures", "futures",
@@ -10377,7 +10354,7 @@ dependencies = [
[[package]] [[package]]
name = "substrate-prometheus-endpoint" name = "substrate-prometheus-endpoint"
version = "0.17.1" version = "0.17.1"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"http-body-util", "http-body-util",
"hyper 1.4.1", "hyper 1.4.1",
@@ -10391,7 +10368,7 @@ dependencies = [
[[package]] [[package]]
name = "substrate-wasm-builder" name = "substrate-wasm-builder"
version = "25.0.0" version = "25.0.0"
source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#1aac7f6d602ea1c4f2059c4e80caacba3cbf3286" source = "git+https://github.com/serai-dex/polkadot-sdk?branch=serai-next#401f7b8da28413278acd51284ab21bbf98ec1d45"
dependencies = [ dependencies = [
"build-helper", "build-helper",
"cargo_metadata", "cargo_metadata",

View File

@@ -28,6 +28,7 @@ serde = { version = "1", default-features = false, features = ["derive"], option
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"], optional = true } scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"], optional = true }
scale-info = { version = "2", default-features = false, features = ["derive"], optional = true } scale-info = { version = "2", default-features = false, features = ["derive"], optional = true }
sp-runtime = { git = "https://github.com/serai-dex/polkadot-sdk", branch = "serai-next", default-features = false, features = ["serde"], optional = true } sp-runtime = { git = "https://github.com/serai-dex/polkadot-sdk", branch = "serai-next", default-features = false, features = ["serde"], optional = true }
frame-support = { git = "https://github.com/serai-dex/polkadot-sdk", branch = "serai-next", default-features = false, optional = true }
serai-primitives = { path = "../primitives", version = "0.1", default-features = false } serai-primitives = { path = "../primitives", version = "0.1", default-features = false }
@@ -42,8 +43,10 @@ std = [
"scale?/std", "scale?/std",
"scale-info?/std", "scale-info?/std",
"sp-runtime?/std", "sp-runtime?/std",
"frame-support?/std",
"serai-primitives/std", "serai-primitives/std",
] ]
substrate = ["serde", "scale", "scale-info", "sp-runtime"] substrate = ["serde", "scale", "scale-info", "sp-runtime", "frame-support"]
try-runtime = ["sp-runtime/try-runtime"]
default = ["std"] default = ["std"]

View File

@@ -11,14 +11,13 @@ pub struct HeaderV1 {
/// ///
/// The genesis block has number 0. /// The genesis block has number 0.
pub number: u64, pub number: u64,
/// The block this header builds upon. /// The commitment to the DAG this header builds upon.
pub parent_hash: BlockHash, pub builds_upon: BlockHash,
/// The UNIX time in milliseconds this block was created at. /// The UNIX time in milliseconds this block was created at.
pub unix_time_in_millis: u64, pub unix_time_in_millis: u64,
/// The root of a Merkle tree commiting to the transactions within this block. /// The commitment to the transactions within this block.
// TODO: Review the format of this defined by Substrate. We don't want to commit to the signature // TODO: Some transactions don't have unique hashes due to assuming validators set unique keys
// TODO: Some transactions don't have unique hashes due to assuming vaalidators set unique keys pub transactions_commitment: [u8; 32],
pub transactions_root: [u8; 32],
/// A commitment to the consensus data used to justify adding this block to the blockchain. /// A commitment to the consensus data used to justify adding this block to the blockchain.
pub consensus_commitment: [u8; 32], pub consensus_commitment: [u8; 32],
} }
@@ -37,16 +36,16 @@ impl Header {
Header::V1(HeaderV1 { number, .. }) => *number, Header::V1(HeaderV1 { number, .. }) => *number,
} }
} }
/// Get the hash of the header. /// Get the commitment to the DAG this header builds upon.
pub fn parent_hash(&self) -> BlockHash { pub fn builds_upon(&self) -> BlockHash {
match self { match self {
Header::V1(HeaderV1 { parent_hash, .. }) => *parent_hash, Header::V1(HeaderV1 { builds_upon, .. }) => *builds_upon,
} }
} }
/// Get the hash of the header. /// The commitment to the transactions within this block.
pub fn transactions_root(&self) -> [u8; 32] { pub fn transactions_commitment(&self) -> [u8; 32] {
match self { match self {
Header::V1(HeaderV1 { transactions_root, .. }) => *transactions_root, Header::V1(HeaderV1 { transactions_commitment, .. }) => *transactions_commitment,
} }
} }
/// Get the hash of the header. /// Get the hash of the header.
@@ -69,16 +68,34 @@ pub struct Block {
#[cfg(feature = "substrate")] #[cfg(feature = "substrate")]
mod substrate { mod substrate {
use core::fmt::Debug;
use scale::{Encode, Decode}; use scale::{Encode, Decode};
use scale_info::TypeInfo; use scale_info::TypeInfo;
use sp_core::H256; use sp_core::H256;
use sp_runtime::{ use sp_runtime::{
generic::Digest, generic::{DigestItem, Digest},
traits::{Header as HeaderTrait, HeaderProvider, Block as BlockTrait}, traits::{Header as HeaderTrait, HeaderProvider, Block as BlockTrait},
}; };
use super::*; use super::*;
use crate::Call;
/// The digest for all of the Serai-specific header fields.
#[derive(Clone, Copy, PartialEq, Eq, BorshSerialize, BorshDeserialize)]
pub struct SeraiDigest {
/// The commitment to the DAG this header builds upon.
pub builds_upon: BlockHash,
/// The UNIX time in milliseconds this block was created at.
pub unix_time_in_millis: u64,
/// The commitment to the transactions within this block.
pub transactions_commitment: [u8; 32],
}
impl SeraiDigest {
const CONSENSUS_ID: [u8; 4] = *b"SRID";
}
/// The consensus data for a V1 header. /// The consensus data for a V1 header.
/// ///
@@ -86,6 +103,12 @@ mod substrate {
/// solely considered used for consensus now. /// solely considered used for consensus now.
#[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, TypeInfo, sp_runtime::Serialize)] #[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, TypeInfo, sp_runtime::Serialize)]
pub struct ConsensusV1 { pub struct ConsensusV1 {
/// The hash of the immediately preceding block.
parent_hash: H256,
/// The root for the Merkle tree of transactions, as defined by Substrate.
///
/// The format of this differs from Serai's format for the commitment to the transactions.
transactions_root: H256,
/// The state root. /// The state root.
state_root: H256, state_root: H256,
/// The consensus digests. /// The consensus digests.
@@ -96,8 +119,6 @@ mod substrate {
#[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, TypeInfo, sp_runtime::Serialize)] #[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, TypeInfo, sp_runtime::Serialize)]
pub struct SubstrateHeaderV1 { pub struct SubstrateHeaderV1 {
number: u64, number: u64,
parent_hash: H256,
transactions_root: H256,
consensus: ConsensusV1, consensus: ConsensusV1,
} }
@@ -110,45 +131,48 @@ mod substrate {
impl From<&SubstrateHeader> for Header { impl From<&SubstrateHeader> for Header {
fn from(header: &SubstrateHeader) -> Self { fn from(header: &SubstrateHeader) -> Self {
use sp_consensus_babe::SlotDuration;
use sc_consensus_babe::CompatibleDigestItem;
match header { match header {
SubstrateHeader::V1(header) => Header::V1(HeaderV1 { SubstrateHeader::V1(header) => {
number: header.number, let digest =
parent_hash: BlockHash(header.parent_hash.0), header.consensus.digest.logs().iter().find_map(|digest_item| match digest_item {
unix_time_in_millis: header DigestItem::PreRuntime(consensus, encoded)
.consensus if *consensus == SeraiDigest::CONSENSUS_ID =>
.digest {
.logs() SeraiDigest::deserialize_reader(&mut encoded.as_slice()).ok()
.iter() }
.find_map(|digest_item| { _ => None,
digest_item.as_babe_pre_digest().map(|pre_digest| { });
pre_digest Header::V1(HeaderV1 {
.slot() number: header.number,
.timestamp(SlotDuration::from_millis( builds_upon: digest
serai_primitives::constants::TARGET_BLOCK_TIME.as_millis().try_into().unwrap(), .as_ref()
)) .map(|digest| digest.builds_upon)
// This returns `None` if the slot is so far in the future, it'd cause an .unwrap_or(BlockHash::from([0; 32])),
// overflow. unix_time_in_millis: digest
.unwrap_or(sp_timestamp::Timestamp::new(u64::MAX)) .as_ref()
.as_millis() .map(|digest| digest.unix_time_in_millis)
}) .unwrap_or(0),
}) transactions_commitment: digest
.unwrap_or(0), .as_ref()
transactions_root: header.transactions_root.0, .map(|digest| digest.transactions_commitment)
consensus_commitment: sp_core::blake2_256(&header.consensus.encode()), .unwrap_or([0; 32]),
}), consensus_commitment: sp_core::blake2_256(&header.consensus.encode()),
})
}
} }
} }
} }
/// A block, as needed by Substrate. /// A block, as needed by Substrate.
#[derive(Clone, PartialEq, Eq, Debug, Encode, Decode, sp_runtime::Serialize)] #[derive(Clone, Debug, PartialEq, Eq, Encode, Decode, sp_runtime::Serialize)]
pub struct SubstrateBlock { #[codec(encode_bound(skip_type_params(RuntimeCall)))]
#[codec(decode_bound(skip_type_params(RuntimeCall)))]
pub struct SubstrateBlock<
RuntimeCall: 'static + Send + Sync + Clone + PartialEq + Eq + Debug + From<Call>,
> {
header: SubstrateHeader, header: SubstrateHeader,
#[serde(skip)] // This makes this unsafe to deserialize, but we don't impl `Deserialize` #[serde(skip)] // This makes this unsafe to deserialize, but we don't impl `Deserialize`
transactions: Vec<Transaction>, transactions: Vec<Transaction<RuntimeCall>>,
} }
impl HeaderTrait for SubstrateHeader { impl HeaderTrait for SubstrateHeader {
@@ -165,9 +189,12 @@ mod substrate {
) -> Self { ) -> Self {
SubstrateHeader::V1(SubstrateHeaderV1 { SubstrateHeader::V1(SubstrateHeaderV1 {
number, number,
parent_hash, consensus: ConsensusV1 {
transactions_root: extrinsics_root, parent_hash,
consensus: ConsensusV1 { state_root, digest }, transactions_root: extrinsics_root,
state_root,
digest,
},
}) })
} }
@@ -186,13 +213,13 @@ mod substrate {
fn extrinsics_root(&self) -> &Self::Hash { fn extrinsics_root(&self) -> &Self::Hash {
match self { match self {
SubstrateHeader::V1(SubstrateHeaderV1 { transactions_root, .. }) => transactions_root, SubstrateHeader::V1(SubstrateHeaderV1 { consensus, .. }) => &consensus.transactions_root,
} }
} }
fn set_extrinsics_root(&mut self, extrinsics_root: Self::Hash) { fn set_extrinsics_root(&mut self, extrinsics_root: Self::Hash) {
match self { match self {
SubstrateHeader::V1(SubstrateHeaderV1 { transactions_root, .. }) => { SubstrateHeader::V1(SubstrateHeaderV1 { consensus, .. }) => {
*transactions_root = extrinsics_root; consensus.transactions_root = extrinsics_root;
} }
} }
} }
@@ -212,13 +239,13 @@ mod substrate {
fn parent_hash(&self) -> &Self::Hash { fn parent_hash(&self) -> &Self::Hash {
match self { match self {
SubstrateHeader::V1(SubstrateHeaderV1 { parent_hash, .. }) => parent_hash, SubstrateHeader::V1(SubstrateHeaderV1 { consensus, .. }) => &consensus.parent_hash,
} }
} }
fn set_parent_hash(&mut self, parent_hash: Self::Hash) { fn set_parent_hash(&mut self, parent_hash: Self::Hash) {
match self { match self {
SubstrateHeader::V1(SubstrateHeaderV1 { parent_hash: existing, .. }) => { SubstrateHeader::V1(SubstrateHeaderV1 { consensus, .. }) => {
*existing = parent_hash; consensus.parent_hash = parent_hash;
} }
} }
} }
@@ -239,12 +266,16 @@ mod substrate {
} }
} }
impl HeaderProvider for SubstrateBlock { impl<RuntimeCall: 'static + Send + Sync + Clone + PartialEq + Eq + Debug + From<Call>>
HeaderProvider for SubstrateBlock<RuntimeCall>
{
type HeaderT = SubstrateHeader; type HeaderT = SubstrateHeader;
} }
impl BlockTrait for SubstrateBlock { impl<RuntimeCall: 'static + Send + Sync + Clone + PartialEq + Eq + Debug + From<Call>> BlockTrait
type Extrinsic = Transaction; for SubstrateBlock<RuntimeCall>
{
type Extrinsic = Transaction<RuntimeCall>;
type Header = SubstrateHeader; type Header = SubstrateHeader;
type Hash = H256; type Hash = H256;
fn header(&self) -> &Self::Header { fn header(&self) -> &Self::Header {

View File

@@ -3,23 +3,27 @@ use alloc::{vec, vec::Vec};
use borsh::{io, BorshSerialize, BorshDeserialize}; use borsh::{io, BorshSerialize, BorshDeserialize};
use serai_primitives::{address::SeraiAddress, crypto::Signature}; use sp_core::{ConstU32, bounded::BoundedVec};
use serai_primitives::{BlockHash, address::SeraiAddress, balance::Amount, crypto::Signature};
use crate::Call; use crate::Call;
// use frame_support::dispatch::GetDispatchInfo; /// The maximum amount of calls allowed in a transaction.
pub const MAX_CALLS: u32 = 8;
/// An error regarding `SignedCalls`. /// An error regarding `SignedCalls`.
#[derive(Clone, PartialEq, Eq, Debug)] #[derive(Clone, PartialEq, Eq, Debug)]
pub enum SignedCallsError { pub enum SignedCallsError {
/// No calls were included. /// No calls were included.
NoCalls, NoCalls,
/// Too many calls were included.
TooManyCalls,
/// An unsigned call was included. /// An unsigned call was included.
IncludedUnsignedCall, IncludedUnsignedCall,
} }
/// A `Vec` of signed calls. /// A `Vec` of signed calls.
#[derive(Clone, PartialEq, Eq, Debug)] #[derive(Clone, PartialEq, Eq, Debug)]
pub struct SignedCalls(Vec<Call>); pub struct SignedCalls(BoundedVec<Call, ConstU32<{ MAX_CALLS }>>);
impl TryFrom<Vec<Call>> for SignedCalls { impl TryFrom<Vec<Call>> for SignedCalls {
type Error = SignedCallsError; type Error = SignedCallsError;
fn try_from(calls: Vec<Call>) -> Result<Self, Self::Error> { fn try_from(calls: Vec<Call>) -> Result<Self, Self::Error> {
@@ -31,7 +35,7 @@ impl TryFrom<Vec<Call>> for SignedCalls {
Err(SignedCallsError::IncludedUnsignedCall)?; Err(SignedCallsError::IncludedUnsignedCall)?;
} }
} }
Ok(SignedCalls(calls)) calls.try_into().map_err(|_| SignedCallsError::TooManyCalls).map(SignedCalls)
} }
} }
@@ -58,10 +62,10 @@ impl TryFrom<Call> for UnsignedCall {
/// Part of the context used to sign with, from the protocol. /// Part of the context used to sign with, from the protocol.
#[derive(Clone, PartialEq, Eq, Debug, BorshSerialize, BorshDeserialize)] #[derive(Clone, PartialEq, Eq, Debug, BorshSerialize, BorshDeserialize)]
pub struct ImplicitContext { pub struct ImplicitContext {
/// The ID of the the protocol.
pub protocol_id: [u8; 32],
/// The genesis hash of the blockchain. /// The genesis hash of the blockchain.
pub genesis: [u8; 32], pub genesis: BlockHash,
/// The ID of the current protocol.
pub protocol_id: [u8; 32],
} }
/// Part of the context used to sign with, specified within the transaction itself. /// Part of the context used to sign with, specified within the transaction itself.
@@ -70,13 +74,12 @@ pub struct ExplicitContext {
/// The historic block this transaction builds upon. /// The historic block this transaction builds upon.
/// ///
/// This transaction can not be included in a blockchain which does not include this block. /// This transaction can not be included in a blockchain which does not include this block.
pub historic_block: [u8; 32], pub historic_block: BlockHash,
/// The block this transaction expires at. /// The UNIX time this transaction must be included by (and expires after).
/// ///
/// This transaction can not be included in a block whose number is equal or greater to this /// This transaction can not be included in a block whose time is equal or greater to this value.
/// value. pub include_by: Option<NonZero<u64>>,
pub expires_at: Option<NonZero<u64>>,
/// The signer. /// The signer.
pub signer: SeraiAddress, pub signer: SeraiAddress,
@@ -84,10 +87,10 @@ pub struct ExplicitContext {
/// The signer's nonce. /// The signer's nonce.
pub nonce: u32, pub nonce: u32,
/// The fee paid to the network for inclusion. /// The fee, in SRI, paid to the network for inclusion.
/// ///
/// This fee is paid regardless of the success of any of the calls. /// This fee is paid regardless of the success of any of the calls.
pub fee: u64, pub fee: Amount,
} }
/// A signature, with context. /// A signature, with context.
@@ -106,8 +109,8 @@ pub struct Transaction<RuntimeCall: 'static + From<Call> = Call> {
/// ///
/// These calls are executed atomically. Either all successfully execute or none do. The /// These calls are executed atomically. Either all successfully execute or none do. The
/// transaction's fee is paid regardless. /// transaction's fee is paid regardless.
// TODO: Bound // TODO: if this is unsigned, we only allow a single call. Should we serialize that as 0?
calls: Vec<Call>, calls: BoundedVec<Call, ConstU32<{ MAX_CALLS }>>,
/// The calls, as defined by Substrate. /// The calls, as defined by Substrate.
runtime_calls: Vec<RuntimeCall>, runtime_calls: Vec<RuntimeCall>,
/// The signature, if present. /// The signature, if present.
@@ -129,7 +132,8 @@ impl<RuntimeCall: 'static + From<Call>> BorshSerialize for Transaction<RuntimeCa
impl<RuntimeCall: 'static + From<Call>> BorshDeserialize for Transaction<RuntimeCall> { impl<RuntimeCall: 'static + From<Call>> BorshDeserialize for Transaction<RuntimeCall> {
fn deserialize_reader<R: io::Read>(reader: &mut R) -> io::Result<Self> { fn deserialize_reader<R: io::Read>(reader: &mut R) -> io::Result<Self> {
// Read the calls // Read the calls
let calls = Vec::<Call>::deserialize_reader(reader)?; let calls =
serai_primitives::sp_borsh::borsh_deserialize_bounded_vec::<_, Call, MAX_CALLS>(reader)?;
// Populate the runtime calls // Populate the runtime calls
let mut runtime_calls = Vec::with_capacity(calls.len()); let mut runtime_calls = Vec::with_capacity(calls.len());
for call in calls.iter().cloned() { for call in calls.iter().cloned() {
@@ -160,25 +164,35 @@ impl<RuntimeCall: 'static + From<Call>> BorshDeserialize for Transaction<Runtime
} }
impl<RuntimeCall: 'static + From<Call>> Transaction<RuntimeCall> { impl<RuntimeCall: 'static + From<Call>> Transaction<RuntimeCall> {
/// The message to sign to produce a signature, for calls which may or may not be signed and are
/// unchecked.
fn signature_message_unchecked(
calls: &[Call],
implicit_context: &ImplicitContext,
explicit_context: &ExplicitContext,
) -> Vec<u8> {
let mut message = Vec::with_capacity(
(calls.len() * 64) +
core::mem::size_of::<ImplicitContext>() +
core::mem::size_of::<ExplicitContext>(),
);
calls.serialize(&mut message).unwrap();
implicit_context.serialize(&mut message).unwrap();
explicit_context.serialize(&mut message).unwrap();
message
}
/// The message to sign to produce a signature. /// The message to sign to produce a signature.
pub fn signature_message( pub fn signature_message(
calls: &SignedCalls, calls: &SignedCalls,
implicit_context: &ImplicitContext, implicit_context: &ImplicitContext,
explicit_context: &ExplicitContext, explicit_context: &ExplicitContext,
) -> Vec<u8> { ) -> Vec<u8> {
let mut message = Vec::with_capacity( Self::signature_message_unchecked(&calls.0, implicit_context, explicit_context)
(calls.0.len() * 64) +
core::mem::size_of::<ImplicitContext>() +
core::mem::size_of::<ExplicitContext>(),
);
calls.0.serialize(&mut message).unwrap();
implicit_context.serialize(&mut message).unwrap();
explicit_context.serialize(&mut message).unwrap();
message
} }
/// A transaction with signed calls. /// A transaction with signed calls.
pub fn is_signed( pub fn signed(
calls: SignedCalls, calls: SignedCalls,
explicit_context: ExplicitContext, explicit_context: ExplicitContext,
signature: Signature, signature: Signature,
@@ -199,121 +213,290 @@ impl<RuntimeCall: 'static + From<Call>> Transaction<RuntimeCall> {
pub fn unsigned(call: UnsignedCall) -> Self { pub fn unsigned(call: UnsignedCall) -> Self {
let call = call.0; let call = call.0;
Self { Self {
calls: vec![call.clone()], calls: vec![call.clone()]
.try_into()
.expect("couldn't convert a length-1 Vec to a BoundedVec"),
runtime_calls: vec![call.into()], runtime_calls: vec![call.into()],
contextualized_signature: None, contextualized_signature: None,
} }
} }
/// If the transaction is signed.
pub fn is_signed(&self) -> bool {
self.calls[0].is_signed()
}
} }
#[cfg(feature = "substrate")] #[cfg(feature = "substrate")]
mod substrate { mod substrate {
use core::{marker::PhantomData, fmt::Debug};
use scale::{Encode, Decode};
use sp_runtime::{
transaction_validity::*,
traits::{Verify, ExtrinsicLike, Dispatchable, ValidateUnsigned, Checkable, Applyable},
Weight,
};
#[rustfmt::skip]
use frame_support::dispatch::{DispatchClass, Pays, DispatchInfo, GetDispatchInfo, PostDispatchInfo};
use super::*; use super::*;
impl scale::Encode for Transaction { impl<RuntimeCall: 'static + From<Call>> Encode for Transaction<RuntimeCall> {
fn encode(&self) -> Vec<u8> { fn encode(&self) -> Vec<u8> {
borsh::to_vec(self).unwrap() borsh::to_vec(self).unwrap()
} }
} }
impl scale::Decode for Transaction { impl<RuntimeCall: 'static + From<Call>> Decode for Transaction<RuntimeCall> {
fn decode<I: scale::Input>(input: &mut I) -> Result<Self, scale::Error> { fn decode<I: scale::Input>(input: &mut I) -> Result<Self, scale::Error> {
struct ScaleRead<'a, I: scale::Input>(&'a mut I); struct ScaleRead<'a, I: scale::Input>(&'a mut I, Option<scale::Error>);
impl<I: scale::Input> borsh::io::Read for ScaleRead<'_, I> { impl<I: scale::Input> borsh::io::Read for ScaleRead<'_, I> {
fn read(&mut self, buf: &mut [u8]) -> borsh::io::Result<usize> { fn read(&mut self, buf: &mut [u8]) -> borsh::io::Result<usize> {
let remaining_len = self let remaining_len = self.0.remaining_len().map_err(|err| {
.0 self.1 = Some(err);
.remaining_len() borsh::io::Error::new(borsh::io::ErrorKind::Other, "")
.map_err(|err| borsh::io::Error::new(borsh::io::ErrorKind::Other, err))?; })?;
// If we're still calling `read`, we try to read at least one more byte // If we're still calling `read`, we try to read at least one more byte
let to_read = buf.len().min(remaining_len.unwrap_or(1)); let to_read = buf.len().min(remaining_len.unwrap_or(1));
self self.0.read(&mut buf[.. to_read]).map_err(|err| {
.0 self.1 = Some(err);
.read(&mut buf[.. to_read]) borsh::io::Error::new(borsh::io::ErrorKind::Other, "")
.map_err(|err| borsh::io::Error::new(borsh::io::ErrorKind::Other, err))?; })?;
Ok(to_read) Ok(to_read)
} }
} }
Self::deserialize_reader(&mut ScaleRead(input)).map_err(|err| err.downcast().unwrap()) let mut input = ScaleRead(input, None);
match Self::deserialize_reader(&mut input) {
Ok(res) => Ok(res),
Err(_) => Err(input.1.unwrap()),
}
} }
} }
impl<RuntimeCall: 'static + From<Call>> sp_runtime::traits::ExtrinsicLike
for Transaction<RuntimeCall> /// The context which transactions are executed in.
pub trait TransactionContext<RuntimeCall: 'static + From<Call>>:
'static + Send + Sync + Clone + PartialEq + Eq + Debug
{ {
/// The base weight for a signed transaction.
const SIGNED_WEIGHT: Weight;
/// The implicit context to verify transactions with.
fn implicit_context() -> &'static ImplicitContext;
/// If a block is present in the blockchain.
fn block_is_present_in_blockchain(&self, hash: &BlockHash) -> bool;
/// The time embedded into the current block.
///
/// Returns `None` if the time has yet to be set.
fn current_time(&self) -> Option<u64>;
/// The next nonce for an account.
fn next_nonce(&self, signer: &SeraiAddress) -> u32;
/// Have the transaction pay its SRI fee.
fn pay_fee(&self, signer: &SeraiAddress, fee: Amount) -> Result<(), TransactionValidityError>;
}
/// A transaction with the context necessary to evaluate it within Substrate.
#[derive(Clone, PartialEq, Eq, Debug, Encode, Decode)]
pub struct TransactionWithContext<
RuntimeCall: 'static + From<Call>,
Context: TransactionContext<RuntimeCall>,
>(Transaction<RuntimeCall>, #[codec(skip)] PhantomData<Context>);
impl<RuntimeCall: 'static + From<Call>> ExtrinsicLike for Transaction<RuntimeCall> {
fn is_signed(&self) -> Option<bool> { fn is_signed(&self) -> Option<bool> {
Some(self.calls[0].is_signed()) Some(Transaction::is_signed(self))
} }
fn is_bare(&self) -> bool { fn is_bare(&self) -> bool {
!self.calls[0].is_signed() !Transaction::is_signed(self)
}
}
/*
impl<
Call: 'static + TransactionMember + From<Call> + TryInto<Call>,
> sp_runtime::traits::Extrinsic for Transaction<Call>
{
type Call = Call;
type SignaturePayload = (SeraiAddress, Signature, Extra);
fn is_signed(&self) -> Option<bool> {
Some(self.signature.is_some())
}
fn new(call: Call, signature: Option<Self::SignaturePayload>) -> Option<Self> {
Some(Self { call: call.clone().try_into().ok()?, mapped_call: call, signature })
} }
} }
impl< impl<
Call: 'static + TransactionMember + From<crate::Call> + TryInto<crate::Call>, RuntimeCall: 'static + From<Call> + GetDispatchInfo,
> frame_support::traits::ExtrinsicCall for Transaction<Call, Extra> Context: TransactionContext<RuntimeCall>,
> GetDispatchInfo for TransactionWithContext<RuntimeCall, Context>
{ {
fn call(&self) -> &Call { fn get_dispatch_info(&self) -> DispatchInfo {
&self.mapped_call let (extension_weight, class, pays_fee) = if Transaction::is_signed(&self.0) {
(Context::SIGNED_WEIGHT, DispatchClass::Normal, Pays::Yes)
} else {
(Weight::zero(), DispatchClass::Operational, Pays::No)
};
DispatchInfo {
call_weight: self
.0
.calls
.iter()
.cloned()
.map(|call| RuntimeCall::from(call).get_dispatch_info().call_weight)
.fold(Weight::zero(), |accum, item| accum + item),
extension_weight,
class,
pays_fee,
}
} }
} }
impl< impl<RuntimeCall: 'static + From<Call>, Context: TransactionContext<RuntimeCall>>
Call: 'static + TransactionMember + From<crate::Call>, Checkable<Context> for Transaction<RuntimeCall>
> sp_runtime::traits::ExtrinsicMetadata for Transaction<Call, Extra>
{ {
type SignedExtensions = Extra; type Checked = TransactionWithContext<RuntimeCall, Context>;
const VERSION: u8 = 0; fn check(self, context: &Context) -> Result<Self::Checked, TransactionValidityError> {
} if let Some(ContextualizedSignature { explicit_context, signature }) =
&self.contextualized_signature
impl< {
Call: 'static + TransactionMember + From<crate::Call> + GetDispatchInfo, let ExplicitContext { historic_block, include_by, signer, nonce, fee } = &explicit_context;
> GetDispatchInfo for Transaction<Call, Extra> if !context.block_is_present_in_blockchain(historic_block) {
{ // We don't know if this is a block from a fundamentally distinct blockchain or a
fn get_dispatch_info(&self) -> frame_support::dispatch::DispatchInfo { // continuation of this blockchain we have yet to sync (which would be `Future`)
self.mapped_call.get_dispatch_info() Err(TransactionValidityError::Unknown(UnknownTransaction::CannotLookup))?;
} }
} if let Some(include_by) = *include_by {
if let Some(current_time) = context.current_time() {
impl< if current_time >= u64::from(include_by) {
Call: 'static + TransactionMember + From<crate::Call>, // Since this transaction has a time bound which has passed, error
> sp_runtime::traits::BlindCheckable for Transaction<Call, Extra> Err(TransactionValidityError::Invalid(InvalidTransaction::Stale))?;
{ }
type Checked = sp_runtime::generic::CheckedExtrinsic<Public, Call, Extra>; } else {
// Since this transaction has a time bound, yet we don't know the time, error
fn check( Err(TransactionValidityError::Invalid(InvalidTransaction::Stale))?;
self,
) -> Result<Self::Checked, sp_runtime::transaction_validity::TransactionValidityError> {
Ok(match self.signature {
Some((signer, signature, extra)) => {
if !signature.verify(
(&self.call, &extra, extra.additional_signed()?).encode().as_slice(),
&signer.into(),
) {
Err(sp_runtime::transaction_validity::InvalidTransaction::BadProof)?
}
sp_runtime::generic::CheckedExtrinsic {
signed: Some((signer.into(), extra)),
function: self.mapped_call,
} }
} }
None => sp_runtime::generic::CheckedExtrinsic { signed: None, function: self.mapped_call }, match context.next_nonce(signer).cmp(nonce) {
}) core::cmp::Ordering::Less => {
Err(TransactionValidityError::Invalid(InvalidTransaction::Stale))?
}
core::cmp::Ordering::Equal => {}
core::cmp::Ordering::Greater => {
Err(TransactionValidityError::Invalid(InvalidTransaction::Future))?
}
}
if !sp_core::sr25519::Signature::from(*signature).verify(
Transaction::<RuntimeCall>::signature_message_unchecked(
&self.calls,
Context::implicit_context(),
explicit_context,
)
.as_slice(),
&sp_core::sr25519::Public::from(*signer),
) {
Err(sp_runtime::transaction_validity::InvalidTransaction::BadProof)?;
}
context.pay_fee(signer, *fee)?;
}
Ok(TransactionWithContext(self, PhantomData))
}
#[cfg(feature = "try-runtime")]
fn unchecked_into_checked_i_know_what_i_am_doing(
self,
c: &Context,
) -> Result<Self::Checked, TransactionValidityError> {
// This satisfies the API, not necessarily the intent, yet this fn is only intended to be used
// within tests. Accordingly, it's fine to be stricter than necessarily
self.check(c)
}
}
impl<
RuntimeCall: 'static
+ Send
+ Sync
+ From<Call>
+ Dispatchable<
RuntimeOrigin: From<Option<SeraiAddress>>,
Info = DispatchInfo,
PostInfo = PostDispatchInfo,
>,
Context: TransactionContext<RuntimeCall>,
> Applyable for TransactionWithContext<RuntimeCall, Context>
{
type Call = RuntimeCall;
fn validate<V: ValidateUnsigned<Call = RuntimeCall>>(
&self,
source: sp_runtime::transaction_validity::TransactionSource,
info: &DispatchInfo,
_len: usize,
) -> sp_runtime::transaction_validity::TransactionValidity {
if !self.0.is_signed() {
let ValidTransaction { priority: _, requires, provides, longevity: _, propagate: _ } =
V::validate_unsigned(source, &self.0.runtime_calls[0])?;
Ok(ValidTransaction {
// We should always try to include unsigned transactions prior to signed
priority: u64::MAX,
requires,
provides,
// This is valid until included
longevity: u64::MAX,
// Ensure this is propagated
propagate: true,
})
} else {
let explicit_context = &self.0.contextualized_signature.as_ref().unwrap().explicit_context;
let requires = if let Some(prior_nonce) = explicit_context.nonce.checked_sub(1) {
vec![borsh::to_vec(&(explicit_context.signer, prior_nonce)).unwrap()]
} else {
vec![]
};
let provides =
vec![borsh::to_vec(&(explicit_context.signer, explicit_context.nonce)).unwrap()];
Ok(ValidTransaction {
// Prioritize transactions by their fees
priority: {
let fee = explicit_context.fee.0;
Weight::from_all(fee).checked_div_per_component(&info.call_weight).unwrap_or(0)
},
requires,
provides,
// This revalidates the transaction every block. This is required due to this being
// denominated in blocks, and our transaction expiration being denominated in seconds.
longevity: 1,
propagate: true,
})
}
}
fn apply<V: ValidateUnsigned<Call = RuntimeCall>>(
mut self,
_info: &DispatchInfo,
_len: usize,
) -> sp_runtime::ApplyExtrinsicResultWithInfo<PostDispatchInfo> {
if !self.0.is_signed() {
V::pre_dispatch(&self.0.runtime_calls[0])?;
match self.0.runtime_calls.remove(0).dispatch(None.into()) {
Ok(res) => Ok(Ok(res)),
// Unsigned transactions should only be included if valid in all regards
// This isn't actually a "mandatory" but the intent is the same
Err(_err) => Err(TransactionValidityError::Invalid(InvalidTransaction::BadMandatory)),
}
} else {
Ok(frame_support::storage::transactional::with_storage_layer(|| {
for call in self.0.runtime_calls {
match call.dispatch(
Some(self.0.contextualized_signature.as_ref().unwrap().explicit_context.signer)
.into(),
) {
Ok(_res) => {}
// Because this call errored, don't continue and revert all prior calls
Err(e) => Err(e)?,
}
}
// Since all calls errored, return all
Ok(PostDispatchInfo {
// `None` stands for the worst case, which is what we want
actual_weight: None,
// Signed transactions always pay their fee
// TODO: Do we want to handle this so we can not charge fees on removing genesis
// liquidity?
pays_fee: Pays::Yes,
})
}))
}
} }
} }
*/
} }
#[cfg(feature = "substrate")]
pub use substrate::*;

View File

@@ -20,6 +20,7 @@ pub enum Call {
/// The keys being set. /// The keys being set.
key_pair: KeyPair, key_pair: KeyPair,
/// The participants in the validator set who signed off on these keys. /// The participants in the validator set who signed off on these keys.
// TODO: Bound
#[borsh( #[borsh(
serialize_with = "serai_primitives::sp_borsh::borsh_serialize_bitvec", serialize_with = "serai_primitives::sp_borsh::borsh_serialize_bitvec",
deserialize_with = "serai_primitives::sp_borsh::borsh_deserialize_bitvec" deserialize_with = "serai_primitives::sp_borsh::borsh_deserialize_bitvec"

View File

@@ -60,8 +60,8 @@ dockertest = "0.5"
serai-docker-tests = { path = "../../tests/docker" } serai-docker-tests = { path = "../../tests/docker" }
[features] [features]
serai = ["thiserror/std", "serde", "serde_json", "serai-abi/serde", "multiaddr", "sp-core", "sp-runtime", "frame-system", "simple-request"] serai = ["thiserror/std", "serde", "serde_json", "multiaddr", "sp-core", "sp-runtime", "frame-system", "simple-request"]
borsh = ["serai-abi/borsh"] borsh = []
networks = [] networks = []
bitcoin = ["networks", "dep:bitcoin"] bitcoin = ["networks", "dep:bitcoin"]

View File

@@ -1,4 +1,4 @@
use sp_core::bounded_vec::BoundedVec; use sp_core::bounded::BoundedVec;
use serai_abi::primitives::{Amount, Coin, ExternalCoin, SeraiAddress}; use serai_abi::primitives::{Amount, Coin, ExternalCoin, SeraiAddress};
use crate::{SeraiError, TemporalSerai}; use crate::{SeraiError, TemporalSerai};

View File

@@ -6,7 +6,7 @@ use rand_core::OsRng;
use sp_core::{ use sp_core::{
ConstU32, ConstU32,
bounded_vec::BoundedVec, bounded::BoundedVec,
sr25519::{Pair, Signature}, sr25519::{Pair, Signature},
Pair as PairTrait, Pair as PairTrait,
}; };

View File

@@ -1,6 +1,6 @@
use rand_core::{RngCore, OsRng}; use rand_core::{RngCore, OsRng};
use sp_core::{Pair as PairTrait, bounded_vec::BoundedVec}; use sp_core::{Pair as PairTrait, bounded::BoundedVec};
use serai_abi::in_instructions::primitives::DexCall; use serai_abi::in_instructions::primitives::DexCall;

View File

@@ -22,7 +22,7 @@
use super::*; use super::*;
use frame_benchmarking::{benchmarks, whitelisted_caller}; use frame_benchmarking::{benchmarks, whitelisted_caller};
use frame_support::{assert_ok, storage::bounded_vec::BoundedVec}; use frame_support::{assert_ok, storage::bounded::BoundedVec};
use frame_system::RawOrigin as SystemOrigin; use frame_system::RawOrigin as SystemOrigin;
use sp_runtime::traits::StaticLookup; use sp_runtime::traits::StaticLookup;

View File

@@ -20,6 +20,7 @@ zeroize = { version = "^1.5", features = ["derive"] }
borsh = { version = "1", default-features = false, features = ["derive", "de_strict_order"] } borsh = { version = "1", default-features = false, features = ["derive", "de_strict_order"] }
bitvec = { version = "1", default-features = false, features = ["alloc"] } bitvec = { version = "1", default-features = false, features = ["alloc"] }
scale = { package = "parity-scale-codec", version = "3", default-features = false, features = ["derive"] }
sp-core = { git = "https://github.com/serai-dex/polkadot-sdk", branch = "serai-next", default-features = false } sp-core = { git = "https://github.com/serai-dex/polkadot-sdk", branch = "serai-next", default-features = false }
ciphersuite = { path = "../../crypto/ciphersuite", default-features = false, features = ["alloc", "ristretto"] } ciphersuite = { path = "../../crypto/ciphersuite", default-features = false, features = ["alloc", "ristretto"] }

View File

@@ -23,6 +23,8 @@ const HUMAN_READABLE_PART: bech32::Hrp = bech32::Hrp::parse_unchecked("sri");
/// The address for an account on Serai. /// The address for an account on Serai.
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Zeroize, BorshSerialize, BorshDeserialize)] #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug, Zeroize, BorshSerialize, BorshDeserialize)]
#[rustfmt::skip]
#[derive(scale::Encode, scale::Decode)] // This is safe as scale and borsh share an encoding here
pub struct SeraiAddress(pub [u8; 32]); pub struct SeraiAddress(pub [u8; 32]);
impl SeraiAddress { impl SeraiAddress {

View File

@@ -2,8 +2,6 @@ use borsh::{io::*, BorshSerialize, BorshDeserialize};
use sp_core::{ConstU32, bounded::BoundedVec}; use sp_core::{ConstU32, bounded::BoundedVec};
// TODO: Don't serialize this as a Vec<u8>. Shorten the length-prefix, technically encoding as an
// enum.
pub fn borsh_serialize_bitvec<W: Write>( pub fn borsh_serialize_bitvec<W: Write>(
bitvec: &bitvec::vec::BitVec<u8, bitvec::order::Lsb0>, bitvec: &bitvec::vec::BitVec<u8, bitvec::order::Lsb0>,
writer: &mut W, writer: &mut W,
@@ -21,6 +19,8 @@ pub fn borsh_deserialize_bitvec<R: Read>(
type SerializeBoundedVecAs<T> = alloc::vec::Vec<T>; type SerializeBoundedVecAs<T> = alloc::vec::Vec<T>;
// TODO: Don't serialize this as a Vec<u8>. Shorten the length-prefix, technically encoding as an
// enum.
pub fn borsh_serialize_bounded_vec<W: Write, T: BorshSerialize, const B: u32>( pub fn borsh_serialize_bounded_vec<W: Write, T: BorshSerialize, const B: u32>(
bounded: &BoundedVec<T, ConstU32<B>>, bounded: &BoundedVec<T, ConstU32<B>>,
writer: &mut W, writer: &mut W,