diff --git a/Cargo.lock b/Cargo.lock
index 94ff3d49391..9bc099ff93f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -2808,7 +2808,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976"
dependencies = [
"data-encoding",
- "syn 2.0.101",
+ "syn 1.0.109",
]
[[package]]
@@ -3299,13 +3299,15 @@ dependencies = [
[[package]]
name = "ethereum"
-version = "0.15.0"
-source = "git+https://github.com/rust-ethereum/ethereum.git?rev=3be0d8fd4c2ad1ba216b69ef65b9382612efc8ba#3be0d8fd4c2ad1ba216b69ef65b9382612efc8ba"
+version = "0.18.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ee371ebb7479ed3258617557ab0b3247e741075cb6b02b820d188f68da44441"
dependencies = [
"bytes",
"ethereum-types",
"hash-db",
"hash256-std-hasher",
+ "k256",
"parity-scale-codec",
"rlp",
"scale-info",
@@ -3381,7 +3383,7 @@ dependencies = [
[[package]]
name = "evm"
version = "0.42.0"
-source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#b6a1aefabe4d6866992ed3b7ba2e7403baa70534"
+source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#ce90f4882a708209173cee76559fb4621db0027f"
dependencies = [
"auto_impl",
"environmental",
@@ -3401,7 +3403,7 @@ dependencies = [
[[package]]
name = "evm-core"
version = "0.42.0"
-source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#b6a1aefabe4d6866992ed3b7ba2e7403baa70534"
+source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#ce90f4882a708209173cee76559fb4621db0027f"
dependencies = [
"parity-scale-codec",
"primitive-types 0.13.1",
@@ -3412,7 +3414,7 @@ dependencies = [
[[package]]
name = "evm-gasometer"
version = "0.42.0"
-source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#b6a1aefabe4d6866992ed3b7ba2e7403baa70534"
+source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#ce90f4882a708209173cee76559fb4621db0027f"
dependencies = [
"environmental",
"evm-core",
@@ -3423,7 +3425,7 @@ dependencies = [
[[package]]
name = "evm-runtime"
version = "0.42.0"
-source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#b6a1aefabe4d6866992ed3b7ba2e7403baa70534"
+source = "git+https://github.com/moonbeam-foundation/evm?branch=moonbeam-polkadot-stable2412#ce90f4882a708209173cee76559fb4621db0027f"
dependencies = [
"auto_impl",
"environmental",
@@ -3523,7 +3525,7 @@ dependencies = [
[[package]]
name = "fc-api"
version = "1.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"async-trait",
"fp-storage",
@@ -3535,7 +3537,7 @@ dependencies = [
[[package]]
name = "fc-consensus"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"async-trait",
"fp-consensus",
@@ -3551,7 +3553,7 @@ dependencies = [
[[package]]
name = "fc-db"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"async-trait",
"ethereum",
@@ -3581,7 +3583,7 @@ dependencies = [
[[package]]
name = "fc-mapping-sync"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"fc-db",
"fc-storage",
@@ -3604,7 +3606,7 @@ dependencies = [
[[package]]
name = "fc-rpc"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"ethereum",
"ethereum-types",
@@ -3658,7 +3660,7 @@ dependencies = [
[[package]]
name = "fc-rpc-core"
version = "1.1.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"ethereum",
"ethereum-types",
@@ -3673,7 +3675,7 @@ dependencies = [
[[package]]
name = "fc-rpc-v2-api"
version = "0.1.0"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"ethereum-types",
"fc-rpc-v2-types",
@@ -3683,7 +3685,7 @@ dependencies = [
[[package]]
name = "fc-rpc-v2-types"
version = "0.1.0"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"const-hex",
"ethereum-types",
@@ -3694,7 +3696,7 @@ dependencies = [
[[package]]
name = "fc-storage"
version = "1.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"ethereum",
"ethereum-types",
@@ -3900,7 +3902,7 @@ dependencies = [
[[package]]
name = "fp-account"
version = "1.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"hex",
"impl-serde 0.5.0",
@@ -3919,7 +3921,7 @@ dependencies = [
[[package]]
name = "fp-consensus"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"ethereum",
"parity-scale-codec",
@@ -3930,7 +3932,7 @@ dependencies = [
[[package]]
name = "fp-ethereum"
version = "1.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"ethereum",
"ethereum-types",
@@ -3942,7 +3944,7 @@ dependencies = [
[[package]]
name = "fp-evm"
version = "3.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"environmental",
"evm",
@@ -3958,7 +3960,7 @@ dependencies = [
[[package]]
name = "fp-rpc"
version = "3.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"ethereum",
"ethereum-types",
@@ -3974,7 +3976,7 @@ dependencies = [
[[package]]
name = "fp-self-contained"
version = "1.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"frame-support",
"parity-scale-codec",
@@ -3986,7 +3988,7 @@ dependencies = [
[[package]]
name = "fp-storage"
version = "2.0.0"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"parity-scale-codec",
"serde",
@@ -7710,6 +7712,7 @@ dependencies = [
"account",
"cumulus-pallet-parachain-system",
"cumulus-primitives-core",
+ "ethereum",
"frame-support",
"frame-system",
"log",
@@ -8555,7 +8558,7 @@ version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
dependencies = [
- "proc-macro-crate 3.3.0",
+ "proc-macro-crate 1.1.3",
"proc-macro2",
"quote",
"syn 2.0.101",
@@ -9357,7 +9360,7 @@ dependencies = [
[[package]]
name = "pallet-ethereum"
version = "4.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"environmental",
"ethereum",
@@ -9412,10 +9415,11 @@ dependencies = [
[[package]]
name = "pallet-evm"
version = "6.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"cumulus-primitives-storage-weight-reclaim",
"environmental",
+ "ethereum",
"evm",
"fp-account",
"fp-evm",
@@ -9436,7 +9440,7 @@ dependencies = [
[[package]]
name = "pallet-evm-chain-id"
version = "1.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"frame-support",
"frame-system",
@@ -9515,7 +9519,7 @@ dependencies = [
[[package]]
name = "pallet-evm-precompile-blake2"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"fp-evm",
]
@@ -9523,7 +9527,7 @@ dependencies = [
[[package]]
name = "pallet-evm-precompile-bn128"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"fp-evm",
"sp-core",
@@ -9679,7 +9683,7 @@ dependencies = [
[[package]]
name = "pallet-evm-precompile-modexp"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"fp-evm",
"num",
@@ -9880,7 +9884,7 @@ dependencies = [
[[package]]
name = "pallet-evm-precompile-sha3fips"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"fp-evm",
"tiny-keccak",
@@ -9889,7 +9893,7 @@ dependencies = [
[[package]]
name = "pallet-evm-precompile-simple"
version = "2.0.0-dev"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"fp-evm",
"ripemd",
@@ -11033,8 +11037,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e69bf016dc406eff7d53a7d3f7cf1c2e72c82b9088aac1118591e36dd2cd3e9"
dependencies = [
"bitcoin_hashes",
- "rand 0.8.5",
- "rand_core 0.6.4",
+ "rand 0.7.3",
+ "rand_core 0.5.1",
"serde",
"unicode-normalization",
]
@@ -12611,7 +12615,7 @@ dependencies = [
[[package]]
name = "precompile-utils"
version = "0.1.0"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"derive_more 1.0.0",
"environmental",
@@ -12640,7 +12644,7 @@ dependencies = [
[[package]]
name = "precompile-utils-macro"
version = "0.1.0"
-source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#080a791b79002c95c553d69789cc0e48e1459c2a"
+source = "git+https://github.com/moonbeam-foundation/frontier?branch=moonbeam-polkadot-stable2412#97d9bc8dd551579611716cac7268ab1a54289fcf"
dependencies = [
"case",
"num_enum 0.7.3",
@@ -18506,7 +18510,7 @@ checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675"
dependencies = [
"cfg-if",
"digest 0.10.7",
- "rand 0.8.5",
+ "rand 0.7.3",
"static_assertions",
]
diff --git a/Cargo.toml b/Cargo.toml
index da72549a280..3f994efcd84 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -65,7 +65,7 @@ evm-tracing-events = { path = "primitives/rpc/evm-tracing-events", default-featu
moonbeam-core-primitives = { path = "core-primitives", default-features = false }
moonbeam-primitives-ext = { path = "primitives/ext", default-features = false }
moonbeam-rpc-primitives-debug = { path = "primitives/rpc/debug", default-features = false, features = [
- "runtime-3000",
+ "runtime-3900",
] }
moonbeam-rpc-primitives-txpool = { path = "primitives/rpc/txpool", default-features = false }
storage-proof-primitives = { path = "primitives/storage-proof", default-features = false }
@@ -236,7 +236,7 @@ substrate-rpc-client = { git = "https://github.com/moonbeam-foundation/polkadot-
# Frontier (wasm)
-ethereum = { git = "https://github.com/rust-ethereum/ethereum.git", rev = "3be0d8fd4c2ad1ba216b69ef65b9382612efc8ba", default-features = false, features = [
+ethereum = { version = "0.18.2", default-features = false, features = [
"with-scale",
] }
ethereum-types = { version = "0.15.1", default-features = false }
@@ -360,7 +360,9 @@ nimbus-consensus = { git = "https://github.com/Moonsong-Labs/moonkit", branch =
async-trait = { version = "0.1.42" }
derive_more = "0.99.17"
environmental = { version = "1.1.4", default-features = false }
-frame-metadata = { version = "18.0.0", default-features = false, features = ["current"] }
+frame-metadata = { version = "18.0.0", default-features = false, features = [
+ "current",
+] }
frame-metadata-hash-extension = { git = "https://github.com/moonbeam-foundation/polkadot-sdk", branch = "moonbeam-polkadot-stable2412", default-features = false }
hex = { version = "0.4.3", default-features = false }
hex-literal = { version = "0.4.1", default-features = false }
diff --git a/client/rpc-core/debug/Cargo.toml b/client/rpc-core/debug/Cargo.toml
index 2455b17c837..7b85aac6622 100644
--- a/client/rpc-core/debug/Cargo.toml
+++ b/client/rpc-core/debug/Cargo.toml
@@ -8,7 +8,7 @@ repository = { workspace = true }
version = "0.1.0"
[dependencies]
-ethereum = { workspace = true, features = [ "with-scale" ] }
+ethereum = { workspace = true, features = [ "with-scale", "with-serde" ] }
ethereum-types = { workspace = true, features = [ "std" ] }
jsonrpsee = { workspace = true, features = [ "macros", "server" ] }
moonbeam-client-evm-tracing = { workspace = true }
diff --git a/client/rpc-core/debug/src/lib.rs b/client/rpc-core/debug/src/lib.rs
index 1f82f91cee0..68f3ab04cbb 100644
--- a/client/rpc-core/debug/src/lib.rs
+++ b/client/rpc-core/debug/src/lib.rs
@@ -14,7 +14,7 @@
// You should have received a copy of the GNU General Public License
// along with Moonbeam. If not, see .
-use ethereum::AccessListItem;
+use ethereum::{AccessListItem, AuthorizationList};
use ethereum_types::{H160, H256, U256};
use fc_rpc_core::types::Bytes;
use jsonrpsee::{core::RpcResult, proc_macros::rpc};
@@ -57,6 +57,8 @@ pub struct TraceCallParams {
pub nonce: Option,
/// EIP-2930 access list
pub access_list: Option>,
+ /// EIP-7702 authorization list
+ pub authorization_list: Option,
/// EIP-2718 type
#[serde(rename = "type")]
pub transaction_type: Option,
diff --git a/client/rpc/debug/src/lib.rs b/client/rpc/debug/src/lib.rs
index b29e9aea66d..79bfa057506 100644
--- a/client/rpc/debug/src/lib.rs
+++ b/client/rpc/debug/src/lib.rs
@@ -22,6 +22,7 @@ use tokio::{
sync::{oneshot, Semaphore},
};
+use ethereum;
use ethereum_types::H256;
use fc_rpc::{frontier_backend_client, internal_err};
use fc_storage::StorageOverride;
@@ -712,9 +713,35 @@ where
let transactions = block.transactions;
if let Some(transaction) = transactions.get(index) {
let f = || -> RpcResult<_> {
- let result = if trace_api_version >= 5 {
+ let result = if trace_api_version >= 7 {
// The block is initialized inside "trace_transaction"
api.trace_transaction(parent_block_hash, exts, &transaction, &header)
+ } else if trace_api_version == 5 || trace_api_version == 6 {
+ // API version 5 and 6 expect TransactionV2, so we need to convert from TransactionV3
+ let tx_v2 = match transaction {
+ ethereum::TransactionV3::Legacy(tx) => {
+ ethereum::TransactionV2::Legacy(tx.clone())
+ }
+ ethereum::TransactionV3::EIP2930(tx) => {
+ ethereum::TransactionV2::EIP2930(tx.clone())
+ }
+ ethereum::TransactionV3::EIP1559(tx) => {
+ ethereum::TransactionV2::EIP1559(tx.clone())
+ }
+ ethereum::TransactionV3::EIP7702(_) => return Err(internal_err(
+ "EIP-7702 transactions are supported starting from API version 7"
+ .to_string(),
+ )),
+ };
+
+ // The block is initialized inside "trace_transaction"
+ #[allow(deprecated)]
+ api.trace_transaction_before_version_7(
+ parent_block_hash,
+ exts,
+ &tx_v2,
+ &header,
+ )
} else {
// Get core runtime api version
let core_api_version = if let Ok(Some(api_version)) =
@@ -746,17 +773,32 @@ where
}
if trace_api_version == 4 {
+ // API version 4 expect TransactionV2, so we need to convert from TransactionV3
+ let tx_v2 = match transaction {
+ ethereum::TransactionV3::Legacy(tx) => {
+ ethereum::TransactionV2::Legacy(tx.clone())
+ }
+ ethereum::TransactionV3::EIP2930(tx) => {
+ ethereum::TransactionV2::EIP2930(tx.clone())
+ }
+ ethereum::TransactionV3::EIP1559(tx) => {
+ ethereum::TransactionV2::EIP1559(tx.clone())
+ }
+ ethereum::TransactionV3::EIP7702(_) => {
+ return Err(internal_err(
+ "EIP-7702 transactions are supported starting from API version 7"
+ .to_string(),
+ ))
+ }
+ };
+
// Pre pallet-message-queue
#[allow(deprecated)]
- api.trace_transaction_before_version_5(
- parent_block_hash,
- exts,
- &transaction,
- )
+ api.trace_transaction_before_version_5(parent_block_hash, exts, &tx_v2)
} else {
// Pre-london update, legacy transactions.
match transaction {
- ethereum::TransactionV2::Legacy(tx) =>
+ ethereum::TransactionV3::Legacy(tx) =>
{
#[allow(deprecated)]
api.trace_transaction_before_version_4(
@@ -928,6 +970,7 @@ where
data,
nonce,
access_list,
+ authorization_list,
..
} = call_params;
@@ -1002,6 +1045,7 @@ where
.map(|item| (item.address, item.storage_keys))
.collect(),
),
+ authorization_list,
)
.map_err(|e| internal_err(format!("Runtime api access error: {:?}", e)))?
.map_err(|e| internal_err(format!("DispatchError: {:?}", e)))?;
diff --git a/package.json b/package.json
index 9d347b3882d..e5844ea660b 100644
--- a/package.json
+++ b/package.json
@@ -18,13 +18,13 @@
},
"dependencies": {
"@openzeppelin/contracts": "5.3.0",
- "@polkadot/api": "16.3.1",
- "@polkadot/api-derive": "16.3.1",
+ "@polkadot/api": "16.4.3",
+ "@polkadot/api-derive": "16.4.3",
"@polkadot/keyring": "13.5.3",
- "@polkadot/rpc-provider": "16.3.1",
- "@polkadot/typegen": "16.3.1",
- "@polkadot/types": "16.3.1",
- "@polkadot/types-codec": "16.3.1",
+ "@polkadot/rpc-provider": "16.4.3",
+ "@polkadot/typegen": "16.4.3",
+ "@polkadot/types": "16.4.3",
+ "@polkadot/types-codec": "16.4.3",
"@polkadot/util": "13.5.3",
"@polkadot/util-crypto": "13.5.3",
"ethers": "6.14.4",
@@ -39,16 +39,16 @@
"pnpm": {
"overrides": {
"@openzeppelin/contracts": "5.3.0",
- "@polkadot/api": "16.3.1",
- "@polkadot/api-derive": "16.3.1",
+ "@polkadot/api": "16.4.3",
+ "@polkadot/api-derive": "16.4.3",
"@polkadot/keyring": "13.5.3",
- "@polkadot/rpc-provider": "16.3.1",
- "@polkadot/typegen": "16.3.1",
- "@polkadot/types": "16.3.1",
- "@polkadot/types-codec": "16.3.1",
+ "@polkadot/rpc-provider": "16.4.3",
+ "@polkadot/typegen": "16.4.3",
+ "@polkadot/types": "16.4.3",
+ "@polkadot/types-codec": "16.4.3",
"@polkadot/util": "13.5.3",
"@polkadot/util-crypto": "13.5.3",
- "ethers": "6.14.4",
+ "ethers": "6.15.0",
"tsup": "8.5.0"
}
},
diff --git a/pallets/erc20-xcm-bridge/src/lib.rs b/pallets/erc20-xcm-bridge/src/lib.rs
index 79bf2efdfdb..63f922593b5 100644
--- a/pallets/erc20-xcm-bridge/src/lib.rs
+++ b/pallets/erc20-xcm-bridge/src/lib.rs
@@ -123,6 +123,7 @@ pub mod pallet {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
Some(weight_limit),
diff --git a/pallets/ethereum-xcm/src/lib.rs b/pallets/ethereum-xcm/src/lib.rs
index 74fa92acf53..ca7b8ade586 100644
--- a/pallets/ethereum-xcm/src/lib.rs
+++ b/pallets/ethereum-xcm/src/lib.rs
@@ -43,8 +43,8 @@ use sp_runtime::{traits::UniqueSaturatedInto, DispatchErrorWithPostInfo, Runtime
use sp_std::{marker::PhantomData, prelude::*};
pub use ethereum::{
- AccessListItem, BlockV2 as Block, LegacyTransactionMessage, Log, ReceiptV3 as Receipt,
- TransactionAction, TransactionV2 as Transaction,
+ AccessListItem, BlockV3 as Block, LegacyTransactionMessage, Log, ReceiptV4 as Receipt,
+ TransactionAction, TransactionV3 as Transaction,
};
pub use fp_rpc::TransactionStatus;
pub use xcm_primitives::{EnsureProxy, EthereumXcmTransaction, XcmToEthereum};
@@ -177,7 +177,8 @@ pub mod pallet {
::GasWeightMapping::gas_to_weight({
match xcm_transaction {
EthereumXcmTransaction::V1(v1_tx) => v1_tx.gas_limit.unique_saturated_into(),
- EthereumXcmTransaction::V2(v2_tx) => v2_tx.gas_limit.unique_saturated_into()
+ EthereumXcmTransaction::V2(v2_tx) => v2_tx.gas_limit.unique_saturated_into(),
+ EthereumXcmTransaction::V3(v3_tx) => v3_tx.gas_limit.unique_saturated_into(),
}
}, without_base_extrinsic_weight).saturating_add(T::DbWeight::get().reads(1))
})]
@@ -206,7 +207,8 @@ pub mod pallet {
::GasWeightMapping::gas_to_weight({
match xcm_transaction {
EthereumXcmTransaction::V1(v1_tx) => v1_tx.gas_limit.unique_saturated_into(),
- EthereumXcmTransaction::V2(v2_tx) => v2_tx.gas_limit.unique_saturated_into()
+ EthereumXcmTransaction::V2(v2_tx) => v2_tx.gas_limit.unique_saturated_into(),
+ EthereumXcmTransaction::V3(v3_tx) => v3_tx.gas_limit.unique_saturated_into(),
}
}, without_base_extrinsic_weight).saturating_add(T::DbWeight::get().reads(2))
})]
@@ -272,8 +274,9 @@ pub mod pallet {
let without_base_extrinsic_weight = false;
::GasWeightMapping::gas_to_weight({
match xcm_transaction {
- EthereumXcmTransaction::V1(v1_tx) => v1_tx.gas_limit.unique_saturated_into(),
- EthereumXcmTransaction::V2(v2_tx) => v2_tx.gas_limit.unique_saturated_into()
+ EthereumXcmTransaction::V1(v1_tx) => v1_tx.gas_limit.unique_saturated_into(),
+ EthereumXcmTransaction::V2(v2_tx) => v2_tx.gas_limit.unique_saturated_into(),
+ EthereumXcmTransaction::V3(v3_tx) => v3_tx.gas_limit.unique_saturated_into(),
}
}, without_base_extrinsic_weight).saturating_add(T::DbWeight::get().reads(1))
})]
@@ -324,7 +327,7 @@ impl Pallet {
let error_weight = T::DbWeight::get().reads(1);
let transaction: Option =
- xcm_transaction.into_transaction_v2(current_nonce, T::ChainId::get(), allow_create);
+ xcm_transaction.into_transaction(current_nonce, T::ChainId::get(), allow_create);
if let Some(transaction) = transaction {
let tx_hash = transaction.hash();
let transaction_data: TransactionData = (&transaction).into();
diff --git a/pallets/ethereum-xcm/src/mock.rs b/pallets/ethereum-xcm/src/mock.rs
index b9d132e10d9..afd58aeaeb8 100644
--- a/pallets/ethereum-xcm/src/mock.rs
+++ b/pallets/ethereum-xcm/src/mock.rs
@@ -16,7 +16,7 @@
//! Test utilities
-use ethereum::{TransactionAction, TransactionSignature};
+use ethereum::{AuthorizationList, TransactionAction};
use frame_support::{
parameter_types,
traits::{ConstU32, FindAuthor, InstanceFilter},
@@ -438,7 +438,7 @@ impl LegacyUnsignedTransaction {
);
let sig = s.0.serialize();
- let sig = TransactionSignature::new(
+ let sig = ethereum::legacy::TransactionSignature::new(
s.1.serialize() as u64 % 2 + chain_id * 2 + 35,
H256::from_slice(&sig[0..32]),
H256::from_slice(&sig[32..64]),
@@ -499,9 +499,8 @@ impl EIP2930UnsignedTransaction {
value: msg.value,
input: msg.input.clone(),
access_list: msg.access_list,
- odd_y_parity: recid.serialize() != 0,
- r,
- s,
+ signature: ethereum::eip1559::TransactionSignature::new(recid.serialize() != 0, r, s)
+ .unwrap(),
})
}
}
@@ -551,9 +550,66 @@ impl EIP1559UnsignedTransaction {
value: msg.value,
input: msg.input.clone(),
access_list: msg.access_list,
- odd_y_parity: recid.serialize() != 0,
- r,
- s,
+ signature: ethereum::eip1559::TransactionSignature::new(recid.serialize() != 0, r, s)
+ .unwrap(),
+ })
+ }
+}
+
+pub struct EIP7702UnsignedTransaction {
+ pub nonce: U256,
+ pub max_priority_fee_per_gas: U256,
+ pub max_fee_per_gas: U256,
+ pub gas_limit: U256,
+ pub destination: TransactionAction,
+ pub value: U256,
+ pub data: Vec,
+}
+
+impl EIP7702UnsignedTransaction {
+ pub fn sign(
+ &self,
+ secret: &H256,
+ chain_id: Option,
+ authorization_list: AuthorizationList,
+ ) -> Transaction {
+ let secret = {
+ let mut sk: [u8; 32] = [0u8; 32];
+ sk.copy_from_slice(&secret[0..]);
+ libsecp256k1::SecretKey::parse(&sk).unwrap()
+ };
+ let chain_id = chain_id.unwrap_or(ChainId::get());
+ let msg = ethereum::EIP7702TransactionMessage {
+ chain_id,
+ nonce: self.nonce,
+ max_priority_fee_per_gas: self.max_priority_fee_per_gas,
+ max_fee_per_gas: self.max_fee_per_gas,
+ gas_limit: self.gas_limit,
+ destination: self.destination,
+ value: self.value,
+ data: self.data.clone(),
+ access_list: vec![],
+ authorization_list,
+ };
+ let signing_message = libsecp256k1::Message::parse_slice(&msg.hash()[..]).unwrap();
+
+ let (signature, recid) = libsecp256k1::sign(&signing_message, &secret);
+ let rs = signature.serialize();
+ let r = H256::from_slice(&rs[0..32]);
+ let s = H256::from_slice(&rs[32..64]);
+ Transaction::EIP7702(ethereum::EIP7702Transaction {
+ chain_id: msg.chain_id,
+ nonce: msg.nonce,
+ max_priority_fee_per_gas: msg.max_priority_fee_per_gas,
+ max_fee_per_gas: msg.max_fee_per_gas,
+ gas_limit: msg.gas_limit,
+ destination: msg.destination,
+ value: msg.value,
+ data: msg.data.clone(),
+ access_list: msg.access_list,
+ authorization_list: msg.authorization_list,
+ signature: ethereum::eip1559::TransactionSignature::new(recid.serialize() != 0, r, s)
+ .unwrap(),
})
}
}
diff --git a/pallets/ethereum-xcm/src/tests/mod.rs b/pallets/ethereum-xcm/src/tests/mod.rs
index aec02bf1ae1..c316749c685 100644
--- a/pallets/ethereum-xcm/src/tests/mod.rs
+++ b/pallets/ethereum-xcm/src/tests/mod.rs
@@ -16,3 +16,4 @@
mod v1;
mod v2;
+mod v3;
diff --git a/pallets/ethereum-xcm/src/tests/v1.rs b/pallets/ethereum-xcm/src/tests/v1/mod.rs
similarity index 100%
rename from pallets/ethereum-xcm/src/tests/v1.rs
rename to pallets/ethereum-xcm/src/tests/v1/mod.rs
diff --git a/pallets/ethereum-xcm/src/tests/v2.rs b/pallets/ethereum-xcm/src/tests/v2/mod.rs
similarity index 100%
rename from pallets/ethereum-xcm/src/tests/v2.rs
rename to pallets/ethereum-xcm/src/tests/v2/mod.rs
diff --git a/pallets/ethereum-xcm/src/tests/v3/eip7702.rs b/pallets/ethereum-xcm/src/tests/v3/eip7702.rs
new file mode 100644
index 00000000000..6af26ba8e1b
--- /dev/null
+++ b/pallets/ethereum-xcm/src/tests/v3/eip7702.rs
@@ -0,0 +1,534 @@
+// Copyright 2025 Moonbeam foundation
+// This file is part of Moonbeam.
+
+// Moonbeam is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Moonbeam is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Moonbeam. If not, see .
+use crate::{mock::*, Error, RawOrigin};
+use ethereum_types::{H160, U256};
+use frame_support::{
+ assert_noop, assert_ok,
+ dispatch::{Pays, PostDispatchInfo},
+ traits::{ConstU32, Get},
+ weights::Weight,
+ BoundedVec,
+};
+use sp_runtime::{DispatchError, DispatchErrorWithPostInfo};
+use xcm_primitives::{EthereumXcmTransaction, EthereumXcmTransactionV3};
+
+// pragma solidity ^0.6.6;
+// contract Test {
+// function foo() external pure returns (bool) {
+// return true;
+// }
+// function bar() external pure {
+// require(false, "error_msg");
+// }
+// }
+const CONTRACT: &str = "608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052\
+ 348015600f57600080fd5b506004361060325760003560e01c8063c2985578146037578063\
+ febb0f7e146057575b600080fd5b603d605f565b6040518082151515158152602001915050\
+ 60405180910390f35b605d6068565b005b60006001905090565b600060db576040517f08c3\
+ 79a00000000000000000000000000000000000000000000000000000000081526004018080\
+ 602001828103825260098152602001807f6572726f725f6d73670000000000000000000000\
+ 00000000000000000000000081525060200191505060405180910390fd5b56fea264697066\
+ 7358221220fde68a3968e0e99b16fabf9b2997a78218b32214031f8e07e2c502daf603a69e\
+ 64736f6c63430006060033";
+
+fn xcm_evm_transfer_eip_7702_transaction(destination: H160, value: U256) -> EthereumXcmTransaction {
+ EthereumXcmTransaction::V3(EthereumXcmTransactionV3 {
+ gas_limit: U256::from(0x5208),
+ action: ethereum::TransactionAction::Call(destination),
+ value,
+ input:
+ BoundedVec::>::try_from(
+ vec![],
+ )
+ .unwrap(),
+ access_list: None,
+ authorization_list: None,
+ })
+}
+
+fn xcm_evm_call_eip_7702_transaction(destination: H160, input: Vec) -> EthereumXcmTransaction {
+ EthereumXcmTransaction::V3(EthereumXcmTransactionV3 {
+ gas_limit: U256::from(0x100000),
+ action: ethereum::TransactionAction::Call(destination),
+ value: U256::zero(),
+ input:
+ BoundedVec::>::try_from(
+ input,
+ )
+ .unwrap(),
+ access_list: None,
+ authorization_list: None,
+ })
+}
+
+fn xcm_erc20_creation_eip_7702_transaction() -> EthereumXcmTransaction {
+ EthereumXcmTransaction::V3(EthereumXcmTransactionV3 {
+ gas_limit: U256::from(0x100000),
+ action: ethereum::TransactionAction::Create,
+ value: U256::zero(),
+ input:
+ BoundedVec::>::try_from(
+ hex::decode(CONTRACT).unwrap(),
+ )
+ .unwrap(),
+ access_list: None,
+ authorization_list: None,
+ })
+}
+
+#[test]
+fn test_transact_xcm_evm_transfer() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ ext.execute_with(|| {
+ let balances_before = System::account(&bob.account_id);
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ xcm_evm_transfer_eip_7702_transaction(bob.address, U256::from(100)),
+ )
+ .expect("Failed to execute transaction");
+
+ assert_eq!(
+ System::account(&bob.account_id).data.free,
+ balances_before.data.free + 100
+ );
+ });
+}
+
+#[test]
+fn test_transact_xcm_create() {
+ let (pairs, mut ext) = new_test_ext(1);
+ let alice = &pairs[0];
+
+ ext.execute_with(|| {
+ assert_noop!(
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ xcm_erc20_creation_eip_7702_transaction()
+ ),
+ DispatchErrorWithPostInfo {
+ post_info: PostDispatchInfo {
+ actual_weight: Some(Weight::zero()),
+ pays_fee: Pays::Yes,
+ },
+ error: DispatchError::Other("Cannot convert xcm payload to known type"),
+ }
+ );
+ });
+}
+
+#[test]
+fn test_transact_xcm_evm_call_works() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ ext.execute_with(|| {
+ let t = EIP7702UnsignedTransaction {
+ nonce: U256::zero(),
+ max_priority_fee_per_gas: U256::one(),
+ max_fee_per_gas: U256::one(),
+ gas_limit: U256::from(0x100000),
+ destination: ethereum::TransactionAction::Create,
+ value: U256::zero(),
+ data: hex::decode(CONTRACT).unwrap(),
+ }
+ .sign(&alice.private_key, None, Vec::new());
+ assert_ok!(Ethereum::execute(alice.address, &t, None, None));
+
+ let contract_address = hex::decode("32dcab0ef3fb2de2fce1d2e0799d36239671f04a").unwrap();
+ let foo = hex::decode("c2985578").unwrap();
+ let bar = hex::decode("febb0f7e").unwrap();
+
+ let _ = EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(bob.address).into(),
+ xcm_evm_call_eip_7702_transaction(H160::from_slice(&contract_address), foo),
+ )
+ .expect("Failed to call `foo`");
+
+ // Evm call failing still succesfully dispatched
+ let _ = EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(bob.address).into(),
+ xcm_evm_call_eip_7702_transaction(H160::from_slice(&contract_address), bar),
+ )
+ .expect("Failed to call `bar`");
+
+ assert!(pallet_ethereum::Pending::::count() == 2);
+
+ // Transaction is in Pending storage, with nonce 0 and status 1 (evm succeed).
+ let (transaction_0, _, receipt_0) = &pallet_ethereum::Pending::::get(0).unwrap();
+ match (transaction_0, receipt_0) {
+ (&crate::Transaction::EIP1559(ref t), &crate::Receipt::EIP1559(ref r)) => {
+ assert!(t.nonce == U256::from(0u8));
+ assert!(r.status_code == 1u8);
+ }
+ _ => unreachable!(),
+ }
+
+ // Transaction is in Pending storage, with nonce 1 and status 0 (evm failed).
+ let (transaction_1, _, receipt_1) = &pallet_ethereum::Pending::::get(1).unwrap();
+ match (transaction_1, receipt_1) {
+ (&crate::Transaction::EIP1559(ref t), &crate::Receipt::EIP1559(ref r)) => {
+ assert!(t.nonce == U256::from(1u8));
+ assert!(r.status_code == 0u8);
+ }
+ _ => unreachable!(),
+ }
+ });
+}
+
+#[test]
+fn test_transact_xcm_validation_works() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ ext.execute_with(|| {
+ // Not enough gas limit to cover the transaction cost.
+ assert_noop!(
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ EthereumXcmTransaction::V3(EthereumXcmTransactionV3 {
+ gas_limit: U256::from(0x5207),
+ action: ethereum::TransactionAction::Call(bob.address),
+ value: U256::one(),
+ input: BoundedVec::<
+ u8,
+ ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }>,
+ >::try_from(vec![])
+ .unwrap(),
+ access_list: None,
+ authorization_list: None,
+ }),
+ ),
+ DispatchErrorWithPostInfo {
+ post_info: PostDispatchInfo {
+ actual_weight: Some(Weight::zero()),
+ pays_fee: Pays::Yes,
+ },
+ error: DispatchError::Other("Failed to validate ethereum transaction"),
+ }
+ );
+ });
+}
+
+#[test]
+fn test_ensure_transact_xcm_trough_no_proxy_error() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ ext.execute_with(|| {
+ let r = EthereumXcm::transact_through_proxy(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ bob.address,
+ xcm_evm_transfer_eip_7702_transaction(bob.address, U256::from(100)),
+ );
+ assert!(r.is_err());
+ assert_eq!(
+ r.unwrap_err().error,
+ sp_runtime::DispatchError::Other("proxy error: expected `ProxyType::Any`"),
+ );
+ });
+}
+
+#[test]
+fn test_ensure_transact_xcm_trough_proxy_error() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ ext.execute_with(|| {
+ let _ = Proxy::add_proxy_delegate(
+ &bob.account_id,
+ alice.account_id.clone(),
+ ProxyType::NotAllowed,
+ 0,
+ );
+ let r = EthereumXcm::transact_through_proxy(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ bob.address,
+ xcm_evm_transfer_eip_7702_transaction(bob.address, U256::from(100)),
+ );
+ assert!(r.is_err());
+ assert_eq!(
+ r.unwrap_err().error,
+ sp_runtime::DispatchError::Other("proxy error: expected `ProxyType::Any`"),
+ );
+ });
+}
+
+#[test]
+fn test_ensure_transact_xcm_trough_proxy_ok() {
+ let (pairs, mut ext) = new_test_ext(3);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+ let charlie = &pairs[2];
+
+ let allowed_proxies = vec![ProxyType::Any];
+
+ for proxy in allowed_proxies.into_iter() {
+ ext.execute_with(|| {
+ let _ = Proxy::add_proxy_delegate(&bob.account_id, alice.account_id.clone(), proxy, 0);
+ let alice_before = System::account(&alice.account_id);
+ let bob_before = System::account(&bob.account_id);
+ let charlie_before = System::account(&charlie.account_id);
+
+ let r = EthereumXcm::transact_through_proxy(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ bob.address,
+ xcm_evm_transfer_eip_7702_transaction(charlie.address, U256::from(100)),
+ );
+ // Transact succeeded
+ assert!(r.is_ok());
+
+ let alice_after = System::account(&alice.account_id);
+ let bob_after = System::account(&bob.account_id);
+ let charlie_after = System::account(&charlie.account_id);
+
+ // Alice remains unchanged
+ assert_eq!(alice_before, alice_after);
+
+ // Bob nonce was increased
+ assert_eq!(bob_after.nonce, bob_before.nonce + 1);
+
+ // Bob sent some funds without paying any fees
+ assert_eq!(bob_after.data.free, bob_before.data.free - 100);
+
+ // Charlie receive some funds
+ assert_eq!(charlie_after.data.free, charlie_before.data.free + 100);
+
+ // Clear proxy
+ let _ =
+ Proxy::remove_proxy_delegate(&bob.account_id, alice.account_id.clone(), proxy, 0);
+ });
+ }
+}
+
+#[test]
+fn test_global_nonce_incr() {
+ let (pairs, mut ext) = new_test_ext(3);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+ let charlie = &pairs[2];
+
+ ext.execute_with(|| {
+ assert_eq!(EthereumXcm::nonce(), U256::zero());
+
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ xcm_evm_transfer_eip_7702_transaction(charlie.address, U256::one()),
+ )
+ .expect("Failed to execute transaction from Alice to Charlie");
+
+ assert_eq!(EthereumXcm::nonce(), U256::one());
+
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(bob.address).into(),
+ xcm_evm_transfer_eip_7702_transaction(charlie.address, U256::one()),
+ )
+ .expect("Failed to execute transaction from Bob to Charlie");
+
+ assert_eq!(EthereumXcm::nonce(), U256::from(2));
+ });
+}
+
+#[test]
+fn test_global_nonce_not_incr() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ ext.execute_with(|| {
+ assert_eq!(EthereumXcm::nonce(), U256::zero());
+
+ let invalid_transaction_cost =
+ EthereumXcmTransaction::V3(
+ EthereumXcmTransactionV3 {
+ gas_limit: U256::one(),
+ action: ethereum::TransactionAction::Call(bob.address),
+ value: U256::one(),
+ input: BoundedVec::<
+ u8,
+ ConstU32<{ xcm_primitives::MAX_ETHEREUM_XCM_INPUT_SIZE }>,
+ >::try_from(vec![])
+ .unwrap(),
+ access_list: None,
+ authorization_list: None,
+ },
+ );
+
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ invalid_transaction_cost,
+ )
+ .expect_err("Failed to execute transaction from Alice to Bob");
+
+ assert_eq!(EthereumXcm::nonce(), U256::zero());
+ });
+}
+
+#[test]
+fn test_transaction_hash_collision() {
+ let (pairs, mut ext) = new_test_ext(3);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+ let charlie = &pairs[2];
+
+ ext.execute_with(|| {
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ xcm_evm_transfer_eip_7702_transaction(charlie.address, U256::one()),
+ )
+ .expect("Failed to execute transaction from Alice to Charlie");
+
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(bob.address).into(),
+ xcm_evm_transfer_eip_7702_transaction(charlie.address, U256::one()),
+ )
+ .expect("Failed to execute transaction from Bob to Charlie");
+
+ let mut hashes = pallet_ethereum::Pending::::iter_values()
+ .map(|(tx, _, _)| tx.hash())
+ .collect::>();
+
+ // Holds two transactions hashes
+ assert_eq!(hashes.len(), 2);
+
+ hashes.dedup();
+
+ // Still holds two transactions hashes after removing potential consecutive repeated values.
+ assert_eq!(hashes.len(), 2);
+ });
+}
+
+#[test]
+fn check_suspend_ethereum_to_xcm_works() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ let db_weights: frame_support::weights::RuntimeDbWeight =
+ ::DbWeight::get();
+
+ ext.execute_with(|| {
+ assert_ok!(EthereumXcm::suspend_ethereum_xcm_execution(
+ RuntimeOrigin::root(),
+ ));
+ assert_noop!(
+ EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ xcm_evm_transfer_eip_7702_transaction(bob.address, U256::from(100)),
+ ),
+ DispatchErrorWithPostInfo {
+ error: Error::::EthereumXcmExecutionSuspended.into(),
+ post_info: PostDispatchInfo {
+ actual_weight: Some(db_weights.reads(1)),
+ pays_fee: Pays::Yes
+ }
+ }
+ );
+
+ assert_noop!(
+ EthereumXcm::transact_through_proxy(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ bob.address,
+ xcm_evm_transfer_eip_7702_transaction(bob.address, U256::from(100)),
+ ),
+ DispatchErrorWithPostInfo {
+ error: Error::::EthereumXcmExecutionSuspended.into(),
+ post_info: PostDispatchInfo {
+ actual_weight: Some(db_weights.reads(1)),
+ pays_fee: Pays::Yes
+ }
+ }
+ );
+ });
+}
+
+#[test]
+fn transact_after_resume_ethereum_to_xcm_works() {
+ let (pairs, mut ext) = new_test_ext(2);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+
+ ext.execute_with(|| {
+ let bob_before = System::account(&bob.account_id);
+
+ assert_ok!(EthereumXcm::suspend_ethereum_xcm_execution(
+ RuntimeOrigin::root()
+ ));
+
+ assert_ok!(EthereumXcm::resume_ethereum_xcm_execution(
+ RuntimeOrigin::root()
+ ));
+ assert_ok!(EthereumXcm::transact(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ xcm_evm_transfer_eip_7702_transaction(bob.address, U256::from(100)),
+ ));
+ let bob_after = System::account(&bob.account_id);
+
+ // Bob sent some funds without paying any fees
+ assert_eq!(bob_after.data.free, bob_before.data.free + 100);
+ });
+}
+
+#[test]
+fn transact_through_proxy_after_resume_ethereum_to_xcm_works() {
+ let (pairs, mut ext) = new_test_ext(3);
+ let alice = &pairs[0];
+ let bob = &pairs[1];
+ let charlie = &pairs[2];
+
+ ext.execute_with(|| {
+ let _ =
+ Proxy::add_proxy_delegate(&bob.account_id, alice.account_id.clone(), ProxyType::Any, 0);
+ let alice_before = System::account(&alice.account_id);
+ let bob_before = System::account(&bob.account_id);
+ let charlie_before = System::account(&charlie.account_id);
+
+ assert_ok!(EthereumXcm::suspend_ethereum_xcm_execution(
+ RuntimeOrigin::root()
+ ));
+
+ assert_ok!(EthereumXcm::resume_ethereum_xcm_execution(
+ RuntimeOrigin::root()
+ ));
+ assert_ok!(EthereumXcm::transact_through_proxy(
+ RawOrigin::XcmEthereumTransaction(alice.address).into(),
+ bob.address,
+ xcm_evm_transfer_eip_7702_transaction(charlie.address, U256::from(100)),
+ ));
+
+ let alice_after = System::account(&alice.account_id);
+ let bob_after = System::account(&bob.account_id);
+ let charlie_after = System::account(&charlie.account_id);
+
+ // Alice remains unchanged
+ assert_eq!(alice_before, alice_after);
+
+ // Bob nonce was increased
+ assert_eq!(bob_after.nonce, bob_before.nonce + 1);
+
+ // Bob sent some funds without paying any fees
+ assert_eq!(bob_after.data.free, bob_before.data.free - 100);
+
+ // Charlie receive some funds
+ assert_eq!(charlie_after.data.free, charlie_before.data.free + 100);
+ });
+}
diff --git a/pallets/ethereum-xcm/src/tests/v3/mod.rs b/pallets/ethereum-xcm/src/tests/v3/mod.rs
new file mode 100644
index 00000000000..96874da069d
--- /dev/null
+++ b/pallets/ethereum-xcm/src/tests/v3/mod.rs
@@ -0,0 +1,17 @@
+// Copyright 2025 Moonbeam foundation
+// This file is part of Moonbeam.
+
+// Moonbeam is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+
+// Moonbeam is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License
+// along with Moonbeam. If not, see .
+
+mod eip7702;
diff --git a/pallets/moonbeam-foreign-assets/src/evm.rs b/pallets/moonbeam-foreign-assets/src/evm.rs
index 91e2f80a2b2..0431d025e9b 100644
--- a/pallets/moonbeam-foreign-assets/src/evm.rs
+++ b/pallets/moonbeam-foreign-assets/src/evm.rs
@@ -142,6 +142,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
None,
@@ -191,6 +192,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
Some(weight_limit),
@@ -240,6 +242,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
Some(weight_limit),
@@ -297,6 +300,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
Some(weight_limit),
@@ -345,6 +349,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
Some(weight_limit),
@@ -385,6 +390,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
Some(weight_limit),
@@ -430,6 +436,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
Some(weight_limit),
@@ -474,6 +481,7 @@ impl EvmCaller {
None,
None,
Default::default(),
+ Default::default(),
false,
false,
None,
diff --git a/pallets/precompile-benchmarks/src/mock.rs b/pallets/precompile-benchmarks/src/mock.rs
index 6085022eb0a..cdbc5ab0644 100644
--- a/pallets/precompile-benchmarks/src/mock.rs
+++ b/pallets/precompile-benchmarks/src/mock.rs
@@ -88,7 +88,7 @@ impl PrecompileHandle for MockHandle {
if self
.record_cost(precompile_utils::evm::costs::call_cost(
context.apparent_value,
- &evm::Config::cancun(),
+ &evm::Config::pectra(),
))
.is_err()
{
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index ab1b7a87a36..9b29ffcf2aa 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -6,16 +6,16 @@ settings:
overrides:
'@openzeppelin/contracts': 5.3.0
- '@polkadot/api': 16.3.1
- '@polkadot/api-derive': 16.3.1
+ '@polkadot/api': 16.4.3
+ '@polkadot/api-derive': 16.4.3
'@polkadot/keyring': 13.5.3
- '@polkadot/rpc-provider': 16.3.1
- '@polkadot/typegen': 16.3.1
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/rpc-provider': 16.4.3
+ '@polkadot/typegen': 16.4.3
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3
- ethers: 6.14.4
+ ethers: 6.15.0
tsup: 8.5.0
importers:
@@ -26,26 +26,26 @@ importers:
specifier: 5.3.0
version: 5.3.0
'@polkadot/api':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/api-derive':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring':
specifier: 13.5.3
version: 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
'@polkadot/rpc-provider':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/typegen':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/types':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
'@polkadot/types-codec':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
'@polkadot/util':
specifier: 13.5.3
version: 13.5.3
@@ -53,8 +53,8 @@ importers:
specifier: 13.5.3
version: 13.5.3(@polkadot/util@13.5.3)
ethers:
- specifier: 6.14.4
- version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 6.15.0
+ version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
tsup:
specifier: 8.5.0
version: 8.5.0(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
@@ -99,11 +99,11 @@ importers:
specifier: 1.1.18
version: 1.1.18
'@polkadot/api':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/api-derive':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/apps-config':
specifier: 0.159.1
version: 0.159.1(@polkadot/keyring@13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3))(bufferutil@4.0.9)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(tsx@4.20.3)(utf-8-validate@5.0.10)(yaml@2.8.0)
@@ -111,14 +111,14 @@ importers:
specifier: 13.5.3
version: 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
'@polkadot/rpc-provider':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/types':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
'@polkadot/types-codec':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
'@polkadot/util':
specifier: 13.5.3
version: 13.5.3
@@ -147,8 +147,8 @@ importers:
specifier: github:aurora-is-near/eth-object#master
version: https://codeload.github.com/aurora-is-near/eth-object/tar.gz/c8d641a61279ea8fd709d5fd3010b7dc39991e65(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10)
ethers:
- specifier: 6.14.4
- version: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 6.15.0
+ version: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
json-bigint:
specifier: 1.0.0
version: 1.0.0
@@ -177,8 +177,8 @@ importers:
specifier: '*'
version: 4.20.3
viem:
- specifier: 2.31.6
- version: 2.31.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)
+ specifier: 2.34.0
+ version: 2.34.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)
vitest:
specifier: 3.1.3
version: 3.1.3(@types/debug@4.1.12)(@types/node@24.0.10)(@vitest/ui@3.1.3)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(tsx@4.20.3)(yaml@2.8.0)
@@ -226,8 +226,8 @@ importers:
specifier: '*'
version: 2.0.6
'@polkadot/api':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/api-base':
specifier: '*'
version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
@@ -235,14 +235,14 @@ importers:
specifier: '*'
version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/typegen':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/types':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
'@polkadot/types-codec':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
tsup:
specifier: 8.5.0
version: 8.5.0(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
@@ -259,8 +259,8 @@ importers:
specifier: workspace:*
version: link:../types-bundle
'@polkadot/api':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/api-base':
specifier: '*'
version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
@@ -268,14 +268,14 @@ importers:
specifier: '*'
version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/typegen':
- specifier: 16.3.1
- version: 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ specifier: 16.4.3
+ version: 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/types':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
'@polkadot/types-codec':
- specifier: 16.3.1
- version: 16.3.1
+ specifier: 16.4.3
+ version: 16.4.3
'@types/node':
specifier: '*'
version: 24.0.10
@@ -316,7 +316,7 @@ packages:
'@acala-network/type-definitions@5.1.2':
resolution: {integrity: sha512-di3HH8Zn8i1jkQkQiwc44A8ovN9MvK5HwcNV3ngvW3TeF0dHbpHBQHdElJYpVge5IaEyhQ0kWihIEnVqpw4G9A==}
peerDependencies:
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@adraffy/ens-normalize@1.10.1':
resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==}
@@ -352,7 +352,7 @@ packages:
'@bifrost-finance/type-definitions@1.11.3':
resolution: {integrity: sha512-mNW+FfvKZqa1axChEd1ReRpw3P8siiW28YQ8BBJpR2syZqb5cJWOG4Sr/dj3lBcBNQqcqnAUkZPnBxQj8+Ftvg==}
peerDependencies:
- '@polkadot/api': 16.3.1
+ '@polkadot/api': 16.4.3
'@biomejs/biome@2.0.6':
resolution: {integrity: sha512-RRP+9cdh5qwe2t0gORwXaa27oTOiQRQvrFf49x2PA1tnpsyU7FIHX4ZOFMtBC4QNtyWsN7Dqkf5EDbg4X+9iqA==}
@@ -875,7 +875,7 @@ packages:
'@kiltprotocol/type-definitions@1.11502.0':
resolution: {integrity: sha512-T6+xVs8uV3jsl+6q7hEwwaNf8wEVoUJnepRBuEanKaUJX1sWyvRULAFjWVceU8eS4+8gT9ORC6KGKlyZnQp4kg==}
peerDependencies:
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@laminar/type-definitions@0.3.1':
resolution: {integrity: sha512-QWC2qtvbPIxal+gMfUocZmwK0UsD7Sb0RUm4Hallkp+OXXL+3uBLwztYDLS5LtocOn0tfR//sgpnfsEIEb71Lw==}
@@ -888,7 +888,7 @@ packages:
resolution: {integrity: sha512-kr4mVMuQ6DqZ0H72z0YI8tcdlk4XD4vUgRVYYfTJdXFJhRsfS4YRxfs/iiQPNzWKgoQZKcDqsbQD3xz9T1gELw==}
engines: {node: '>=18.0.0'}
peerDependencies:
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@metaverse-network-sdk/type-definitions@0.0.1-16':
resolution: {integrity: sha512-lo1NbA0gi+Tu23v4cTkN/oxEhQxaf3QxQ2qvUUfTxDU7a1leYp2Bw3IcoUvqHAGb/PPp8bNmYQfAKXsjqp+LZw==}
@@ -931,6 +931,10 @@ packages:
resolution: {integrity: sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==}
engines: {node: ^14.21.3 || >=16}
+ '@noble/curves@1.9.6':
+ resolution: {integrity: sha512-GIKz/j99FRthB8icyJQA51E8Uk5hXmdyThjgQXRKiv9h0zeRlzSCLIzFw6K1LotZ3XuB7yzlf76qk7uBmTdFqA==}
+ engines: {node: ^14.21.3 || >=16}
+
'@noble/ed25519@1.7.5':
resolution: {integrity: sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA==}
@@ -1321,6 +1325,10 @@ packages:
resolution: {integrity: sha512-InfHLhDXj698hE+qJJbIJlPReEadQ3FBcrpikxl4quy1b62KwrQ+bZGZDBd3eMrkde2s4n+S5wqGqdGfYoxXLg==}
engines: {node: '>=18'}
+ '@polkadot/api-augment@16.4.3':
+ resolution: {integrity: sha512-0dchDoz1bg3BEXp8GKM0uPXDFi+CC4XftTPVXiJVji0Uh+UpA7nwuPZCFunUWGyE8A4odQh/gOlOsRBVgCrngQ==}
+ engines: {node: '>=18'}
+
'@polkadot/api-base@15.10.2':
resolution: {integrity: sha512-7DJw++5IbPrsLPGcTlIZbMOretfvQJG80CW8+A+t2BLxbbv+I2neWNQ9QV9O28XsbOHzNgKHXuRyirdaG/dvrg==}
engines: {node: '>=18'}
@@ -1329,12 +1337,20 @@ packages:
resolution: {integrity: sha512-XWgM1LAgakZVJNaKwnrryd1Q4ThA0sr7YMvpvanDUhJZz4U7Nw7fXZP+3wcEuB35PLG85XpE3j0wJTBOfifDcQ==}
engines: {node: '>=18'}
- '@polkadot/api-derive@16.3.1':
- resolution: {integrity: sha512-8y4SZoyBT1J+Cm40wcXTUFAFyOKOjGyYOIJ3+euwAeZvkUXA03fVohefLUZz2uVgEds1+P9OlpxJ52nWHpR3rg==}
+ '@polkadot/api-base@16.4.2':
+ resolution: {integrity: sha512-tPKRnkUMoHy6Qo4mKBjFRxNjGunbybQ0bRTdaa4vfLPUExp1hVVcMH/VCUMDpuFT/1ueonZSKswkD/sGkN6sig==}
+ engines: {node: '>=18'}
+
+ '@polkadot/api-base@16.4.3':
+ resolution: {integrity: sha512-sotZm4tBlux9pKZUME3ZfQjSgxQ6OAkK4AtHgZgl7/rvXJDLywcD7VRDQNXzomePGdItFQZwbnbwwkzQwGoD/Q==}
+ engines: {node: '>=18'}
+
+ '@polkadot/api-derive@16.4.3':
+ resolution: {integrity: sha512-Zlvf/XrQdP98X8chM01nzjAIDLeWQ1CipPlgphXwYjCfqwQuOIDoXyQQX3r8QjskSRKl5lBec/EQD9Nb46/CpQ==}
engines: {node: '>=18'}
- '@polkadot/api@16.3.1':
- resolution: {integrity: sha512-QC+ZaAWWNUs4K9r1UVfeCvCHKobGzb0Da2nJsXEmXJOTd4NmI7WzQSNmyYDEeSQMadSUN1JdYF737wzBRWnnzA==}
+ '@polkadot/api@16.4.3':
+ resolution: {integrity: sha512-d/yn9oT69zXUzC+KVqC8+tKxlqA9s/QzGSCdbUEpWPVmHoulLuw/ODEvYiJgWyuXelWjpqJoNPFQ8qWNRxZIkQ==}
engines: {node: '>=18'}
'@polkadot/apps-config@0.159.1':
@@ -1352,6 +1368,10 @@ packages:
resolution: {integrity: sha512-90UbcIYZArg0DcP+6ZRWKy6Xqo0r46WfBuaKvYJIvfObgr5Pm4aPnAagEKehLJAStRdhEOpYozmKT1v3z8dHcw==}
engines: {node: '>=18'}
+ '@polkadot/networks@13.5.4':
+ resolution: {integrity: sha512-JD7brNZsWTWbT3bDnEsAYkJfESvmn1XcoFMLoivVrg8dPXqYxoWcYveKPORjPyMPP6wgJ498vJGq7Ce0ihZ8ig==}
+ engines: {node: '>=18'}
+
'@polkadot/react-identicon@3.15.1':
resolution: {integrity: sha512-dYhjmZUA2yj9zzT7v7hOfcnK/5iTWsC1zEKYLtrcFUK38MN5vHWl5OTpXys0dL6HTfZGdS7Y5RIZS0rxgFUBkQ==}
engines: {node: '>=18'}
@@ -1371,6 +1391,14 @@ packages:
resolution: {integrity: sha512-bKQTSySLFm+3bphmX69JEP4hkLBW85ooGfsPKu4Ai7x0IzTmSin8bQhTHptxZG/3ie5cz6kXft00E5hQTvEQ8w==}
engines: {node: '>=18'}
+ '@polkadot/rpc-augment@16.4.2':
+ resolution: {integrity: sha512-svg+HYT+TCbaDHTxZLnEbN1QQg8drsbc8LtGZYFJX9sE4261TaZ1+NvaldfjyD4u+6DwSHbWxTcXxX78Jk/3hA==}
+ engines: {node: '>=18'}
+
+ '@polkadot/rpc-augment@16.4.3':
+ resolution: {integrity: sha512-iQPBSpQsbJi06p6HE7urj17VfoPwUWSfUvFzQRIiFhvqhP7ELZwleORotZX+7NQEJ4WVSxgYHMEIays84x4ckQ==}
+ engines: {node: '>=18'}
+
'@polkadot/rpc-core@15.10.2':
resolution: {integrity: sha512-vqDvr1WcHH3WPzDV4WTlf2S5cDmIoFPciynJ8eNcKqR3mG7Cqd0iL+MG6s0KFXdSY2Qvtl+0C6yZN0xr4Ha6BQ==}
engines: {node: '>=18'}
@@ -1379,12 +1407,20 @@ packages:
resolution: {integrity: sha512-SI/FDQEymBKdVaUnREEX8YVsyYX6oCCWF/AFdmSq485XlDRsP3a7/TWbVobDoX0lQEARmnycvlp8yTwTBdFktw==}
engines: {node: '>=18'}
- '@polkadot/rpc-provider@16.3.1':
- resolution: {integrity: sha512-18hAErZUV3jd+jCmVclUYSpFVkYLOrQOvNXttaQ2kKHn8ROlUnUuEvPSkkONiEYTujVMbclr+WIh4eTe094u/g==}
+ '@polkadot/rpc-core@16.4.2':
+ resolution: {integrity: sha512-Thh3T0f9D0iWI2Aeb7Cgec/7hhGoC6l+LT9028VeumSSy47K7/keTPkY6u43tYAnZB6Quhyd7SMwJjgNmhmHEA==}
engines: {node: '>=18'}
- '@polkadot/typegen@16.3.1':
- resolution: {integrity: sha512-NPj06F33SfOeZxGCK02js7YltNnOhLSinwAe/GiA2ZwUXLcdHQJvvY+VANf4hMNb8YMoQ+stJMWjdurC/1rK7Q==}
+ '@polkadot/rpc-core@16.4.3':
+ resolution: {integrity: sha512-aYWFdd5B5nkDf+FnNPvdr3QZ7J8zPeJO9d4GbKBfwsSc6szW+O3gxc76nP7XOMQzNZeK54rtWsf+u/AyAxaWqw==}
+ engines: {node: '>=18'}
+
+ '@polkadot/rpc-provider@16.4.3':
+ resolution: {integrity: sha512-FAMiMCeF/APSALV9h8Ifxm92A35RbrldmeG/B9vuEyTaLV3+7RLax9Jpy5IBZlReFWryjAwilRNc0K8nADnoPA==}
+ engines: {node: '>=18'}
+
+ '@polkadot/typegen@16.4.3':
+ resolution: {integrity: sha512-z8KcpYgJJkkOAXD3HxJAB+Hmbg1gFqK4nM+Cf8fQdoIx7KUU9vmKwcupb00BNRAR9gt9+wiHREyQcw5L1GQ+4Q==}
engines: {node: '>=18'}
hasBin: true
@@ -1392,24 +1428,36 @@ packages:
resolution: {integrity: sha512-s7xJ4ZeFAIrjsRryT+9xUGtrRkVWTzRoqONrHitPXcntTNFO/dLWnQ0mOoSHPOsDaQa0Rx0wt8vhjf07t/QpGA==}
engines: {node: '>=18'}
- '@polkadot/types-codec@16.3.1':
- resolution: {integrity: sha512-8W58lfRB6jbgrmaWTqEqPKp04c88J4+gtG8sCt8HG9et5c5qXwY/tkabX8vAyCXrZYsUjfMVErLdCzg6B9uBog==}
+ '@polkadot/types-augment@16.4.3':
+ resolution: {integrity: sha512-p2xaPeC1OqtPeOqyAMrvH6hiegz3wNRrWtYC/HDfVPzwYS5/rxID8Zl+qUp7DEB+6Sn8EKHdqZWyAhwsHOM+Yg==}
+ engines: {node: '>=18'}
+
+ '@polkadot/types-codec@16.4.3':
+ resolution: {integrity: sha512-tsezTQwwf6dnCK9ShKt3HbzTH+8nWYYhdcExwx90PYIXUmMb0zbK5bfVLSyh1VvcSy6a9TeBR/AiL6n8/c5gDg==}
engines: {node: '>=18'}
- '@polkadot/types-create@16.3.1':
- resolution: {integrity: sha512-rA7nHGHyzCHQRJUpOS6tn2qlGX7ez0PecETZZCTx6eFc9XMr9HLLuPuhDir3f4psbJ/DMfta2XOh3oZ/cTz+ng==}
+ '@polkadot/types-create@16.4.2':
+ resolution: {integrity: sha512-vcX44omoWDIKJWpSWHRwP6F4clZ+mWPC/uPN5xzRISVCbzNCxNf354m37g/k3c47FxuDAvv91cqncWuh5ZbqyA==}
engines: {node: '>=18'}
- '@polkadot/types-known@16.3.1':
- resolution: {integrity: sha512-OUgvIDnNJC3cblrMTFDCz07uGLEqKE3PApuOKU2X5DrAR+Hn5QDASH2v9ESU1ENqfdKjqjf9gM09NqjUoJYVHQ==}
+ '@polkadot/types-create@16.4.3':
+ resolution: {integrity: sha512-DVBn4hZ6IJhfmRCZfaHaF40nGooLHEzLaIm4O3w4fw10msk37EcZqbC1sCviSfu5E3vtDVQEIAmI+EYN3Ao3cA==}
engines: {node: '>=18'}
- '@polkadot/types-support@16.3.1':
- resolution: {integrity: sha512-RzckKzeqXqfr0oIHkYeARTVZP8idpyHC9IQyqzHgxCgejLWBbNXlLmFAWnNqx2M4mTy5wV9ODqFvnzXL8EFK/Q==}
+ '@polkadot/types-known@16.4.2':
+ resolution: {integrity: sha512-nEpBh3d27Oe28l0NUL/Bj2OLtMivuroDKtwxseLyUJe1zvQCp6aobVDhybSYbrHWLcTGI0Yrc5upGpUzCRD+7A==}
engines: {node: '>=18'}
- '@polkadot/types@16.3.1':
- resolution: {integrity: sha512-OTgFDksv8gcvvNmU1oaYpYPwzmeAucsb8u60CIp/zHHIEiOb3cYBuRRCFqAvBp+fr4t6KN8yjCs2HrPs0yS1ug==}
+ '@polkadot/types-known@16.4.3':
+ resolution: {integrity: sha512-E2SGAlQMM6+yMhqw4B517dB404R/PBE5TQBKKVrXsZhOjrDBbBjlHovK01m/dY9Jyq63rlFomFLj7W3gG0Ubpg==}
+ engines: {node: '>=18'}
+
+ '@polkadot/types-support@16.4.3':
+ resolution: {integrity: sha512-7kecKQXtH0wAHn2e2LeXYqA0t8YlSDuuUtEdnmlOlyCKwYJrQRWCwlOnkl/tixp//ZHYdr7i0JYB66y80mQYTA==}
+ engines: {node: '>=18'}
+
+ '@polkadot/types@16.4.3':
+ resolution: {integrity: sha512-QkyNbjw0+yw+fHJoE1EDaxs3IiqZMqrBq8XnlpqPr3OohzhkkB1r3cM25dl3bnfX99Y13HgYtQIFqKPDb1hgpw==}
engines: {node: '>=18'}
'@polkadot/ui-settings@3.15.1':
@@ -1479,14 +1527,26 @@ packages:
resolution: {integrity: sha512-o408qh3P+st/3ghTgVd4ATrePqExd7UgWHXPTJ0i74Q7/3iI1cWMNloNQFNDZxnSNIPB/AnFk8sfEWfpfPLucw==}
engines: {node: '>=18'}
+ '@polkadot/x-bigint@13.5.4':
+ resolution: {integrity: sha512-vA4vjHWDUAnoAxzp1kSQMCzaArdagGXCNlooI2EOZ0pcFnEf4NkKCVjYg8i5L1QOYRAeJjgoKjKwCFBx63vtRw==}
+ engines: {node: '>=18'}
+
'@polkadot/x-fetch@13.5.3':
resolution: {integrity: sha512-+AFbo8JthkIEZtseOG8WhogAg0HnkvK4fUrCqn5YB8L7TJrIWxaAmccCarMLYQEAwYT7OKlBMbrMwRllGI9yRg==}
engines: {node: '>=18'}
+ '@polkadot/x-fetch@13.5.4':
+ resolution: {integrity: sha512-VVhmfPaQwFVopgtMUCNhodyZXBy9P4wkQwwYWpkQv2KqYOEQVck/Hhq8IVhGdbtPJxCAWsj/EyYTzUIHZ9aBlw==}
+ engines: {node: '>=18'}
+
'@polkadot/x-global@13.5.3':
resolution: {integrity: sha512-b8zEhDk6XDIXRGaPXnSxamQ3sVObm0xPRbkxbk2l9QiMB4MO1pOtAm5knQkHpC2Z+tVTy1SrSqUN5iqVnavicQ==}
engines: {node: '>=18'}
+ '@polkadot/x-global@13.5.4':
+ resolution: {integrity: sha512-oRUdO8/uKOEmLoPUFYgGascE/nyjT2ObRdf7jgwXOd9f+uUHPiE3K/MNAEi9t9sRKs8dbqgyaGWLTRYCDyzMag==}
+ engines: {node: '>=18'}
+
'@polkadot/x-randomvalues@13.5.3':
resolution: {integrity: sha512-BrKE5Q4dzHWNjwq0PX08uWlJIQOztVCJIYuZiIAj0ic33oLRrQuPojXFWhw/3McjXlVXscFNtsgIXsRli+boiQ==}
engines: {node: '>=18'}
@@ -1506,6 +1566,10 @@ packages:
resolution: {integrity: sha512-vIi9im6Zeo0eAagPSUF8WhdFBI1oomj4jF1R2jepiKmBVkT5HVn39MK2mix5fNjLESSa2K79iWYzS5VoVi0gxA==}
engines: {node: '>=18'}
+ '@polkadot/x-ws@13.5.4':
+ resolution: {integrity: sha512-tznbRjPnb3QW8v6+7zUoJINL84DW2dHJjwd0rkU0dtwzc9Y92faxz3bgOrCpgC2oVDpyUUg2PsyjokVBQHqLSA==}
+ engines: {node: '>=18'}
+
'@polymeshassociation/polymesh-types@5.7.0':
resolution: {integrity: sha512-6bw+Q6CpjAABeQKLZxE5TMwUwllq9GIWtHr+SBTn/02cLQYYrgPNX3JtQtK/VAAwhQ+AbAUMRlxlzGP16VaWog==}
@@ -1829,26 +1893,26 @@ packages:
'@unique-nft/opal-testnet-types@1003.70.0':
resolution: {integrity: sha512-vXJoV7cqwO21svd03DFL7bl8H77zFbJzgkUgNPLPbVA6YkZt+ZeDmbP9lKKPbNadB1DP84kOZPVvsbmzx7+Jxg==}
peerDependencies:
- '@polkadot/api': 16.3.1
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3
+ '@polkadot/types': 16.4.3
'@unique-nft/quartz-mainnet-types@1003.70.0':
resolution: {integrity: sha512-qs5iwMcDpBeJ6mXzSAbMB6DY9NkdAqPD1KmekOVG9Vug+hKWvSlfW5ozd63O/J2h7iliqwL0WZjDdwvBNdcTNg==}
peerDependencies:
- '@polkadot/api': 16.3.1
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3
+ '@polkadot/types': 16.4.3
'@unique-nft/sapphire-mainnet-types@1003.70.0':
resolution: {integrity: sha512-hEMpLDPZxUuGW+B90AxaF3Clw/kvGn20oao+Ejq4nrCNRF/2k3CjjuG1NScZVcPZuGgKPAkBPiHNSF9aRN6qFg==}
peerDependencies:
- '@polkadot/api': 16.3.1
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3
+ '@polkadot/types': 16.4.3
'@unique-nft/unique-mainnet-types@1001.63.0':
resolution: {integrity: sha512-IVr+F7+QvbW2zhbI2aWNtiOBXYAcd6GQ9HmDUdfSd4S0s3TSa8PAC/ikNvD3fk1A2FlBbWjVO0JyPDnnybv/og==}
peerDependencies:
- '@polkadot/api': 16.3.1
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3
+ '@polkadot/types': 16.4.3
'@vitest/expect@3.1.3':
resolution: {integrity: sha512-7FTQQuuLKmN1Ig/h+h/GO+44Q1IlglPlR2es4ab7Yvfx+Uk5xsv+Ykk+MEt/M2Yn/xGmzaLKxGw2lgy2bwuYqg==}
@@ -2859,8 +2923,8 @@ packages:
resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==}
engines: {node: '>=10.0.0'}
- ethers@6.14.4:
- resolution: {integrity: sha512-Jm/dzRs2Z9iBrT6e9TvGxyb5YVKAPLlpna7hjxH7KH/++DSh2T/JVmQUv7iHI5E55hDbp/gEVvstWYXVxXFzsA==}
+ ethers@6.15.0:
+ resolution: {integrity: sha512-Kf/3ZW54L4UT0pZtsY/rf+EkBU7Qi5nnhonjUb8yTXcxH3cdcWrV2cRyk0Xk/4jK6OoHhxxZHriyhje20If2hQ==}
engines: {node: '>=14.0.0'}
ethjs-unit@0.1.6:
@@ -4170,8 +4234,8 @@ packages:
typescript:
optional: true
- ox@0.8.1:
- resolution: {integrity: sha512-e+z5epnzV+Zuz91YYujecW8cF01mzmrUtWotJ0oEPym/G82uccs7q0WDHTYL3eiONbTUEvcZrptAKLgTBD3u2A==}
+ ox@0.8.7:
+ resolution: {integrity: sha512-W1f0FiMf9NZqtHPEDEAEkyzZDwbIKfmH2qmQx8NNiQ/9JhxrSblmtLJsSfTtQG5YKowLOnBlLVguCyxm/7ztxw==}
peerDependencies:
typescript: '>=5.4.0'
peerDependenciesMeta:
@@ -5341,8 +5405,8 @@ packages:
typescript:
optional: true
- viem@2.31.6:
- resolution: {integrity: sha512-2PPbXL/8bHQxUzaLFDk4R6WHifTcXxAqMC8/j6RBgXl/OexQ1HU8r9OukwfDTqrFoHtWWiYz5fktHATy7+U9nQ==}
+ viem@2.34.0:
+ resolution: {integrity: sha512-HJZG9Wt0DLX042MG0PK17tpataxtdAEhpta9/Q44FqKwy3xZMI5Lx4jF+zZPuXFuYjZ68R0PXqRwlswHs6r4gA==}
peerDependencies:
typescript: '>=5.0.4'
peerDependenciesMeta:
@@ -5720,18 +5784,6 @@ packages:
utf-8-validate:
optional: true
- ws@8.18.2:
- resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==}
- engines: {node: '>=10.0.0'}
- peerDependencies:
- bufferutil: ^4.0.1
- utf-8-validate: '>=5.0.2'
- peerDependenciesMeta:
- bufferutil:
- optional: true
- utf-8-validate:
- optional: true
-
ws@8.18.3:
resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==}
engines: {node: '>=10.0.0'}
@@ -5839,10 +5891,10 @@ snapshots:
'@acala-network/chopsticks-core@1.1.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@acala-network/chopsticks-executor': 1.1.1
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
- '@polkadot/types-known': 16.3.1
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/types-known': 16.4.2
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
comlink: 4.4.2
@@ -5899,10 +5951,10 @@ snapshots:
'@acala-network/chopsticks-core': 1.1.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@acala-network/chopsticks-db': 1.1.1(bufferutil@4.0.9)(ts-node@10.9.2(@types/node@24.0.10)(typescript@5.8.3))(utf-8-validate@5.0.10)
'@pnpm/npm-conf': 3.0.0
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/api-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
axios: 1.10.0(debug@4.4.1)
@@ -5939,9 +5991,9 @@ snapshots:
- typeorm-aurora-data-api-driver
- utf-8-validate
- '@acala-network/type-definitions@5.1.2(@polkadot/types@16.3.1)':
+ '@acala-network/type-definitions@5.1.2(@polkadot/types@16.4.3)':
dependencies:
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@adraffy/ens-normalize@1.10.1': {}
@@ -5978,9 +6030,9 @@ snapshots:
'@balena/dockerignore@1.0.2': {}
- '@bifrost-finance/type-definitions@1.11.3(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))':
+ '@bifrost-finance/type-definitions@1.11.3(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@biomejs/biome@2.0.6':
optionalDependencies:
@@ -6059,7 +6111,7 @@ snapshots:
'@digitalnative/type-definitions@1.1.27(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)':
dependencies:
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
transitivePeerDependencies:
- '@polkadot/util'
- '@polkadot/util-crypto'
@@ -6298,9 +6350,9 @@ snapshots:
'@fragnova/api-augment@0.1.0-spec-1.0.4-mainnet(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -6308,9 +6360,9 @@ snapshots:
'@frequency-chain/api-augment@1.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -6460,7 +6512,7 @@ snapshots:
'@jamton/parachain-ts-interfaces@1.10.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
transitivePeerDependencies:
- bufferutil
- supports-color
@@ -6487,9 +6539,9 @@ snapshots:
'@js-sdsl/ordered-map@4.4.2': {}
- '@kiltprotocol/type-definitions@1.11502.0(@polkadot/types@16.3.1)':
+ '@kiltprotocol/type-definitions@1.11502.0(@polkadot/types@16.4.3)':
dependencies:
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@laminar/type-definitions@0.3.1':
dependencies:
@@ -6497,7 +6549,7 @@ snapshots:
'@logion/node-api@0.27.0-4(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
'@types/uuid': 9.0.8
@@ -6508,9 +6560,9 @@ snapshots:
- supports-color
- utf-8-validate
- '@mangata-finance/type-definitions@2.1.2(@polkadot/types@16.3.1)':
+ '@mangata-finance/type-definitions@2.1.2(@polkadot/types@16.4.3)':
dependencies:
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@metaverse-network-sdk/type-definitions@0.0.1-16':
dependencies:
@@ -6520,12 +6572,12 @@ snapshots:
dependencies:
'@biomejs/biome': 2.0.6
'@moonbeam-network/types-bundle': 1.0.2(bufferutil@4.0.9)(postcss@8.5.6)(tsx@4.20.3)(utf-8-validate@5.0.10)(yaml@2.8.0)
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-base': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-core': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/typegen': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-base': 16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-core': 16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/typegen': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@types/node': 24.0.10
tsup: 8.5.0(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
tsx: 4.20.3
@@ -6543,12 +6595,12 @@ snapshots:
'@moonbeam-network/types-bundle@1.0.2(bufferutil@4.0.9)(postcss@8.5.6)(tsx@4.20.3)(utf-8-validate@5.0.10)(yaml@2.8.0)':
dependencies:
'@biomejs/biome': 2.0.6
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-base': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-core': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/typegen': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-base': 16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-core': 16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/typegen': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
tsup: 8.5.0(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0)
typescript: 5.8.3
transitivePeerDependencies:
@@ -6567,15 +6619,15 @@ snapshots:
'@acala-network/chopsticks': 1.1.1(bufferutil@4.0.9)(debug@4.4.1)(ts-node@10.9.2(@types/node@24.0.10)(typescript@5.8.3))(utf-8-validate@5.0.10)
'@inquirer/prompts': 7.6.0(@types/node@24.0.10)
'@moonbeam-network/api-augment': 0.3600.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10)(yaml@2.8.0)
- '@moonwall/types': 5.13.0(@types/debug@4.1.12)(@vitest/ui@3.1.3)(bufferutil@4.0.9)(chokidar@3.6.0)(encoding@0.1.13)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(yaml@2.8.0)(zod@3.25.67)
+ '@moonwall/types': 5.13.0(@types/debug@4.1.12)(@vitest/ui@3.1.3(vitest@3.1.3))(bufferutil@4.0.9)(chokidar@3.6.0)(encoding@0.1.13)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(yaml@2.8.0)(zod@3.25.67)
'@moonwall/util': 5.13.0(@types/debug@4.1.12)(@types/node@24.0.10)(bufferutil@4.0.9)(chokidar@3.6.0)(encoding@0.1.13)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(yaml@2.8.0)(zod@3.25.67)
'@octokit/rest': 21.1.1
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-derive': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-derive': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
'@types/react': 19.1.4
@@ -6591,7 +6643,7 @@ snapshots:
colors: 1.4.0
dockerode: 4.0.6
dotenv: 16.5.0
- ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
ink: 5.2.1(@types/react@19.1.4)(bufferutil@4.0.9)(react@18.3.1)(utf-8-validate@5.0.10)
jsonc-parser: 3.3.1
minimatch: 10.0.1
@@ -6660,22 +6712,22 @@ snapshots:
- utf-8-validate
- zod
- '@moonwall/types@5.13.0(@types/debug@4.1.12)(@vitest/ui@3.1.3)(bufferutil@4.0.9)(chokidar@3.6.0)(encoding@0.1.13)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(yaml@2.8.0)(zod@3.25.67)':
+ '@moonwall/types@5.13.0(@types/debug@4.1.12)(@vitest/ui@3.1.3(vitest@3.1.3))(bufferutil@4.0.9)(chokidar@3.6.0)(encoding@0.1.13)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(yaml@2.8.0)(zod@3.25.67)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/api-base': 15.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
'@types/node': 22.16.0
'@zombienet/utils': 0.0.28(@types/node@22.16.0)(chokidar@3.6.0)(typescript@5.8.3)
bottleneck: 2.19.5
- ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
pino: 9.7.0
polkadot-api: 1.11.1(bufferutil@4.0.9)(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(utf-8-validate@5.0.10)(yaml@2.8.0)
viem: 2.29.4(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)
- vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.16.0)(@vitest/ui@3.1.3)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(tsx@4.20.3)(yaml@2.8.0)
+ vitest: 3.1.3(@types/debug@4.1.12)(@types/node@22.16.0)(@vitest/ui@3.1.3(vitest@3.1.3))(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(tsx@4.20.3)(yaml@2.8.0)
web3: 4.16.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67)
transitivePeerDependencies:
- '@edge-runtime/vm'
@@ -6712,13 +6764,13 @@ snapshots:
dependencies:
'@inquirer/prompts': 7.6.0(@types/node@24.0.10)
'@moonbeam-network/api-augment': 0.3600.0(bufferutil@4.0.9)(postcss@8.5.6)(utf-8-validate@5.0.10)(yaml@2.8.0)
- '@moonwall/types': 5.13.0(@types/debug@4.1.12)(@vitest/ui@3.1.3)(bufferutil@4.0.9)(chokidar@3.6.0)(encoding@0.1.13)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(yaml@2.8.0)(zod@3.25.67)
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-derive': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@moonwall/types': 5.13.0(@types/debug@4.1.12)(@vitest/ui@3.1.3(vitest@3.1.3))(bufferutil@4.0.9)(chokidar@3.6.0)(encoding@0.1.13)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(postcss@8.5.6)(rxjs@7.8.2)(tsx@4.20.3)(typescript@5.8.3)(utf-8-validate@5.0.10)(yaml@2.8.0)(zod@3.25.67)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-derive': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
'@vitest/ui': 3.1.3(vitest@3.1.3)
@@ -6727,7 +6779,7 @@ snapshots:
clear: 0.1.0
colors: 1.4.0
dotenv: 16.5.0
- ethers: 6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ ethers: 6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)
pino: 9.7.0
pino-pretty: 13.0.0
rlp: 3.0.0
@@ -6787,6 +6839,10 @@ snapshots:
dependencies:
'@noble/hashes': 1.8.0
+ '@noble/curves@1.9.6':
+ dependencies:
+ '@noble/hashes': 1.8.0
+
'@noble/ed25519@1.7.5': {}
'@noble/hashes@1.3.2': {}
@@ -7310,9 +7366,23 @@ snapshots:
dependencies:
'@polkadot/api-base': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/rpc-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@polkadot/types-augment': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/util': 13.5.3
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@polkadot/api-augment@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/api-base': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-augment': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-augment': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
tslib: 2.8.1
transitivePeerDependencies:
@@ -7323,7 +7393,7 @@ snapshots:
'@polkadot/api-base@15.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@polkadot/rpc-core': 15.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@polkadot/util': 13.5.3
rxjs: 7.8.2
tslib: 2.8.1
@@ -7335,7 +7405,7 @@ snapshots:
'@polkadot/api-base@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@polkadot/rpc-core': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
'@polkadot/util': 13.5.3
rxjs: 7.8.1
tslib: 2.8.1
@@ -7344,14 +7414,38 @@ snapshots:
- supports-color
- utf-8-validate
- '@polkadot/api-derive@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ '@polkadot/api-base@16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-base': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-core': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/rpc-core': 16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/util': 13.5.3
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@polkadot/api-base@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/rpc-core': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/util': 13.5.3
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@polkadot/api-derive@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-augment': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-base': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-core': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
rxjs: 7.8.2
@@ -7361,20 +7455,20 @@ snapshots:
- supports-color
- utf-8-validate
- '@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ '@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-base': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-derive': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-augment': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-base': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-derive': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/rpc-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-core': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-augment': 16.3.1
- '@polkadot/types-codec': 16.3.1
- '@polkadot/types-create': 16.3.1
- '@polkadot/types-known': 16.3.1
+ '@polkadot/rpc-augment': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-core': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-augment': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/types-create': 16.4.3
+ '@polkadot/types-known': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
eventemitter3: 5.0.1
@@ -7387,8 +7481,8 @@ snapshots:
'@polkadot/apps-config@0.159.1(@polkadot/keyring@13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3))(bufferutil@4.0.9)(postcss@8.5.6)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)(tsx@4.20.3)(utf-8-validate@5.0.10)(yaml@2.8.0)':
dependencies:
- '@acala-network/type-definitions': 5.1.2(@polkadot/types@16.3.1)
- '@bifrost-finance/type-definitions': 1.11.3(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))
+ '@acala-network/type-definitions': 5.1.2(@polkadot/types@16.4.3)
+ '@bifrost-finance/type-definitions': 1.11.3(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))
'@crustio/type-definitions': 1.3.0
'@darwinia/types': 2.8.10
'@darwinia/types-known': 2.8.10
@@ -7400,22 +7494,22 @@ snapshots:
'@frequency-chain/api-augment': 1.11.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@interlay/interbtc-types': 1.13.0
'@jamton/parachain-ts-interfaces': 1.10.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@kiltprotocol/type-definitions': 1.11502.0(@polkadot/types@16.3.1)
+ '@kiltprotocol/type-definitions': 1.11502.0(@polkadot/types@16.4.3)
'@laminar/type-definitions': 0.3.1
'@logion/node-api': 0.27.0-4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@mangata-finance/type-definitions': 2.1.2(@polkadot/types@16.3.1)
+ '@mangata-finance/type-definitions': 2.1.2(@polkadot/types@16.4.3)
'@metaverse-network-sdk/type-definitions': 0.0.1-16
'@moonbeam-network/types-bundle': 1.0.2(bufferutil@4.0.9)(postcss@8.5.6)(tsx@4.20.3)(utf-8-validate@5.0.10)(yaml@2.8.0)
'@parallel-finance/type-definitions': 2.0.1
'@peaqnetwork/type-definitions': 0.0.4
'@pendulum-chain/type-definitions': 0.3.8
'@phala/typedefs': 0.2.33
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-derive': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-derive': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/networks': 13.5.3
'@polkadot/react-identicon': 3.15.1(@polkadot/keyring@13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3))(@polkadot/networks@13.5.3)(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
'@polkadot/wasm-util': 7.4.1(@polkadot/util@13.5.3)
@@ -7425,10 +7519,10 @@ snapshots:
'@snowfork/snowbridge-types': 0.2.7(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@sora-substrate/type-definitions': 1.27.7
'@subsocial/definitions': 0.8.14(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@unique-nft/opal-testnet-types': 1003.70.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)
- '@unique-nft/quartz-mainnet-types': 1003.70.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)
- '@unique-nft/sapphire-mainnet-types': 1003.70.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)
- '@unique-nft/unique-mainnet-types': 1001.63.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)
+ '@unique-nft/opal-testnet-types': 1003.70.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)
+ '@unique-nft/quartz-mainnet-types': 1003.70.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)
+ '@unique-nft/sapphire-mainnet-types': 1003.70.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)
+ '@unique-nft/unique-mainnet-types': 1001.63.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)
'@zeitgeistpm/type-defs': 1.0.0
'@zeroio/type-definitions': 0.0.14
pontem-types-bundle: 1.0.15(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
@@ -7461,6 +7555,12 @@ snapshots:
'@substrate/ss58-registry': 1.51.0
tslib: 2.8.1
+ '@polkadot/networks@13.5.4':
+ dependencies:
+ '@polkadot/util': 13.5.3
+ '@substrate/ss58-registry': 1.51.0
+ tslib: 2.8.1
+
'@polkadot/react-identicon@3.15.1(@polkadot/keyring@13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3))(@polkadot/networks@13.5.3)(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1)':
dependencies:
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
@@ -7482,8 +7582,8 @@ snapshots:
'@polkadot/rpc-augment@15.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@polkadot/rpc-core': 15.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
tslib: 2.8.1
transitivePeerDependencies:
@@ -7494,8 +7594,32 @@ snapshots:
'@polkadot/rpc-augment@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@polkadot/rpc-core': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/util': 13.5.3
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@polkadot/rpc-augment@16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/rpc-core': 16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/util': 13.5.3
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@polkadot/rpc-augment@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/rpc-core': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
tslib: 2.8.1
transitivePeerDependencies:
@@ -7506,8 +7630,8 @@ snapshots:
'@polkadot/rpc-core@15.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@polkadot/rpc-augment': 15.10.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
'@polkadot/util': 13.5.3
rxjs: 7.8.2
tslib: 2.8.1
@@ -7519,8 +7643,34 @@ snapshots:
'@polkadot/rpc-core@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@polkadot/rpc-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/util': 13.5.3
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@polkadot/rpc-core@16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/rpc-augment': 16.4.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/util': 13.5.3
+ rxjs: 7.8.2
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
+ '@polkadot/rpc-core@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/rpc-augment': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
'@polkadot/util': 13.5.3
rxjs: 7.8.2
tslib: 2.8.1
@@ -7529,16 +7679,16 @@ snapshots:
- supports-color
- utf-8-validate
- '@polkadot/rpc-provider@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ '@polkadot/rpc-provider@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/types': 16.3.1
- '@polkadot/types-support': 16.3.1
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-support': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
- '@polkadot/x-fetch': 13.5.3
- '@polkadot/x-global': 13.5.3
- '@polkadot/x-ws': 13.5.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/x-fetch': 13.5.4
+ '@polkadot/x-global': 13.5.4
+ '@polkadot/x-ws': 13.5.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
eventemitter3: 5.0.1
mock-socket: 9.3.1
nock: 13.5.6
@@ -7550,21 +7700,21 @@ snapshots:
- supports-color
- utf-8-validate
- '@polkadot/typegen@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
- dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/api-derive': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-augment': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/rpc-provider': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
- '@polkadot/types-augment': 16.3.1
- '@polkadot/types-codec': 16.3.1
- '@polkadot/types-create': 16.3.1
- '@polkadot/types-support': 16.3.1
+ '@polkadot/typegen@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-augment': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api-derive': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-augment': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/rpc-provider': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-augment': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/types-create': 16.4.3
+ '@polkadot/types-support': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
- '@polkadot/x-ws': 13.5.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/x-ws': 13.5.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)
comment-parser: 1.4.1
handlebars: 4.7.8
tslib: 2.8.1
@@ -7576,43 +7726,65 @@ snapshots:
'@polkadot/types-augment@16.3.1':
dependencies:
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
tslib: 2.8.1
- '@polkadot/types-codec@16.3.1':
+ '@polkadot/types-augment@16.4.3':
dependencies:
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/util': 13.5.3
+ tslib: 2.8.1
+
+ '@polkadot/types-codec@16.4.3':
+ dependencies:
+ '@polkadot/util': 13.5.3
+ '@polkadot/x-bigint': 13.5.4
+ tslib: 2.8.1
+
+ '@polkadot/types-create@16.4.2':
+ dependencies:
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
- '@polkadot/x-bigint': 13.5.3
tslib: 2.8.1
- '@polkadot/types-create@16.3.1':
+ '@polkadot/types-create@16.4.3':
dependencies:
- '@polkadot/types-codec': 16.3.1
+ '@polkadot/types-codec': 16.4.3
'@polkadot/util': 13.5.3
tslib: 2.8.1
- '@polkadot/types-known@16.3.1':
+ '@polkadot/types-known@16.4.2':
dependencies:
'@polkadot/networks': 13.5.3
- '@polkadot/types': 16.3.1
- '@polkadot/types-codec': 16.3.1
- '@polkadot/types-create': 16.3.1
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/types-create': 16.4.2
+ '@polkadot/util': 13.5.3
+ tslib: 2.8.1
+
+ '@polkadot/types-known@16.4.3':
+ dependencies:
+ '@polkadot/networks': 13.5.4
+ '@polkadot/types': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/types-create': 16.4.3
'@polkadot/util': 13.5.3
tslib: 2.8.1
- '@polkadot/types-support@16.3.1':
+ '@polkadot/types-support@16.4.3':
dependencies:
'@polkadot/util': 13.5.3
tslib: 2.8.1
- '@polkadot/types@16.3.1':
+ '@polkadot/types@16.4.3':
dependencies:
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/types-augment': 16.3.1
- '@polkadot/types-codec': 16.3.1
- '@polkadot/types-create': 16.3.1
+ '@polkadot/types-augment': 16.4.3
+ '@polkadot/types-codec': 16.4.3
+ '@polkadot/types-create': 16.4.3
'@polkadot/util': 13.5.3
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
rxjs: 7.8.2
@@ -7705,16 +7877,31 @@ snapshots:
'@polkadot/x-global': 13.5.3
tslib: 2.8.1
+ '@polkadot/x-bigint@13.5.4':
+ dependencies:
+ '@polkadot/x-global': 13.5.4
+ tslib: 2.8.1
+
'@polkadot/x-fetch@13.5.3':
dependencies:
'@polkadot/x-global': 13.5.3
node-fetch: 3.3.2
tslib: 2.8.1
+ '@polkadot/x-fetch@13.5.4':
+ dependencies:
+ '@polkadot/x-global': 13.5.4
+ node-fetch: 3.3.2
+ tslib: 2.8.1
+
'@polkadot/x-global@13.5.3':
dependencies:
tslib: 2.8.1
+ '@polkadot/x-global@13.5.4':
+ dependencies:
+ tslib: 2.8.1
+
'@polkadot/x-randomvalues@13.5.3(@polkadot/util@13.5.3)(@polkadot/wasm-util@7.4.1(@polkadot/util@13.5.3))':
dependencies:
'@polkadot/util': 13.5.3
@@ -7741,6 +7928,15 @@ snapshots:
- bufferutil
- utf-8-validate
+ '@polkadot/x-ws@13.5.4(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@polkadot/x-global': 13.5.4
+ tslib: 2.8.1
+ ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
'@polymeshassociation/polymesh-types@5.7.0': {}
'@protobufjs/aspromise@1.1.2': {}
@@ -7848,7 +8044,7 @@ snapshots:
'@scure/bip32@1.7.0':
dependencies:
- '@noble/curves': 1.9.2
+ '@noble/curves': 1.9.6
'@noble/hashes': 1.8.0
'@scure/base': 1.2.6
@@ -7875,9 +8071,9 @@ snapshots:
'@snowfork/snowbridge-types@0.2.7(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
transitivePeerDependencies:
- '@polkadot/util'
- '@polkadot/util-crypto'
@@ -7893,7 +8089,7 @@ snapshots:
'@subsocial/definitions@0.8.14(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
lodash.camelcase: 4.3.0
transitivePeerDependencies:
- bufferutil
@@ -7933,7 +8129,7 @@ snapshots:
'@substrate/txwrapper-core@7.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)(bufferutil@4.0.9)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
memoizee: 0.4.17
transitivePeerDependencies:
@@ -8063,25 +8259,25 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
- '@unique-nft/opal-testnet-types@1003.70.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)':
+ '@unique-nft/opal-testnet-types@1003.70.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
- '@unique-nft/quartz-mainnet-types@1003.70.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)':
+ '@unique-nft/quartz-mainnet-types@1003.70.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
- '@unique-nft/sapphire-mainnet-types@1003.70.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)':
+ '@unique-nft/sapphire-mainnet-types@1003.70.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
- '@unique-nft/unique-mainnet-types@1001.63.0(@polkadot/api@16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.3.1)':
+ '@unique-nft/unique-mainnet-types@1001.63.0(@polkadot/api@16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(@polkadot/types@16.4.3)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- '@polkadot/types': 16.3.1
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/types': 16.4.3
'@vitest/expect@3.1.3':
dependencies:
@@ -8090,6 +8286,14 @@ snapshots:
chai: 5.2.0
tinyrainbow: 2.0.0
+ '@vitest/mocker@3.1.3(vite@6.3.5(@types/node@22.16.0)(tsx@4.20.3)(yaml@2.8.0))':
+ dependencies:
+ '@vitest/spy': 3.1.3
+ estree-walker: 3.0.3
+ magic-string: 0.30.17
+ optionalDependencies:
+ vite: 6.3.5(@types/node@22.16.0)(tsx@4.20.3)(yaml@2.8.0)
+
'@vitest/mocker@3.1.3(vite@6.3.5(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0))':
dependencies:
'@vitest/spy': 3.1.3
@@ -8144,7 +8348,7 @@ snapshots:
'@zombienet/orchestrator@0.0.105(@polkadot/util@13.5.3)(@types/node@24.0.10)(bufferutil@4.0.9)(chokidar@3.6.0)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
'@zombienet/utils': 0.0.28(@types/node@24.0.10)(chokidar@3.6.0)(typescript@5.8.3)
@@ -8176,7 +8380,7 @@ snapshots:
'@zombienet/orchestrator@0.0.110(@polkadot/util@13.5.3)(@types/node@24.0.10)(bufferutil@4.0.9)(chokidar@3.6.0)(utf-8-validate@5.0.10)':
dependencies:
- '@polkadot/api': 16.3.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ '@polkadot/api': 16.4.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
'@polkadot/util-crypto': 13.5.3(@polkadot/util@13.5.3)
'@zombienet/utils': 0.0.28(@types/node@24.0.10)(chokidar@3.6.0)(typescript@5.8.3)
@@ -9280,7 +9484,7 @@ snapshots:
ethereum-cryptography: 0.1.3
rlp: 2.2.7
- ethers@6.14.4(bufferutil@4.0.9)(utf-8-validate@5.0.10):
+ ethers@6.15.0(bufferutil@4.0.9)(utf-8-validate@5.0.10):
dependencies:
'@adraffy/ens-normalize': 1.10.1
'@noble/curves': 1.2.0
@@ -10027,9 +10231,9 @@ snapshots:
dependencies:
ws: 8.18.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)
- isows@1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)):
+ isows@1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)):
dependencies:
- ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
isstream@0.1.2: {}
@@ -10743,8 +10947,8 @@ snapshots:
ox@0.6.9(typescript@5.8.3)(zod@3.25.67):
dependencies:
'@adraffy/ens-normalize': 1.11.0
- '@noble/curves': 1.8.2
- '@noble/hashes': 1.7.2
+ '@noble/curves': 1.9.2
+ '@noble/hashes': 1.8.0
'@scure/bip32': 1.6.2
'@scure/bip39': 1.5.4
abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67)
@@ -10754,11 +10958,11 @@ snapshots:
transitivePeerDependencies:
- zod
- ox@0.8.1(typescript@5.8.3)(zod@3.25.67):
+ ox@0.8.7(typescript@5.8.3)(zod@3.25.67):
dependencies:
'@adraffy/ens-normalize': 1.11.0
'@noble/ciphers': 1.3.0
- '@noble/curves': 1.9.2
+ '@noble/curves': 1.9.6
'@noble/hashes': 1.8.0
'@scure/bip32': 1.7.0
'@scure/bip39': 1.6.0
@@ -10945,7 +11149,7 @@ snapshots:
pontem-types-bundle@1.0.15(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3):
dependencies:
'@polkadot/keyring': 13.5.3(@polkadot/util-crypto@13.5.3(@polkadot/util@13.5.3))(@polkadot/util@13.5.3)
- '@polkadot/types': 16.3.1
+ '@polkadot/types': 16.4.3
typescript: 4.9.5
transitivePeerDependencies:
- '@polkadot/util'
@@ -12084,16 +12288,16 @@ snapshots:
- utf-8-validate
- zod
- viem@2.31.6(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67):
+ viem@2.34.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.67):
dependencies:
- '@noble/curves': 1.9.2
+ '@noble/curves': 1.9.6
'@noble/hashes': 1.8.0
'@scure/bip32': 1.7.0
'@scure/bip39': 1.6.0
abitype: 1.0.8(typescript@5.8.3)(zod@3.25.67)
- isows: 1.0.7(ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10))
- ox: 0.8.1(typescript@5.8.3)(zod@3.25.67)
- ws: 8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10)
+ isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))
+ ox: 0.8.7(typescript@5.8.3)(zod@3.25.67)
+ ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)
optionalDependencies:
typescript: 5.8.3
transitivePeerDependencies:
@@ -12171,10 +12375,10 @@ snapshots:
tsx: 4.20.3
yaml: 2.8.0
- vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.16.0)(@vitest/ui@3.1.3)(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(tsx@4.20.3)(yaml@2.8.0):
+ vitest@3.1.3(@types/debug@4.1.12)(@types/node@22.16.0)(@vitest/ui@3.1.3(vitest@3.1.3))(jsdom@23.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(tsx@4.20.3)(yaml@2.8.0):
dependencies:
'@vitest/expect': 3.1.3
- '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@24.0.10)(tsx@4.20.3)(yaml@2.8.0))
+ '@vitest/mocker': 3.1.3(vite@6.3.5(@types/node@22.16.0)(tsx@4.20.3)(yaml@2.8.0))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.1.3
'@vitest/snapshot': 3.1.3
@@ -12833,11 +13037,6 @@ snapshots:
bufferutil: 4.0.9
utf-8-validate: 5.0.10
- ws@8.18.2(bufferutil@4.0.9)(utf-8-validate@5.0.10):
- optionalDependencies:
- bufferutil: 4.0.9
- utf-8-validate: 5.0.10
-
ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10):
optionalDependencies:
bufferutil: 4.0.9
diff --git a/precompiles/author-mapping/src/tests.rs b/precompiles/author-mapping/src/tests.rs
index 0278f776229..08532186043 100644
--- a/precompiles/author-mapping/src/tests.rs
+++ b/precompiles/author-mapping/src/tests.rs
@@ -43,6 +43,7 @@ fn evm_call(input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/precompiles/balances-erc20/src/tests.rs b/precompiles/balances-erc20/src/tests.rs
index 671abefbdfc..5fbd6c120f6 100644
--- a/precompiles/balances-erc20/src/tests.rs
+++ b/precompiles/balances-erc20/src/tests.rs
@@ -576,6 +576,7 @@ fn deposit(data: Vec) {
None, // max priority
None, // nonce
vec![], // access list
+ vec![], // authorization list
)
.expect("it works");
@@ -692,6 +693,7 @@ fn deposit_zero() {
None, // max priority
None, // nonce
vec![], // access list
+ vec![], // authorization list
)
.expect("it works");
diff --git a/precompiles/batch/src/tests.rs b/precompiles/batch/src/tests.rs
index 9147f6b8159..e8ffea5ff69 100644
--- a/precompiles/batch/src/tests.rs
+++ b/precompiles/batch/src/tests.rs
@@ -45,6 +45,7 @@ fn evm_call(from: impl Into, input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/precompiles/conviction-voting/src/tests.rs b/precompiles/conviction-voting/src/tests.rs
index 6fb00508e7a..d94d8c77e4a 100644
--- a/precompiles/conviction-voting/src/tests.rs
+++ b/precompiles/conviction-voting/src/tests.rs
@@ -45,6 +45,7 @@ fn evm_call(input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/precompiles/crowdloan-rewards/src/tests.rs b/precompiles/crowdloan-rewards/src/tests.rs
index 20368310f61..ec742d1a9a6 100644
--- a/precompiles/crowdloan-rewards/src/tests.rs
+++ b/precompiles/crowdloan-rewards/src/tests.rs
@@ -41,6 +41,7 @@ fn evm_call(input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/precompiles/identity/src/tests.rs b/precompiles/identity/src/tests.rs
index 590c3aab70a..e09426f9383 100644
--- a/precompiles/identity/src/tests.rs
+++ b/precompiles/identity/src/tests.rs
@@ -49,6 +49,7 @@ fn evm_call(source: impl Into, input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/precompiles/parachain-staking/src/tests.rs b/precompiles/parachain-staking/src/tests.rs
index 242fe9042ef..bf1cc398c6a 100644
--- a/precompiles/parachain-staking/src/tests.rs
+++ b/precompiles/parachain-staking/src/tests.rs
@@ -42,6 +42,7 @@ fn evm_call(source: impl Into, input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/precompiles/preimage/src/tests.rs b/precompiles/preimage/src/tests.rs
index f3b2f04d5f8..aaf147d60e2 100644
--- a/precompiles/preimage/src/tests.rs
+++ b/precompiles/preimage/src/tests.rs
@@ -34,6 +34,7 @@ fn evm_call(input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/precompiles/proxy/src/tests.rs b/precompiles/proxy/src/tests.rs
index 760bdbcba03..4b1b383e1a1 100644
--- a/precompiles/proxy/src/tests.rs
+++ b/precompiles/proxy/src/tests.rs
@@ -551,6 +551,7 @@ fn test_nested_evm_bypass_proxy_should_allow_elevating_proxy_type() {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
});
// call the evm call in a proxy call
diff --git a/precompiles/referenda/src/tests.rs b/precompiles/referenda/src/tests.rs
index ef2f08c4932..563f69c85ed 100644
--- a/precompiles/referenda/src/tests.rs
+++ b/precompiles/referenda/src/tests.rs
@@ -42,6 +42,7 @@ fn evm_call(input: Vec) -> EvmCall {
max_priority_fee_per_gas: Some(U256::zero()),
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
}
}
diff --git a/primitives/rpc/debug/Cargo.toml b/primitives/rpc/debug/Cargo.toml
index fde7d7304c4..932c9a261f4 100644
--- a/primitives/rpc/debug/Cargo.toml
+++ b/primitives/rpc/debug/Cargo.toml
@@ -18,13 +18,13 @@ sp-runtime = { workspace = true }
sp-std = { workspace = true }
[features]
-default = [ "std" ]
+default = ["std"]
std = [
- "ethereum-types/std",
- "ethereum/std",
- "parity-scale-codec/std",
- "sp-api/std",
- "sp-runtime/std",
- "sp-std/std",
+ "ethereum-types/std",
+ "ethereum/std",
+ "parity-scale-codec/std",
+ "sp-api/std",
+ "sp-runtime/std",
+ "sp-std/std",
]
-runtime-3000 = []
+runtime-3900 = []
diff --git a/primitives/rpc/debug/src/lib.rs b/primitives/rpc/debug/src/lib.rs
index c6613b2c238..5073ad16d16 100644
--- a/primitives/rpc/debug/src/lib.rs
+++ b/primitives/rpc/debug/src/lib.rs
@@ -16,7 +16,7 @@
#![cfg_attr(not(feature = "std"), no_std)]
-use ethereum::{TransactionV0 as LegacyTransaction, TransactionV2 as Transaction};
+use ethereum::{AuthorizationList, LegacyTransaction, TransactionV2, TransactionV3};
use ethereum_types::{H160, H256, U256};
use parity_scale_codec::{Decode, Encode};
use sp_std::vec::Vec;
@@ -30,23 +30,30 @@ sp_api::decl_runtime_apis! {
// In order to be able to use ApiExt as part of the RPC handler logic we need to be always
// above the version that exists on chain for this Api, even if this Api is only meant
// to be used overridden.
- #[api_version(6)]
+ #[api_version(7)]
pub trait DebugRuntimeApi {
+ #[changed_in(4)]
+ fn trace_transaction(
+ extrinsics: Vec,
+ transaction: &LegacyTransaction,
+ ) -> Result<(), sp_runtime::DispatchError>;
+
#[changed_in(5)]
fn trace_transaction(
extrinsics: Vec,
- transaction: &Transaction,
+ transaction: &TransactionV2,
) -> Result<(), sp_runtime::DispatchError>;
- #[changed_in(4)]
+ #[changed_in(7)]
fn trace_transaction(
extrinsics: Vec,
- transaction: &LegacyTransaction,
+ transaction: &TransactionV2,
+ header: &Block::Header,
) -> Result<(), sp_runtime::DispatchError>;
fn trace_transaction(
extrinsics: Vec,
- transaction: &Transaction,
+ transaction: &TransactionV3,
header: &Block::Header,
) -> Result<(), sp_runtime::DispatchError>;
@@ -73,6 +80,7 @@ sp_api::decl_runtime_apis! {
max_priority_fee_per_gas: Option,
nonce: Option,
access_list: Option)>>,
+ authorization_list: Option,
) -> Result<(), sp_runtime::DispatchError>;
}
}
diff --git a/primitives/rpc/txpool/src/lib.rs b/primitives/rpc/txpool/src/lib.rs
index edf937a6755..3ecd29b0184 100644
--- a/primitives/rpc/txpool/src/lib.rs
+++ b/primitives/rpc/txpool/src/lib.rs
@@ -19,7 +19,7 @@
#![allow(clippy::unnecessary_mut_passed)]
#![allow(clippy::too_many_arguments)]
-pub use ethereum::{TransactionV0 as LegacyTransaction, TransactionV2 as Transaction};
+pub use ethereum::{TransactionV0 as LegacyTransaction, TransactionV3 as Transaction};
use parity_scale_codec::{Decode, Encode};
use sp_runtime::scale_info::TypeInfo;
use sp_runtime::traits::Block as BlockT;
diff --git a/primitives/xcm/src/ethereum_xcm.rs b/primitives/xcm/src/ethereum_xcm.rs
index 72683f8edb4..27dfafece7f 100644
--- a/primitives/xcm/src/ethereum_xcm.rs
+++ b/primitives/xcm/src/ethereum_xcm.rs
@@ -15,8 +15,8 @@
// along with Moonbeam. If not, see .
use ethereum::{
- AccessList, AccessListItem, EIP1559Transaction, EIP2930Transaction, LegacyTransaction,
- TransactionAction, TransactionSignature, TransactionV2,
+ AccessList, AccessListItem, AuthorizationList, EIP1559Transaction, EIP2930Transaction,
+ LegacyTransaction, TransactionAction, TransactionV3,
};
use ethereum_types::{H160, H256, U256};
use frame_support::{traits::ConstU32, BoundedVec};
@@ -66,6 +66,7 @@ pub enum EthereumXcmFee {
pub enum EthereumXcmTransaction {
V1(EthereumXcmTransactionV1),
V2(EthereumXcmTransactionV2),
+ V3(EthereumXcmTransactionV3),
}
/// Value for `r` and `s` for the invalid signature included in Xcm transact's Ethereum transaction.
@@ -103,35 +104,54 @@ pub struct EthereumXcmTransactionV2 {
pub access_list: Option)>>,
}
+#[derive(Clone, Debug, Eq, PartialEq, Encode, Decode, TypeInfo)]
+pub struct EthereumXcmTransactionV3 {
+ /// Gas limit to be consumed by EVM execution.
+ pub gas_limit: U256,
+ /// Either a Call (the callee, account or contract address) or Create).
+ pub action: TransactionAction,
+ /// Value to be transfered.
+ pub value: U256,
+ /// Input data for a contract call. Max. size 65_536 bytes.
+ pub input: BoundedVec>,
+ /// Map of addresses to be pre-paid to warm storage.
+ pub access_list: Option)>>,
+ /// Authorization list as defined in EIP-7702.
+ pub authorization_list: Option,
+}
+
pub trait XcmToEthereum {
- fn into_transaction_v2(
+ fn into_transaction(
&self,
nonce: U256,
chain_id: u64,
allow_create: bool,
- ) -> Option;
+ ) -> Option;
}
impl XcmToEthereum for EthereumXcmTransaction {
- fn into_transaction_v2(
+ fn into_transaction(
&self,
nonce: U256,
chain_id: u64,
allow_create: bool,
- ) -> Option {
+ ) -> Option {
match self {
EthereumXcmTransaction::V1(v1_tx) => {
- v1_tx.into_transaction_v2(nonce, chain_id, allow_create)
+ v1_tx.into_transaction(nonce, chain_id, allow_create)
}
EthereumXcmTransaction::V2(v2_tx) => {
- v2_tx.into_transaction_v2(nonce, chain_id, allow_create)
+ v2_tx.into_transaction(nonce, chain_id, allow_create)
+ }
+ EthereumXcmTransaction::V3(v3_tx) => {
+ v3_tx.into_transaction(nonce, chain_id, allow_create)
}
}
}
}
impl XcmToEthereum for EthereumXcmTransactionV1 {
- fn into_transaction_v2(&self, nonce: U256, chain_id: u64, _: bool) -> Option {
+ fn into_transaction(&self, nonce: U256, chain_id: u64, _: bool) -> Option {
// We dont support creates for now
if self.action == TransactionAction::Create {
return None;
@@ -151,12 +171,13 @@ impl XcmToEthereum for EthereumXcmTransactionV1 {
}
EthereumXcmFee::Auto => (None, Some(U256::zero())),
};
+
match (gas_price, max_fee) {
(Some(gas_price), None) => {
// Legacy or Eip-2930
if let Some(ref access_list) = self.access_list {
// Eip-2930
- Some(TransactionV2::EIP2930(EIP2930Transaction {
+ Some(TransactionV3::EIP2930(EIP2930Transaction {
chain_id,
nonce,
gas_price,
@@ -165,26 +186,32 @@ impl XcmToEthereum for EthereumXcmTransactionV1 {
value: self.value,
input: self.input.to_vec(),
access_list: from_tuple_to_access_list(access_list),
- odd_y_parity: true,
- r: rs_id(),
- s: rs_id(),
+ signature: ethereum::eip2930::TransactionSignature::new(
+ true,
+ rs_id(),
+ rs_id(),
+ )?,
}))
} else {
// Legacy
- Some(TransactionV2::Legacy(LegacyTransaction {
+ Some(TransactionV3::Legacy(LegacyTransaction {
nonce,
gas_price,
gas_limit: self.gas_limit,
action: self.action,
value: self.value,
input: self.input.to_vec(),
- signature: TransactionSignature::new(42, rs_id(), rs_id())?,
+ signature: ethereum::legacy::TransactionSignature::new(
+ 42,
+ rs_id(),
+ rs_id(),
+ )?,
}))
}
}
(None, Some(max_fee)) => {
// Eip-1559
- Some(TransactionV2::EIP1559(EIP1559Transaction {
+ Some(TransactionV3::EIP1559(EIP1559Transaction {
chain_id,
nonce,
max_fee_per_gas: max_fee,
@@ -198,9 +225,11 @@ impl XcmToEthereum for EthereumXcmTransactionV1 {
} else {
Vec::new()
},
- odd_y_parity: true,
- r: rs_id(),
- s: rs_id(),
+ signature: ethereum::eip1559::TransactionSignature::new(
+ true,
+ rs_id(),
+ rs_id(),
+ )?,
}))
}
_ => None,
@@ -209,12 +238,12 @@ impl XcmToEthereum for EthereumXcmTransactionV1 {
}
impl XcmToEthereum for EthereumXcmTransactionV2 {
- fn into_transaction_v2(
+ fn into_transaction(
&self,
nonce: U256,
chain_id: u64,
allow_create: bool,
- ) -> Option {
+ ) -> Option {
if !allow_create && self.action == TransactionAction::Create {
// Create not allowed
return None;
@@ -227,8 +256,9 @@ impl XcmToEthereum for EthereumXcmTransactionV2 {
})
.collect::>()
};
+
// Eip-1559
- Some(TransactionV2::EIP1559(EIP1559Transaction {
+ Some(TransactionV3::EIP1559(EIP1559Transaction {
chain_id,
nonce,
max_fee_per_gas: U256::zero(),
@@ -242,9 +272,47 @@ impl XcmToEthereum for EthereumXcmTransactionV2 {
} else {
Vec::new()
},
- odd_y_parity: true,
- r: rs_id(),
- s: rs_id(),
+ signature: ethereum::eip1559::TransactionSignature::new(true, rs_id(), rs_id())?,
+ }))
+ }
+}
+
+impl XcmToEthereum for EthereumXcmTransactionV3 {
+ fn into_transaction(
+ &self,
+ nonce: U256,
+ chain_id: u64,
+ allow_create: bool,
+ ) -> Option {
+ if !allow_create && self.action == TransactionAction::Create {
+ // Create not allowed
+ return None;
+ }
+ let from_tuple_to_access_list = |t: &Vec<(H160, Vec)>| -> AccessList {
+ t.iter()
+ .map(|item| AccessListItem {
+ address: item.0,
+ storage_keys: item.1.clone(),
+ })
+ .collect::>()
+ };
+
+ // EIP-1559
+ Some(TransactionV3::EIP1559(EIP1559Transaction {
+ chain_id,
+ nonce,
+ max_fee_per_gas: U256::zero(),
+ max_priority_fee_per_gas: U256::zero(),
+ gas_limit: self.gas_limit,
+ action: self.action,
+ value: self.value,
+ input: self.input.to_vec(),
+ access_list: if let Some(ref access_list) = self.access_list {
+ from_tuple_to_access_list(access_list)
+ } else {
+ Vec::new()
+ },
+ signature: ethereum::eip1559::TransactionSignature::new(true, rs_id(), rs_id())?,
}))
}
}
@@ -264,7 +332,8 @@ mod tests {
access_list: None,
};
let nonce = U256::zero();
- let expected_tx = Some(TransactionV2::EIP1559(EIP1559Transaction {
+
+ let expected_tx = Some(TransactionV3::EIP1559(EIP1559Transaction {
chain_id: 111,
nonce,
max_fee_per_gas: U256::zero(),
@@ -274,13 +343,16 @@ mod tests {
value: U256::zero(),
input: vec![1u8],
access_list: vec![],
- odd_y_parity: true,
- r: H256::from_low_u64_be(1u64),
- s: H256::from_low_u64_be(1u64),
+ signature: ethereum::eip1559::TransactionSignature::new(
+ true,
+ H256::from_low_u64_be(1u64),
+ H256::from_low_u64_be(1u64),
+ )
+ .unwrap(),
}));
assert_eq!(
- xcm_transaction.into_transaction_v2(nonce, 111, false),
+ xcm_transaction.into_transaction(nonce, 111, false),
expected_tx
);
}
@@ -300,18 +372,18 @@ mod tests {
access_list: None,
};
let nonce = U256::zero();
- let expected_tx = Some(TransactionV2::Legacy(LegacyTransaction {
+ let expected_tx = Some(TransactionV3::Legacy(LegacyTransaction {
nonce,
gas_price: U256::zero(),
gas_limit: U256::one(),
action: TransactionAction::Call(H160::default()),
value: U256::zero(),
input: vec![1u8],
- signature: TransactionSignature::new(42, rs_id(), rs_id()).unwrap(),
+ signature: ethereum::legacy::TransactionSignature::new(42, rs_id(), rs_id()).unwrap(),
}));
assert_eq!(
- xcm_transaction.into_transaction_v2(nonce, 111, false),
+ xcm_transaction.into_transaction(nonce, 111, false),
expected_tx
);
}
@@ -341,7 +413,7 @@ mod tests {
};
let nonce = U256::zero();
- let expected_tx = Some(TransactionV2::EIP2930(EIP2930Transaction {
+ let expected_tx = Some(TransactionV3::EIP2930(EIP2930Transaction {
chain_id: 111,
nonce,
gas_price: U256::zero(),
@@ -350,13 +422,16 @@ mod tests {
value: U256::zero(),
input: vec![1u8],
access_list: from_tuple_to_access_list(&access_list.unwrap()),
- odd_y_parity: true,
- r: H256::from_low_u64_be(1u64),
- s: H256::from_low_u64_be(1u64),
+ signature: ethereum::eip2930::TransactionSignature::new(
+ true,
+ H256::from_low_u64_be(1u64),
+ H256::from_low_u64_be(1u64),
+ )
+ .unwrap(),
}));
assert_eq!(
- xcm_transaction.into_transaction_v2(nonce, 111, false),
+ xcm_transaction.into_transaction(nonce, 111, false),
expected_tx
);
}
@@ -372,7 +447,7 @@ mod tests {
access_list: None,
};
let nonce = U256::zero();
- let expected_tx = Some(TransactionV2::EIP1559(EIP1559Transaction {
+ let expected_tx = Some(TransactionV3::EIP1559(EIP1559Transaction {
chain_id: 111,
nonce,
max_fee_per_gas: U256::zero(),
@@ -382,13 +457,16 @@ mod tests {
value: U256::zero(),
input: vec![1u8],
access_list: vec![],
- odd_y_parity: true,
- r: H256::from_low_u64_be(1u64),
- s: H256::from_low_u64_be(1u64),
+ signature: ethereum::eip1559::TransactionSignature::new(
+ true,
+ H256::from_low_u64_be(1u64),
+ H256::from_low_u64_be(1u64),
+ )
+ .unwrap(),
}));
assert_eq!(
- xcm_transaction.into_transaction_v2(nonce, 111, false),
+ xcm_transaction.into_transaction(nonce, 111, false),
expected_tx
);
}
diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml
index 62c53b3ce96..ce855d1d02d 100644
--- a/runtime/common/Cargo.toml
+++ b/runtime/common/Cargo.toml
@@ -11,6 +11,7 @@ version = "0.8.0-dev"
log = "0.4"
# Moonbeam
+ethereum = { workspace = true }
moonbeam-core-primitives = { workspace = true }
pallet-migrations = { workspace = true }
pallet-moonbeam-foreign-assets = { workspace = true }
@@ -50,6 +51,7 @@ cumulus-primitives-core = { workspace = true, default-features = false }
[features]
std = [
"cumulus-pallet-parachain-system/std",
+ "ethereum/std",
"frame-support/std",
"moonbeam-core-primitives/std",
"pallet-author-inherent/std",
diff --git a/runtime/common/src/apis.rs b/runtime/common/src/apis.rs
index d986f677f9b..9ac609d9dc7 100644
--- a/runtime/common/src/apis.rs
+++ b/runtime/common/src/apis.rs
@@ -17,6 +17,7 @@
#[macro_export]
macro_rules! impl_runtime_apis_plus_common {
({$($custom:tt)*} {$($bench_custom:tt)*}) => {
+ use ethereum::AuthorizationList;
#[cfg(feature = "evm-tracing")]
// Helper function to replay the "on_idle" hook for all pallets, we need this for
@@ -325,6 +326,7 @@ macro_rules! impl_runtime_apis_plus_common {
max_priority_fee_per_gas: Option,
nonce: Option,
access_list: Option)>>,
+ authorization_list: Option,
) -> Result<(), sp_runtime::DispatchError> {
#[cfg(feature = "evm-tracing")]
{
@@ -349,6 +351,7 @@ macro_rules! impl_runtime_apis_plus_common {
value,
Some(::ChainId::get()),
access_list.clone().unwrap_or_default(),
+ authorization_list.clone().unwrap_or_default(),
);
let gas_limit = gas_limit.min(u64::MAX.into()).low_u64();
@@ -365,6 +368,7 @@ macro_rules! impl_runtime_apis_plus_common {
max_priority_fee_per_gas,
nonce,
access_list.unwrap_or_default(),
+ authorization_list.unwrap_or_default(),
is_transactional,
validate,
weight_limit,
@@ -444,6 +448,7 @@ macro_rules! impl_runtime_apis_plus_common {
nonce: Option,
estimate: bool,
access_list: Option)>>,
+ authorization_list: Option,
) -> Result {
let config = if estimate {
let mut config = ::config().clone();
@@ -466,6 +471,7 @@ macro_rules! impl_runtime_apis_plus_common {
value,
Some(::ChainId::get()),
access_list.clone().unwrap_or_default(),
+ authorization_list.clone().unwrap_or_default(),
);
let gas_limit = gas_limit.min(u64::MAX.into()).low_u64();
@@ -482,6 +488,7 @@ macro_rules! impl_runtime_apis_plus_common {
max_priority_fee_per_gas,
nonce,
access_list.unwrap_or_default(),
+ authorization_list.unwrap_or_default(),
is_transactional,
validate,
weight_limit,
@@ -500,6 +507,7 @@ macro_rules! impl_runtime_apis_plus_common {
nonce: Option,
estimate: bool,
access_list: Option)>>,
+ authorization_list: Option,
) -> Result {
let config = if estimate {
let mut config = ::config().clone();
@@ -522,6 +530,7 @@ macro_rules! impl_runtime_apis_plus_common {
value,
Some(::ChainId::get()),
access_list.clone().unwrap_or_default(),
+ authorization_list.clone().unwrap_or_default(),
);
let gas_limit = gas_limit.min(u64::MAX.into()).low_u64();
@@ -538,6 +547,7 @@ macro_rules! impl_runtime_apis_plus_common {
max_priority_fee_per_gas,
nonce,
access_list.unwrap_or_default(),
+ authorization_list.unwrap_or_default(),
is_transactional,
validate,
weight_limit,
diff --git a/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs b/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs
index c2b1d86eeb1..6ded4d4a809 100644
--- a/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs
+++ b/runtime/common/src/impl_moonbeam_xcm_call_tracing.rs
@@ -82,7 +82,7 @@ macro_rules! impl_moonbeam_xcm_call_tracing {
// Tracing a transaction, the one matching the trace request
// is done using environmental, the rest dispatched normally.
EthereumTracingStatus::Transaction(traced_transaction_hash) => {
- let transaction_hash = xcm_transaction.into_transaction_v2(
+ let transaction_hash = xcm_transaction.into_transaction(
EthereumXcm::nonce(),
::ChainId::get(),
false
diff --git a/runtime/common/src/impl_xcm_evm_runner.rs b/runtime/common/src/impl_xcm_evm_runner.rs
index 45004559c87..0cad507b762 100644
--- a/runtime/common/src/impl_xcm_evm_runner.rs
+++ b/runtime/common/src/impl_xcm_evm_runner.rs
@@ -17,6 +17,7 @@
#[macro_export]
macro_rules! impl_evm_runner_precompile_or_eth_xcm {
{} => {
+ use ethereum::AuthorizationList;
use fp_evm::{CallInfo, CallOrCreateInfo, Context, Transfer};
use frame_support::dispatch::CallableCallFor;
use pallet_evm::{Runner, RunnerError};
@@ -24,7 +25,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
use sp_core::U256;
use sp_runtime::DispatchError;
use sp_std::vec::Vec;
- use xcm_primitives::{EthereumXcmTransaction, EthereumXcmTransactionV2};
+ use xcm_primitives::{EthereumXcmTransaction, EthereumXcmTransactionV3};
pub struct EvmRunnerPrecompileOrEthXcm(
core::marker::PhantomData<(CallDispatcher, Runtime)>,
@@ -49,6 +50,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
_max_priority_fee_per_gas: Option,
_nonce: Option,
access_list: Vec<(H160, Vec)>,
+ authorization_list: AuthorizationList,
_is_transactional: bool,
_validate: bool,
_weight_limit: Option,
@@ -93,7 +95,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
weight_info: None,
})
} else {
- let xcm_transaction = EthereumXcmTransaction::V2(EthereumXcmTransactionV2 {
+ let xcm_transaction = EthereumXcmTransaction::V3(EthereumXcmTransactionV3 {
gas_limit: gas_limit.into(),
action: pallet_ethereum_xcm::TransactionAction::Call(target),
value,
@@ -102,6 +104,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
weight: Default::default(),
})?,
access_list: Some(access_list),
+ authorization_list: Some(authorization_list),
});
let mut execution_info: Option = None;
@@ -137,6 +140,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
_max_priority_fee_per_gas: Option,
_nonce: Option,
_access_list: Vec<(H160, Vec)>,
+ _authorization_list: AuthorizationList,
_is_transactional: bool,
_validate: bool,
_weight_limit: Option,
@@ -156,6 +160,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
_max_priority_fee_per_gas: Option,
_nonce: Option,
_access_list: Vec<(H160, Vec)>,
+ _authorization_list: AuthorizationList,
_is_transactional: bool,
_validate: bool,
_weight_limit: Option,
@@ -174,6 +179,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
max_priority_fee_per_gas: Option,
nonce: Option,
access_list: Vec<(H160, Vec)>,
+ authorization_list: AuthorizationList,
is_transactional: bool,
validate: bool,
weight_limit: Option,
@@ -181,7 +187,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
config: &fp_evm::Config,
force_address: H160,
) -> Result> {
- let xcm_transaction = EthereumXcmTransaction::V2(EthereumXcmTransactionV2 {
+ let xcm_transaction = EthereumXcmTransaction::V3(EthereumXcmTransactionV3 {
gas_limit: gas_limit.into(),
action: pallet_ethereum_xcm::TransactionAction::Create,
value,
@@ -190,6 +196,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
weight: Default::default(),
})?,
access_list: Some(access_list),
+ authorization_list: Some(authorization_list),
});
let mut execution_info: Option = None;
@@ -229,6 +236,7 @@ macro_rules! impl_evm_runner_precompile_or_eth_xcm {
_max_priority_fee_per_gas: Option,
_nonce: Option,
_access_list: Vec<(H160, Vec)>,
+ _authorization_list: Vec<(U256, H160, U256, Option)>,
_is_transactional: bool,
_weight_limit: Option,
_transaction_len: Option,
diff --git a/runtime/moonbase/Cargo.toml b/runtime/moonbase/Cargo.toml
index f74cbb43c79..71263b40a15 100644
--- a/runtime/moonbase/Cargo.toml
+++ b/runtime/moonbase/Cargo.toml
@@ -24,6 +24,7 @@ strum_macros = { workspace = true }
# Moonbeam
account = { workspace = true }
+ethereum = { workspace = true }
moonbeam-core-primitives = { workspace = true }
moonbeam-relay-encoder = { workspace = true }
moonbeam-runtime-common = { workspace = true }
@@ -226,6 +227,7 @@ std = [
"cumulus-primitives-timestamp/std",
"cumulus-primitives-utility/std",
"cumulus-primitives-storage-weight-reclaim/std",
+ "ethereum/std",
"evm-tracing-events/std",
"fp-evm/std",
"fp-rpc/std",
@@ -359,7 +361,7 @@ bridge-stagenet = [
"pallet-bridge-parachains",
"pallet-bridge-messages",
"pallet-xcm-bridge",
- "bridge-hub-common"
+ "bridge-hub-common",
]
bridge-betanet = [
"bridge-runtime-common",
@@ -373,7 +375,7 @@ bridge-betanet = [
"pallet-bridge-parachains",
"pallet-bridge-messages",
"pallet-xcm-bridge",
- "bridge-hub-common"
+ "bridge-hub-common",
]
# Must be enabled for tracing runtimes only
diff --git a/runtime/moonbase/tests/evm_tracing.rs b/runtime/moonbase/tests/evm_tracing.rs
index 7ff22951681..51164b1f994 100644
--- a/runtime/moonbase/tests/evm_tracing.rs
+++ b/runtime/moonbase/tests/evm_tracing.rs
@@ -137,6 +137,7 @@ mod tests {
Some(U256::one()),
None,
None,
+ None,
)
.is_ok());
});
diff --git a/runtime/moonbase/tests/integration_test.rs b/runtime/moonbase/tests/integration_test.rs
index fb4a0636743..b969e3b5072 100644
--- a/runtime/moonbase/tests/integration_test.rs
+++ b/runtime/moonbase/tests/integration_test.rs
@@ -575,6 +575,7 @@ fn transfer_through_evm_to_stake() {
max_priority_fee_per_gas: None,
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
assert_eq!(
@@ -1001,6 +1002,7 @@ fn claim_via_precompile() {
max_priority_fee_per_gas: None,
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1241,6 +1243,7 @@ fn update_reward_address_via_precompile() {
max_priority_fee_per_gas: None,
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1939,6 +1942,7 @@ fn transfer_ed_0_evm() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
// 1 WEI is left in the account
@@ -1969,6 +1973,7 @@ fn refund_ed_0_evm() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
// ALICE is refunded
@@ -2007,6 +2012,7 @@ fn author_does_receive_priority_fee() {
max_priority_fee_per_gas: Some(U256::from(200 * GIGAWEI)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -2046,6 +2052,7 @@ fn total_issuance_after_evm_transaction_with_priority_fee() {
max_priority_fee_per_gas: Some(U256::from(BASE_FEE_GENISIS)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -2095,6 +2102,7 @@ fn total_issuance_after_evm_transaction_without_priority_fee() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -2972,6 +2980,7 @@ fn evm_revert_substrate_events() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -3011,6 +3020,7 @@ fn evm_success_keeps_substrate_events() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -3045,6 +3055,7 @@ fn validate_transaction_fails_on_filtered_call() {
max_priority_fee_per_gas: Default::default(),
nonce: Default::default(),
access_list: Default::default(),
+ authorization_list: Default::default(),
}
.into(),
);
diff --git a/runtime/moonbase/tests/runtime_apis.rs b/runtime/moonbase/tests/runtime_apis.rs
index d27294dc16d..cbe6c9e494d 100644
--- a/runtime/moonbase/tests/runtime_apis.rs
+++ b/runtime/moonbase/tests/runtime_apis.rs
@@ -166,6 +166,7 @@ fn ethereum_runtime_rpc_api_call() {
None, // nonce
false, // estimate
None, // access_list
+ None, // authorization_list
);
assert!(execution_result.is_ok());
});
@@ -187,6 +188,7 @@ fn ethereum_runtime_rpc_api_create() {
None, // nonce
false, // estimate
None, // access_list
+ None, // authorization_list
);
assert!(execution_result.is_ok());
});
diff --git a/runtime/moonbeam/Cargo.toml b/runtime/moonbeam/Cargo.toml
index a4d2e9f05fb..ba822db11d6 100644
--- a/runtime/moonbeam/Cargo.toml
+++ b/runtime/moonbeam/Cargo.toml
@@ -24,6 +24,7 @@ strum_macros = { workspace = true }
# Moonbeam
account = { workspace = true }
+ethereum = { workspace = true }
moonbeam-core-primitives = { workspace = true }
moonbeam-runtime-common = { workspace = true }
session-keys-primitives = { workspace = true }
@@ -195,7 +196,6 @@ frame-system-benchmarking = { workspace = true, optional = true }
frame-try-runtime = { workspace = true, optional = true }
[dev-dependencies]
-ethereum = { workspace = true }
frame-metadata = { workspace = true }
hex = { workspace = true, features = ["std"] }
sha3 = { workspace = true, features = ["std"] }
@@ -224,6 +224,7 @@ std = [
"cumulus-primitives-timestamp/std",
"cumulus-primitives-utility/std",
"cumulus-primitives-storage-weight-reclaim/std",
+ "ethereum/std",
"evm-tracing-events/std",
"fp-evm/std",
"fp-rpc/std",
diff --git a/runtime/moonbeam/tests/evm_tracing.rs b/runtime/moonbeam/tests/evm_tracing.rs
index e2a6842d11f..769ca9387d2 100644
--- a/runtime/moonbeam/tests/evm_tracing.rs
+++ b/runtime/moonbeam/tests/evm_tracing.rs
@@ -137,6 +137,7 @@ mod tests {
Some(U256::one()),
None,
None,
+ None,
)
.is_ok());
});
diff --git a/runtime/moonbeam/tests/integration_test.rs b/runtime/moonbeam/tests/integration_test.rs
index 26ae11ffc77..1c1a7bdfffe 100644
--- a/runtime/moonbeam/tests/integration_test.rs
+++ b/runtime/moonbeam/tests/integration_test.rs
@@ -616,6 +616,7 @@ fn transfer_through_evm_to_stake() {
max_priority_fee_per_gas: None,
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
assert_eq!(
@@ -1051,6 +1052,7 @@ fn claim_via_precompile() {
max_priority_fee_per_gas: None,
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1294,6 +1296,7 @@ fn update_reward_address_via_precompile() {
max_priority_fee_per_gas: None,
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1477,6 +1480,7 @@ fn transfer_ed_0_evm() {
max_priority_fee_per_gas: Some(BASE_FEE_GENESIS.into()),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
// 1 WEI is left in the account
@@ -1508,6 +1512,7 @@ fn refund_ed_0_evm() {
max_priority_fee_per_gas: Some(BASE_FEE_GENESIS.into()),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
// ALICE is refunded
@@ -1546,6 +1551,7 @@ fn author_does_receive_priority_fee() {
max_priority_fee_per_gas: Some(U256::from(200 * GIGAWEI)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1585,6 +1591,7 @@ fn total_issuance_after_evm_transaction_with_priority_fee() {
max_priority_fee_per_gas: Some(U256::from(100 * GIGAWEI)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1635,6 +1642,7 @@ fn total_issuance_after_evm_transaction_without_priority_fee() {
max_priority_fee_per_gas: Some(BASE_FEE_GENESIS.into()),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -2817,6 +2825,7 @@ fn evm_revert_substrate_events() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -2856,6 +2865,7 @@ fn evm_success_keeps_substrate_events() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
diff --git a/runtime/moonbeam/tests/runtime_apis.rs b/runtime/moonbeam/tests/runtime_apis.rs
index 0cca404870d..c360f1ed50d 100644
--- a/runtime/moonbeam/tests/runtime_apis.rs
+++ b/runtime/moonbeam/tests/runtime_apis.rs
@@ -167,6 +167,7 @@ fn ethereum_runtime_rpc_api_call() {
None, // nonce
false, // estimate
None, // access_list
+ None, // authorization_list
);
assert!(execution_result.is_ok());
});
@@ -188,6 +189,7 @@ fn ethereum_runtime_rpc_api_create() {
None, // nonce
false, // estimate
None, // access_list
+ None, // authorization_list
);
assert!(execution_result.is_ok());
});
diff --git a/runtime/moonriver/Cargo.toml b/runtime/moonriver/Cargo.toml
index 87f18949dc1..7389c2198d2 100644
--- a/runtime/moonriver/Cargo.toml
+++ b/runtime/moonriver/Cargo.toml
@@ -24,6 +24,7 @@ strum_macros = { workspace = true }
# Moonbeam
account = { workspace = true }
+ethereum = { workspace = true }
moonbeam-core-primitives = { workspace = true }
moonbeam-runtime-common = { workspace = true }
session-keys-primitives = { workspace = true }
@@ -196,7 +197,6 @@ frame-system-benchmarking = { workspace = true, optional = true }
frame-try-runtime = { workspace = true, optional = true }
[dev-dependencies]
-ethereum = { workspace = true }
frame-metadata = { workspace = true }
hex = { workspace = true, features = ["std"] }
sha3 = { workspace = true, features = ["std"] }
@@ -225,6 +225,7 @@ std = [
"cumulus-primitives-timestamp/std",
"cumulus-primitives-utility/std",
"cumulus-primitives-storage-weight-reclaim/std",
+ "ethereum/std",
"evm-tracing-events/std",
"fp-evm/std",
"fp-rpc/std",
diff --git a/runtime/moonriver/tests/evm_tracing.rs b/runtime/moonriver/tests/evm_tracing.rs
index 1a642a63938..6fcf8a03ddf 100644
--- a/runtime/moonriver/tests/evm_tracing.rs
+++ b/runtime/moonriver/tests/evm_tracing.rs
@@ -137,6 +137,7 @@ mod tests {
Some(U256::one()),
None,
None,
+ None,
)
.is_ok());
});
diff --git a/runtime/moonriver/tests/integration_test.rs b/runtime/moonriver/tests/integration_test.rs
index db693d67058..c001d1960cb 100644
--- a/runtime/moonriver/tests/integration_test.rs
+++ b/runtime/moonriver/tests/integration_test.rs
@@ -608,6 +608,7 @@ fn transfer_through_evm_to_stake() {
max_priority_fee_per_gas: None,
nonce: None,
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
assert_eq!(
@@ -1039,6 +1040,7 @@ fn claim_via_precompile() {
max_priority_fee_per_gas: None,
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1282,6 +1284,7 @@ fn update_reward_address_via_precompile() {
max_priority_fee_per_gas: None,
nonce: None, // Use the next nonce
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1463,6 +1466,7 @@ fn transfer_ed_0_evm() {
max_priority_fee_per_gas: Some(U256::from(BASE_FEE_GENESIS)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
// 1 WEI is left in the account
@@ -1494,6 +1498,7 @@ fn refund_ed_0_evm() {
max_priority_fee_per_gas: Some(U256::from(BASE_FEE_GENESIS)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
// ALICE is refunded
@@ -1532,6 +1537,7 @@ fn author_does_receive_priority_fee() {
max_priority_fee_per_gas: Some(U256::from(200 * GIGAWEI)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1571,6 +1577,7 @@ fn total_issuance_after_evm_transaction_with_priority_fee() {
max_priority_fee_per_gas: Some(U256::from(2u128 * BASE_FEE_GENESIS)),
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -1620,6 +1627,7 @@ fn total_issuance_after_evm_transaction_without_priority_fee() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -2722,6 +2730,7 @@ fn evm_revert_substrate_events() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
@@ -2761,6 +2770,7 @@ fn evm_success_keeps_substrate_events() {
max_priority_fee_per_gas: None,
nonce: Some(U256::from(0)),
access_list: Vec::new(),
+ authorization_list: Vec::new(),
})
.dispatch(::RuntimeOrigin::root()));
diff --git a/runtime/moonriver/tests/runtime_apis.rs b/runtime/moonriver/tests/runtime_apis.rs
index 5bdc974308e..cc932356bf2 100644
--- a/runtime/moonriver/tests/runtime_apis.rs
+++ b/runtime/moonriver/tests/runtime_apis.rs
@@ -167,6 +167,7 @@ fn ethereum_runtime_rpc_api_call() {
None, // nonce
false, // estimate
None, // access_list
+ None, // authorization_list
);
assert!(execution_result.is_ok());
});
@@ -188,6 +189,7 @@ fn ethereum_runtime_rpc_api_create() {
None, // nonce
false, // estimate
None, // access_list
+ None, // authorization_list
);
assert!(execution_result.is_ok());
});
diff --git a/test/contracts/src/EIP7702TestContracts.sol b/test/contracts/src/EIP7702TestContracts.sol
new file mode 100644
index 00000000000..8de1b174a2b
--- /dev/null
+++ b/test/contracts/src/EIP7702TestContracts.sol
@@ -0,0 +1,253 @@
+// SPDX-License-Identifier: GPL-3.0-only
+pragma solidity >=0.8.3;
+
+// Contract that performs SSTORE operations
+contract StorageWriter {
+ mapping(uint256 => uint256) public storage_;
+
+ function store(uint256 key, uint256 value) external {
+ storage_[key] = value;
+ }
+
+ function load(uint256 key) external view returns (uint256) {
+ return storage_[key];
+ }
+}
+
+// Contract that uses transient storage (TSTORE/TLOAD)
+contract TransientStorage {
+ function storeTransient(uint256 slot, uint256 value) external {
+ assembly {
+ tstore(slot, value)
+ }
+ }
+
+ function loadTransient(uint256 slot) external view returns (uint256 value) {
+ assembly {
+ value := tload(slot)
+ }
+ }
+
+ function storeAndLoad(
+ uint256 slot,
+ uint256 value
+ ) external returns (uint256) {
+ assembly {
+ tstore(slot, value)
+ value := tload(slot)
+ }
+ return value;
+ }
+}
+
+// Contract that performs SELFDESTRUCT
+contract SelfDestructor {
+ function destruct(address payable recipient) external {
+ selfdestruct(recipient);
+ }
+}
+
+// Contract that creates other contracts
+contract ContractCreator {
+ event ContractCreated(address indexed addr);
+
+ function createContract() external returns (address) {
+ bytes
+ memory bytecode = hex"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220";
+ address addr;
+ assembly {
+ addr := create(0, add(bytecode, 0x20), mload(bytecode))
+ }
+ emit ContractCreated(addr);
+ return addr;
+ }
+
+ function createContract2(bytes32 salt) external returns (address) {
+ bytes
+ memory bytecode = hex"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea2646970667358221220";
+ address addr;
+ assembly {
+ addr := create2(0, add(bytecode, 0x20), mload(bytecode), salt)
+ }
+ emit ContractCreated(addr);
+ return addr;
+ }
+}
+
+// Contract that performs various calls
+contract Caller {
+ event CallResult(bool success, bytes data);
+
+ function callAddress(
+ address target,
+ bytes calldata data
+ ) external returns (bool, bytes memory) {
+ (bool success, bytes memory result) = target.call(data);
+ emit CallResult(success, result);
+ return (success, result);
+ }
+
+ function delegatecallAddress(
+ address target,
+ bytes calldata data
+ ) external returns (bool, bytes memory) {
+ (bool success, bytes memory result) = target.delegatecall(data);
+ emit CallResult(success, result);
+ return (success, result);
+ }
+
+ function staticcallAddress(
+ address target,
+ bytes calldata data
+ ) external view returns (bool, bytes memory) {
+ (bool success, bytes memory result) = target.staticcall(data);
+ return (success, result);
+ }
+}
+
+// Contract that checks context (ADDRESS, BALANCE, etc.)
+contract ContextChecker {
+ function getAddress() external view returns (address) {
+ return address(this);
+ }
+
+ function getBalance() external view returns (uint256) {
+ return address(this).balance;
+ }
+
+ function getCodeSize() external view returns (uint256) {
+ uint256 size;
+ address addr = address(this);
+ assembly {
+ size := extcodesize(addr)
+ }
+ return size;
+ }
+
+ function getCodeHash() external view returns (bytes32) {
+ bytes32 hash;
+ address addr = address(this);
+ assembly {
+ hash := extcodehash(addr)
+ }
+ return hash;
+ }
+
+ function getCaller() external view returns (address) {
+ return msg.sender;
+ }
+
+ function getOrigin() external view returns (address) {
+ return tx.origin;
+ }
+}
+
+// Contract for testing re-entrancy
+contract ReentrantCaller {
+ uint256 public depth;
+ uint256 public maxDepth;
+
+ event ReentryDepth(uint256 depth);
+
+ function reenter(address target, uint256 targetDepth) external {
+ maxDepth = targetDepth;
+ depth = 0;
+ doReenter(target);
+ }
+
+ function doReenter(address target) public {
+ depth++;
+ emit ReentryDepth(depth);
+
+ if (depth < maxDepth) {
+ (bool success, ) = target.call(
+ abi.encodeWithSignature("doReenter(address)", target)
+ );
+ require(success, "Reentry failed");
+ }
+
+ depth--;
+ }
+}
+
+// Contract that modifies storage and can revert
+contract StorageModifier {
+ mapping(uint256 => uint256) public values;
+ bool public shouldRevert;
+
+ function setValue(uint256 key, uint256 value) external {
+ values[key] = value;
+ if (shouldRevert) {
+ revert("Forced revert");
+ }
+ }
+
+ function setShouldRevert(bool _shouldRevert) external {
+ shouldRevert = _shouldRevert;
+ }
+}
+
+// Simple counter contract
+contract Counter {
+ uint256 public count;
+
+ function increment() external {
+ count++;
+ }
+
+ function decrement() external {
+ require(count > 0, "Counter underflow");
+ count--;
+ }
+
+ function reset() external {
+ count = 0;
+ }
+}
+
+// Contract that accepts ETH
+contract EthReceiver {
+ mapping(address => uint256) public deposits;
+
+ receive() external payable {
+ deposits[msg.sender] += msg.value;
+ }
+
+ function withdraw() external {
+ uint256 amount = deposits[msg.sender];
+ deposits[msg.sender] = 0;
+ payable(msg.sender).transfer(amount);
+ }
+}
+
+contract BalanceTracker {
+ mapping(address => uint256) public balances;
+ uint256 public totalSupply;
+
+ event BalanceSet(address indexed account, uint256 newBalance);
+ event TotalSupplyChanged(uint256 newTotalSupply);
+
+ function setBalance(address account, uint256 newBalance) external {
+ balances[account] = newBalance;
+ emit BalanceSet(account, newBalance);
+ }
+
+ function incrementBalance(
+ address account,
+ uint256 amount
+ ) external returns (uint256) {
+ balances[account] += amount;
+ totalSupply += amount;
+ emit BalanceSet(account, balances[account]);
+ emit TotalSupplyChanged(totalSupply);
+ return balances[account];
+ }
+
+ function getBalance(address account) external view returns (uint256) {
+ return balances[account];
+ }
+
+ function getTotalSupply() external view returns (uint256) {
+ return totalSupply;
+ }
+}
diff --git a/test/package.json b/test/package.json
index abdd39c1839..231d8500cf7 100644
--- a/test/package.json
+++ b/test/package.json
@@ -56,7 +56,7 @@
"semver": "7.7.2",
"solc": "0.8.30",
"tsx": "*",
- "viem": "2.31.6",
+ "viem": "2.34.0",
"vitest": "3.1.3",
"web3": "4.16.0",
"yaml": "2.8.0"
diff --git a/test/scripts/combine-imports.ts b/test/scripts/combine-imports.ts
index daa44fff34c..d9ecb233bc8 100644
--- a/test/scripts/combine-imports.ts
+++ b/test/scripts/combine-imports.ts
@@ -8,7 +8,7 @@ import { join } from "node:path";
const processFile = async (filePath: string): Promise => {
const content = await fs.readFile(filePath, "utf-8");
- const importRegex = /import \{ ([^\}]+) \} from "\.\.\/\.\.\/\.\.\/helpers";/g;
+ const importRegex = /import \{ ([^}]+) \} from "\.\.\/\.\.\/\.\.\/helpers";/g;
const allImports: string[] = [];
let firstMatchIndex = -1;
diff --git a/test/suites/dev/common/test-block/test-block-trace.ts b/test/suites/dev/common/test-block/test-block-trace.ts
index 9faf2400459..88a374b0ac6 100644
--- a/test/suites/dev/common/test-block/test-block-trace.ts
+++ b/test/suites/dev/common/test-block/test-block-trace.ts
@@ -3,7 +3,7 @@ import { beforeAll, describeSuite, expect } from "@moonwall/cli";
import { ALITH_ADDRESS } from "@moonwall/util";
describeSuite({
- id: "D010406",
+ id: "D010106",
title: "Block Trace - Substrate",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/common/test-eip7702/helpers.ts b/test/suites/dev/common/test-eip7702/helpers.ts
new file mode 100644
index 00000000000..d56bea2aec8
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/helpers.ts
@@ -0,0 +1,106 @@
+import type { DevModeContext, GenericContext } from "@moonwall/cli";
+import { type TransactionSerializable } from "viem";
+import { ALITH_PRIVATE_KEY } from "@moonwall/util";
+import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { fundAccount } from "../../../../helpers";
+
+export async function createFundedAccount(context: DevModeContext) {
+ const privateKey = generatePrivateKey();
+ const account = privateKeyToAccount(privateKey);
+ await fundAccount(account.address, 100_000_000_000_000_000_000n, context);
+
+ return {
+ account: account,
+ privateKey: privateKey,
+ };
+}
+
+// TODO temporary helper until the changes are merged upstream to Moonwall
+export async function createViemTransaction(
+ context: GenericContext,
+ options
+): Promise<`0x${string}`> {
+ const type = !!options && !!options.txnType ? options.txnType : "eip1559";
+ const privateKey = !!options && !!options.privateKey ? options.privateKey : ALITH_PRIVATE_KEY;
+ const account = privateKeyToAccount(privateKey);
+ const value = options?.value ? options.value : 0n;
+ const to = options?.to ? options.to : "0x0000000000000000000000000000000000000000";
+ const chainId = await context.viem().getChainId();
+ const txnCount = await context.viem().getTransactionCount({ address: account.address });
+ const gasPrice = await context.viem().getGasPrice();
+ const data = options?.data ? options.data : "0x";
+
+ let estimatedGas = 1_500_000n;
+ if (!options.skipEstimation && options.gas === undefined) {
+ estimatedGas = await context.viem().estimateGas({ account: account.address, to, value, data });
+
+ // TODO find a better estimation
+ estimatedGas += options?.authorizationList
+ ? BigInt(options.authorizationList.length) * 500_000n
+ : 0n;
+ }
+
+ const accessList = options?.accessList ? options.accessList : [];
+ const authorizationList = options?.authorizationList ? options.authorizationList : [];
+
+ const txnBlob =
+ type === "eip1559"
+ ? ({
+ to,
+ value,
+ maxFeePerGas: options.maxFeePerGas !== undefined ? options.maxFeePerGas : gasPrice,
+ maxPriorityFeePerGas:
+ options.maxPriorityFeePerGas !== undefined ? options.maxPriorityFeePerGas : gasPrice,
+ gas: options.gas !== undefined ? options.gas : estimatedGas,
+ nonce: options.nonce !== undefined ? options.nonce : txnCount,
+ data,
+ chainId,
+ type,
+ } satisfies TransactionSerializable)
+ : type === "legacy"
+ ? ({
+ to,
+ value,
+ gasPrice: options.gasPrice !== undefined ? options.gasPrice : gasPrice,
+ gas: options.gas !== undefined ? options.gas : estimatedGas,
+ nonce: options.nonce !== undefined ? options.nonce : txnCount,
+ data,
+ } satisfies TransactionSerializable)
+ : type === "eip2930"
+ ? ({
+ to,
+ value,
+ gasPrice: options.gasPrice !== undefined ? options.gasPrice : gasPrice,
+ gas: options.gas !== undefined ? options.gas : estimatedGas,
+ nonce: options.nonce !== undefined ? options.nonce : txnCount,
+ data,
+ chainId,
+ type,
+ } satisfies TransactionSerializable)
+ : type === "eip7702"
+ ? ({
+ to,
+ value,
+ maxFeePerGas: options.maxFeePerGas !== undefined ? options.maxFeePerGas : gasPrice,
+ maxPriorityFeePerGas:
+ options.maxPriorityFeePerGas !== undefined
+ ? options.maxPriorityFeePerGas
+ : gasPrice,
+ gas: options.gas !== undefined ? options.gas : estimatedGas,
+ nonce: options.nonce !== undefined ? options.nonce : txnCount,
+ data,
+ chainId,
+ authorizationList,
+ type,
+ } satisfies TransactionSerializable)
+ : {};
+
+ if (
+ (type === "eip1559" && accessList.length > 0) ||
+ (type === "eip2930" && accessList.length > 0) ||
+ (type === "eip7702" && accessList.length > 0)
+ ) {
+ (txnBlob as any).accessList = accessList;
+ }
+ return await account.signTransaction(txnBlob);
+}
diff --git a/test/suites/dev/common/test-eip7702/test-eip7702-advanced.ts b/test/suites/dev/common/test-eip7702/test-eip7702-advanced.ts
new file mode 100644
index 00000000000..0e25ce0ab94
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/test-eip7702-advanced.ts
@@ -0,0 +1,708 @@
+import "@moonbeam-network/api-augment";
+import { beforeAll, describeSuite, expect, deployCreateCompiledContract } from "@moonwall/cli";
+import { sendRawTransaction } from "@moonwall/util";
+import { encodeFunctionData, decodeFunctionResult, type Abi, parseEther } from "viem";
+import { createFundedAccount, createViemTransaction } from "./helpers";
+
+describeSuite({
+ id: "D020802",
+ title: "EIP-7702 Advanced Pointer and Context Tests",
+ foundationMethods: "dev",
+ testCases: ({ context, it }) => {
+ let storageWriterAddress: `0x${string}`;
+ let storageWriterAbi: Abi;
+ let contextCheckerAddress: `0x${string}`;
+ let contextCheckerAbi: Abi;
+ let callerAddress: `0x${string}`;
+ let callerAbi: Abi;
+ let storageModifierAddress: `0x${string}`;
+ let storageModifierAbi: Abi;
+ let ethReceiverAddress: `0x${string}`;
+ let ethReceiverAbi: Abi;
+ let chainId: number;
+
+ // Precompile addresses
+ const ecrecoverPrecompile = "0x0000000000000000000000000000000000000001";
+ const sha256Precompile = "0x0000000000000000000000000000000000000002";
+ const ripemd160Precompile = "0x0000000000000000000000000000000000000003";
+ const identityPrecompile = "0x0000000000000000000000000000000000000004";
+
+ beforeAll(async () => {
+ // Get the chainId from the RPC
+ chainId = await context.viem().getChainId();
+
+ const storageWriter = await deployCreateCompiledContract(context, "StorageWriter");
+ storageWriterAddress = storageWriter.contractAddress;
+ storageWriterAbi = storageWriter.abi;
+
+ const contextChecker = await deployCreateCompiledContract(context, "ContextChecker");
+ contextCheckerAddress = contextChecker.contractAddress;
+ contextCheckerAbi = contextChecker.abi;
+
+ const caller = await deployCreateCompiledContract(context, "Caller");
+ callerAddress = caller.contractAddress;
+ callerAbi = caller.abi;
+
+ const storageModifier = await deployCreateCompiledContract(context, "StorageModifier");
+ storageModifierAddress = storageModifier.contractAddress;
+ storageModifierAbi = storageModifier.abi;
+
+ const ethReceiver = await deployCreateCompiledContract(context, "EthReceiver");
+ ethReceiverAddress = ethReceiver.contractAddress;
+ ethReceiverAbi = ethReceiver.abi;
+ });
+
+ it({
+ id: "T01",
+ title: "should handle pointer chain with multiple authorization tuples",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ // Create a chain: EOA1 -> Contract1 -> EOA2 -> Contract2 -> EOA3 -> Contract3
+ const eoa1 = (await createFundedAccount(context)).account;
+ const eoa2 = (await createFundedAccount(context)).account;
+ const eoa3 = (await createFundedAccount(context)).account;
+
+ // Create pointer chain
+ const auth1 = await eoa1.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth2 = await eoa2.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth3 = await eoa3.signAuthorization({
+ contractAddress: contextCheckerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Set up all pointers in one transaction
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth1, auth2, auth3],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Now test pointer chain: EOA1 calls EOA2
+ const storeData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [10n, 100n],
+ });
+
+ const callData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "callAddress",
+ args: [eoa2.address, storeData],
+ });
+
+ const chainTx = {
+ to: eoa1.address,
+ data: callData,
+ gas: 1_500_000n,
+ chainId: chainId,
+ privateKey: sender.privateKey,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, chainTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+ }
+
+ // Verify storage in EOA2's context
+ const storedValue = await context.viem().readContract({
+ address: eoa2.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [10n],
+ });
+ expect(storedValue).toBe(100n);
+ },
+ });
+
+ it({
+ id: "T02",
+ title: "should test context opcodes with pointers (BALANCE, CODESIZE, etc.)",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const pointer = (await createFundedAccount(context)).account;
+
+ const auth = await pointer.signAuthorization({
+ contractAddress: contextCheckerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Test ADDRESS opcode - should return pointer's address
+ const address = await context.viem().readContract({
+ address: pointer.address,
+ abi: contextCheckerAbi,
+ functionName: "getAddress",
+ args: [],
+ });
+ expect(address.toLowerCase()).toBe(pointer.address.toLowerCase());
+
+ // Test BALANCE opcode - should return pointer's balance
+ const balance = await context.viem().readContract({
+ address: pointer.address,
+ abi: contextCheckerAbi,
+ functionName: "getBalance",
+ args: [],
+ });
+ expect(balance).toBeGreaterThan(0n);
+
+ // Test CODESIZE opcode - should return delegation code size (23 bytes)
+ const codeSize = await context.viem().readContract({
+ address: pointer.address,
+ abi: contextCheckerAbi,
+ functionName: "getCodeSize",
+ args: [],
+ });
+ expect(codeSize).toBe(23n);
+
+ // Test CODEHASH opcode
+ const codeHash = await context.viem().readContract({
+ address: pointer.address,
+ abi: contextCheckerAbi,
+ functionName: "getCodeHash",
+ args: [],
+ });
+ expect(codeHash).toBeTruthy();
+ },
+ });
+
+ it({
+ id: "T03",
+ title: "should test call to precompile in pointer context",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const pointer = (await createFundedAccount(context)).account;
+
+ const auth = await pointer.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Call identity precompile through pointer
+ const testData = "0x48656c6c6f20576f726c64"; // "Hello World" in hex
+ const callData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "callAddress",
+ args: [identityPrecompile, testData],
+ });
+
+ const precompileTx = {
+ to: pointer.address,
+ data: callData,
+ chainId: chainId,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, precompileTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+ }
+ },
+ });
+
+ it({
+ id: "T04",
+ title: "should test gas difference between pointer and direct calls",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const pointer = (await createFundedAccount(context)).account;
+
+ // Set up pointer
+ const auth = await pointer.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Call through pointer
+ const storeData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [1n, 100n],
+ });
+
+ const pointerCallTx = {
+ to: pointer.address,
+ data: storeData,
+ chainId: chainId,
+ };
+
+ let pointerGas = 0n;
+ {
+ const signedTx = await createViemTransaction(context, pointerCallTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+
+ pointerGas = receipt.gasUsed;
+ }
+
+ // Direct call to contract
+ const directCallTx = {
+ to: storageWriterAddress,
+ data: encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [2n, 200n],
+ }),
+ chainId: chainId,
+ };
+
+ let directGas = 0n;
+ {
+ const signedTx = await createViemTransaction(context, directCallTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+ directGas = receipt.gasUsed;
+ }
+
+ console.log(`Pointer call gas: ${pointerGas}, Direct call gas: ${directGas}`);
+ console.log(`Gas difference: ${pointerGas - directGas}`);
+
+ // Pointer call should use the same gas as delegation call
+ expect(pointerGas).toEqual(directGas);
+ },
+ });
+
+ it({
+ id: "T05",
+ title: "should test static context preservation through pointers",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const pointer = (await createFundedAccount(context)).account;
+
+ const auth = await pointer.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Try to make a static call that should fail if it tries to modify state
+ const storeData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [1n, 100n],
+ });
+
+ const staticCallData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "staticcallAddress",
+ args: [storageWriterAddress, storeData],
+ });
+
+ const returnData = await context.viem().call({
+ to: pointer.address,
+ data: staticCallData,
+ });
+
+ // Decode the return data to verify the static call returned false
+ const [success] = decodeFunctionResult({
+ abi: callerAbi,
+ functionName: "staticcallAddress",
+ data: returnData.data!,
+ }) as [boolean, `0x${string}`];
+
+ expect(success).toBe(false);
+ },
+ });
+
+ it({
+ id: "T06",
+ title: "should test pointer reverts and error propagation",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const pointer = (await createFundedAccount(context)).account;
+
+ const auth = await pointer.signAuthorization({
+ contractAddress: storageModifierAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Set the contract to revert
+ const setRevertTx = {
+ to: pointer.address,
+ data: encodeFunctionData({
+ abi: storageModifierAbi,
+ functionName: "setShouldRevert",
+ args: [true],
+ }),
+ chainId: chainId,
+ privateKey: sender.privateKey,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, setRevertTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+ }
+
+ // Now try to set value which should revert
+ const revertTx = {
+ to: pointer.address,
+ data: encodeFunctionData({
+ abi: storageModifierAbi,
+ functionName: "setValue",
+ args: [1n, 100n],
+ }),
+ chainId: chainId,
+ privateKey: sender.privateKey,
+ // Gas estimation fail because the tx revert (that's the purpose of the test)
+ skipEstimation: true,
+ gas: 500_000,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, revertTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("reverted");
+ }
+ },
+ });
+
+ it({
+ id: "T07",
+ title: "should test double authorization (last authorization wins)",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const doubleAuth = (await createFundedAccount(context)).account;
+
+ // Create two authorizations for the same EOA
+ const auth1 = await doubleAuth.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth2 = await doubleAuth.signAuthorization({
+ contractAddress: contextCheckerAddress,
+ chainId: chainId,
+ nonce: 1,
+ });
+
+ // Send both authorizations - last one should win
+ const tx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth1, auth2],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Check which delegation is active - should be contextChecker (last one)
+ const address = await context.viem().readContract({
+ address: doubleAuth.address,
+ abi: contextCheckerAbi,
+ functionName: "getAddress",
+ args: [],
+ });
+
+ expect(address.toLowerCase()).toBe(doubleAuth.address.toLowerCase());
+ console.log("Last authorization (contextChecker) is active");
+ },
+ });
+
+ it({
+ id: "T08",
+ title: "should test pointer with ETH transfers",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const pointer = (await createFundedAccount(context)).account;
+
+ const auth = await pointer.signAuthorization({
+ contractAddress: ethReceiverAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [auth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Get initial balances
+ const initialSenderBalance = await context.viem().getBalance({
+ address: sender.account.address,
+ });
+ const initialPointerBalance = await context.viem().getBalance({
+ address: pointer.address,
+ });
+
+ // Send ETH to the pointer (which delegates to EthReceiver)
+ const sendEthTx = {
+ to: pointer.address,
+ value: parseEther("0.5"),
+ chainId: chainId,
+ privateKey: sender.privateKey,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, sendEthTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+ }
+
+ // Check balance after ETH transfer
+ const balanceAfterDeposit = await context.viem().getBalance({
+ address: pointer.address,
+ });
+ expect(balanceAfterDeposit).toBe(initialPointerBalance + parseEther("0.5"));
+
+ // Check deposit was recorded
+ const deposit = await context.viem().readContract({
+ address: pointer.address,
+ abi: ethReceiverAbi,
+ functionName: "deposits",
+ args: [sender.account.address],
+ });
+ expect(deposit).toBe(parseEther("0.5"));
+
+ // Withdraw the ETH
+ const withdrawTx = {
+ to: pointer.address,
+ data: encodeFunctionData({
+ abi: ethReceiverAbi,
+ functionName: "withdraw",
+ args: [],
+ }),
+ chainId: chainId,
+ privateKey: sender.privateKey,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, withdrawTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+ }
+
+ // Check balance after withdrawal
+ const balanceAfterWithdrawal = await context.viem().getBalance({
+ address: pointer.address,
+ });
+ expect(balanceAfterWithdrawal).toBe(initialPointerBalance);
+
+ // Check deposit was cleared
+ const depositAfter = await context.viem().readContract({
+ address: pointer.address,
+ abi: ethReceiverAbi,
+ functionName: "deposits",
+ args: [sender.account.address],
+ });
+ expect(depositAfter).toBe(0n);
+
+ // Check sender's final balance (should be less than initial due to gas costs and the ETH that was withdrawn back)
+ const finalSenderBalance = await context.viem().getBalance({
+ address: sender.account.address,
+ });
+ expect(finalSenderBalance).toBeLessThan(initialSenderBalance);
+ },
+ });
+ },
+});
diff --git a/test/suites/dev/common/test-eip7702/test-eip7702-delegatecall.ts b/test/suites/dev/common/test-eip7702/test-eip7702-delegatecall.ts
new file mode 100644
index 00000000000..73bd93d6df2
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/test-eip7702-delegatecall.ts
@@ -0,0 +1,464 @@
+import "@moonbeam-network/api-augment";
+import { beforeAll, describeSuite, expect, deployCreateCompiledContract } from "@moonwall/cli";
+import { encodeFunctionData, type Abi } from "viem";
+import { sendRawTransaction } from "@moonwall/util";
+import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { createFundedAccount, createViemTransaction } from "./helpers";
+
+describeSuite({
+ id: "D020803",
+ title: "EIP-7702 Delegatecall Operations",
+ foundationMethods: "dev",
+ testCases: ({ context, it }) => {
+ let storageWriterAddress: `0x${string}`;
+ let storageWriterAbi: Abi;
+ let contextCheckerAddress: `0x${string}`;
+ let contextCheckerAbi: Abi;
+ let callerAddress: `0x${string}`;
+ let callerAbi: Abi;
+ let counterAddress: `0x${string}`;
+ let counterAbi: Abi;
+ let chainId: number;
+
+ beforeAll(async () => {
+ // Get the chainId from the RPC
+ chainId = await context.viem().getChainId();
+
+ // Deploy test contracts
+ const storageWriter = await deployCreateCompiledContract(context, "StorageWriter");
+ storageWriterAddress = storageWriter.contractAddress;
+ storageWriterAbi = storageWriter.abi;
+
+ const contextChecker = await deployCreateCompiledContract(context, "ContextChecker");
+ contextCheckerAddress = contextChecker.contractAddress;
+ contextCheckerAbi = contextChecker.abi;
+
+ const caller = await deployCreateCompiledContract(context, "Caller");
+ callerAddress = caller.contractAddress;
+ callerAbi = caller.abi;
+
+ const counter = await deployCreateCompiledContract(context, "Counter");
+ counterAddress = counter.contractAddress;
+ counterAbi = counter.abi;
+ });
+
+ it({
+ id: "T01",
+ title: "should perform delegatecall to empty account",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+ const emptyTarget = privateKeyToAccount(generatePrivateKey());
+
+ // Create authorization for caller contract
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Prepare delegatecall to empty account
+ const callData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "delegatecallAddress",
+ args: [emptyTarget.address, "0x"],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ // Verify transaction succeeded
+ expect(receipt.status).toBe("success");
+
+ // Verify delegation was set
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+
+ expect(code?.startsWith("0xef0100")).toBe(true);
+ },
+ });
+
+ it({
+ id: "T02",
+ title: "should perform delegatecall to EOA",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+ const targetEOA = (await createFundedAccount(context)).account;
+
+ // Create authorization
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Delegatecall to EOA
+ const callData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "delegatecallAddress",
+ args: [targetEOA.address, "0x"],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+ expect(receipt.status).toBe("success");
+ },
+ });
+
+ it({
+ id: "T03",
+ title: "should perform delegatecall to contract account",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ // Create authorization for caller contract
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Delegatecall to storage writer contract
+ const storeData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [1n, 42n],
+ });
+
+ // NOTE: When contract A executes delegatecall to contract B, B's code is executed
+ // with contract A's storage, msg.sender and msg.value
+ const callData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "delegatecallAddress",
+ args: [storageWriterAddress, storeData],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+ gas: 1_500_000n,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+ expect(receipt.status).toBe("success");
+
+ // Storage should be in the delegating EOA's context (via caller contract delegation)
+ // Verify with a load storage call via delegatecall
+
+ // Delegatecall to load storage
+ const storeData2 = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [1n],
+ });
+
+ // Read the stored value
+ const storedValue = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: callerAbi,
+ functionName: "delegatecallAddress",
+ args: [storageWriterAddress, storeData2],
+ });
+
+ expect(storedValue).toStrictEqual([
+ true,
+ // uint256 hex encoded (2a == 42)
+ "0x000000000000000000000000000000000000000000000000000000000000002a",
+ ]);
+ },
+ });
+
+ it({
+ id: "T04",
+ title: "should verify storage state after delegation",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ // Create authorization for storage writer
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Store value directly
+ const callData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [5n, 100n],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+ expect(receipt.status).toBe("success");
+
+ // Read the stored value
+ const storedValue = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [5n],
+ });
+
+ expect(storedValue).toBe(100n);
+ },
+ });
+
+ it({
+ id: "T05",
+ title: "should handle calls from existing contracts to delegated EOAs",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ // Delegate EOA to counter contract
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Initialize delegation
+ const tx = {
+ to: delegatingEOA.address,
+ data: encodeFunctionData({
+ abi: counterAbi,
+ functionName: "increment",
+ args: [],
+ }),
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+ expect(receipt.status).toBe("success");
+
+ // Now call the delegated EOA from another contract
+ const tx2 = {
+ to: callerAddress,
+ data: encodeFunctionData({
+ abi: callerAbi,
+ functionName: "callAddress",
+ args: [
+ delegatingEOA.address,
+ encodeFunctionData({
+ abi: counterAbi,
+ functionName: "increment",
+ args: [],
+ }),
+ ],
+ }),
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, tx2);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+ expect(receipt.status).toBe("success");
+ }
+
+ // Check counter value
+ const count = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: counterAbi,
+ functionName: "count",
+ args: [],
+ });
+
+ expect(count).toBe(2n); // Incremented twice
+ },
+ });
+
+ it({
+ id: "T06",
+ title: "should handle context opcodes (ADDRESS, BALANCE, CODESIZE)",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ // Delegate to context checker
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: contextCheckerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const tx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Check ADDRESS opcode
+ const address = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: contextCheckerAbi,
+ functionName: "getAddress",
+ args: [],
+ });
+ expect(address.toLowerCase()).toBe(delegatingEOA.address.toLowerCase());
+
+ // Check BALANCE opcode
+ const balance = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: contextCheckerAbi,
+ functionName: "getBalance",
+ args: [],
+ });
+ expect(balance).toBeGreaterThan(0n);
+
+ // Check CODESIZE opcode
+ const codeSize = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: contextCheckerAbi,
+ functionName: "getCodeSize",
+ args: [],
+ });
+ expect(codeSize).toBe(23n); // EIP-7702 delegation code size
+
+ // Check CODEHASH opcode
+ const codeHash = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: contextCheckerAbi,
+ functionName: "getCodeHash",
+ args: [],
+ });
+ expect(codeHash).toBeTruthy();
+ },
+ });
+
+ it({
+ id: "T07",
+ title: "should handle calls to precompile addresses",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+ const ecrecoverPrecompile = "0x0000000000000000000000000000000000000001";
+
+ // Delegate to caller contract
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Call ecrecover precompile (with dummy data)
+ const precompileData = "0x" + "00".repeat(128); // Dummy data for ecrecover
+
+ const callData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "callAddress",
+ args: [ecrecoverPrecompile, precompileData],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+ expect(receipt.status).toBe("success");
+ },
+ });
+ },
+});
diff --git a/test/suites/dev/common/test-eip7702/test-eip7702-gas.ts b/test/suites/dev/common/test-eip7702/test-eip7702-gas.ts
new file mode 100644
index 00000000000..11a7249d110
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/test-eip7702-gas.ts
@@ -0,0 +1,431 @@
+import "@moonbeam-network/api-augment";
+import { beforeAll, describeSuite, expect, deployCreateCompiledContract } from "@moonwall/cli";
+import { encodeFunctionData, type Abi, parseEther } from "viem";
+import { sendRawTransaction } from "@moonwall/util";
+import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { createFundedAccount, createViemTransaction } from "./helpers";
+
+describeSuite({
+ id: "D020804",
+ title: "EIP-7702 Gas Cost and Accounting",
+ foundationMethods: "dev",
+ testCases: ({ context, it }) => {
+ let storageWriterAddress: `0x${string}`;
+ let storageWriterAbi: Abi;
+ let counterAddress: `0x${string}`;
+ let counterAbi: Abi;
+ let chainId: number;
+
+ // EIP-7702 gas costs (from EIP-7702 specification)
+ const PER_AUTH_BASE_COST = 12500n; // Cost for processing each authorization
+ const PER_EMPTY_ACCOUNT_COST = 25000n; // Intrinsic cost per authorization in list
+ const PER_CONTRACT_CODE_BASE_COST = 2500n; // Moonbeam-specific implementation detail
+
+ beforeAll(async () => {
+ // Get the chainId from the RPC
+ chainId = await context.viem().getChainId();
+
+ const storageWriter = await deployCreateCompiledContract(context, "StorageWriter");
+ storageWriterAddress = storageWriter.contractAddress;
+ storageWriterAbi = storageWriter.abi;
+
+ const counter = await deployCreateCompiledContract(context, "Counter");
+ counterAddress = counter.contractAddress;
+ counterAbi = counter.abi;
+ });
+
+ it({
+ id: "T01",
+ title: "should calculate correct gas cost for single authorization",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Simple transaction with authorization
+ const tx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ data: encodeFunctionData({
+ abi: counterAbi,
+ functionName: "increment",
+ args: [],
+ }),
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+
+ // Gas used should include authorization costs
+ expect(receipt.gasUsed).toBeGreaterThan(PER_AUTH_BASE_COST);
+
+ console.log(`Gas used with 1 authorization: ${receipt.gasUsed}`);
+ },
+ });
+
+ it({
+ id: "T02",
+ title: "should calculate correct gas cost for multiple authorizations",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const eoa1 = (await createFundedAccount(context)).account;
+ const eoa2 = (await createFundedAccount(context)).account;
+ const eoa3 = (await createFundedAccount(context)).account;
+
+ // Create multiple authorizations
+ const auth1 = await eoa1.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth2 = await eoa2.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth3 = await eoa3.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const tx = {
+ to: eoa1.address,
+ data: encodeFunctionData({
+ abi: counterAbi,
+ functionName: "increment",
+ args: [],
+ }),
+ chainId: chainId,
+ authorizationList: [auth1, auth2, auth3],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ // Gas should include cost for 3 authorizations
+ const minExpectedGas = PER_AUTH_BASE_COST * 3n;
+ expect(receipt.gasUsed).toBeGreaterThan(minExpectedGas);
+
+ console.log(`Gas used with 3 authorizations: ${receipt.gasUsed}`);
+ },
+ });
+
+ it({
+ id: "T03",
+ title:
+ "should document current account warming behavior for authority and authorized accounts",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const coldEOA = privateKeyToAccount(generatePrivateKey());
+ const warmEOA = (await createFundedAccount(context)).account;
+
+ const coldAuth = await coldEOA.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const warmAuth = await warmEOA.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Execute both transactions in the same block to test warming effect
+ const senderNonce = await context.viem().getTransactionCount({
+ address: sender.account.address,
+ });
+
+ // Transaction with cold account
+ const coldTx = {
+ to: coldEOA.address,
+ chainId: chainId,
+ authorizationList: [coldAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ nonce: senderNonce,
+ };
+
+ // Transaction with warm account
+ const warmTx = {
+ to: warmEOA.address,
+ chainId: chainId,
+ authorizationList: [warmAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ nonce: senderNonce + 1,
+ };
+
+ const coldSignature = await createViemTransaction(context, coldTx);
+ const warmSignature = await createViemTransaction(context, warmTx);
+
+ // Execute both transactions in the same block
+ const result = await context.createBlock([coldSignature, warmSignature]);
+
+ // Get gas used for both transactions
+ const receipts = await Promise.all([
+ context.viem().getTransactionReceipt({
+ hash: result.result![0].hash as `0x${string}`,
+ }),
+ context.viem().getTransactionReceipt({
+ hash: result.result![1].hash as `0x${string}`,
+ }),
+ ]);
+
+ const coldGas = receipts[0].gasUsed;
+ const warmGas = receipts[1].gasUsed;
+
+ console.log(`Cold account gas: ${coldGas}, Warm account gas: ${warmGas}`);
+ expect(coldGas).toBeGreaterThan(warmGas);
+ },
+ });
+
+ it({
+ id: "T04",
+ title: "should test intrinsic gas cost with exact gas limit",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Calculate calldata gas cost
+ // increment() function selector: 0xd09de08a (4 bytes)
+ const calldata = encodeFunctionData({
+ abi: counterAbi,
+ functionName: "increment",
+ args: [],
+ });
+
+ // Count zero and non-zero bytes in calldata
+ let zeroBytes = 0n;
+ let nonZeroBytes = 0n;
+
+ // Remove '0x' prefix and process hex string
+ const hexData = calldata.slice(2);
+ for (let i = 0; i < hexData.length; i += 2) {
+ const byte = hexData.slice(i, i + 2);
+ if (byte === "00") {
+ zeroBytes++;
+ } else {
+ nonZeroBytes++;
+ }
+ }
+
+ // Calculate intrinsic gas according to EIP-7702:
+ // - Base transaction cost: 21000
+ // - Per authorization in list: PER_EMPTY_ACCOUNT_COST (25000)
+ // - Calldata: 4 gas per zero byte, 16 gas per non-zero byte
+ const calldataGas = zeroBytes * 4n + nonZeroBytes * 16n;
+ const authorizationListGas = PER_EMPTY_ACCOUNT_COST * 1n; // 1 authorization
+ const intrinsicGas = 21000n + authorizationListGas + calldataGas;
+
+ console.log(`Intrinsic gas calculation breakdown:`);
+ console.log(` Base transaction: 21000`);
+ console.log(` Authorization list (1 auth): ${authorizationListGas}`);
+ console.log(
+ ` Calldata (${zeroBytes} zero bytes, ${nonZeroBytes} non-zero): ${calldataGas}`
+ );
+ console.log(` Total intrinsic gas: ${intrinsicGas}`);
+
+ // Test 1: Transaction with exact intrinsic gas (should fail - no gas for execution)
+ const exactGasTx = {
+ to: delegatingEOA.address,
+ data: calldata,
+ gas: intrinsicGas,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ try {
+ const signature = await createViemTransaction(context, exactGasTx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ console.log(`Transaction with exact intrinsic gas status: ${receipt.status}`);
+ // Should have failed due to insufficient gas
+ expect(receipt.status).toBe("reverted");
+ } catch (_error) {
+ console.log("Transaction with exact intrinsic gas failed as expected");
+ }
+
+ // Test 2: Transaction with intrinsic + 1 gas (should still fail - not enough for execution)
+ const almostEnoughGasTx = {
+ ...exactGasTx,
+ gas: intrinsicGas + 1n,
+ };
+
+ try {
+ const signature = await createViemTransaction(context, almostEnoughGasTx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ console.log(`Transaction with intrinsic + 1 gas status: ${receipt.status}`);
+ // Should have failed due to insufficient gas for execution
+ expect(receipt.status).toBe("reverted");
+ } catch (_error) {
+ console.log("Transaction with intrinsic + 1 gas failed as expected");
+ }
+
+ // Test 3: Transaction with sufficient gas for execution (should succeed)
+ const executionGasEstimate = 30_000n; // Estimated gas for increment() execution
+ const sufficientGasTx = {
+ ...exactGasTx,
+ gas: intrinsicGas + executionGasEstimate,
+ };
+
+ const signature = await createViemTransaction(context, sufficientGasTx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ console.log(`Transaction with sufficient gas:`);
+ console.log(` Gas limit: ${intrinsicGas + executionGasEstimate}`);
+ console.log(` Gas used: ${receipt.gasUsed}`);
+ console.log(` Status: ${receipt.status}`);
+
+ expect(receipt.status).toBe("success");
+
+ // Verify the intrinsic gas portion
+ const executionGas = receipt.gasUsed - intrinsicGas;
+ console.log(` Execution gas (actual - intrinsic): ${executionGas}`);
+
+ // Gas used should be at least the intrinsic gas
+ expect(receipt.gasUsed).toBeGreaterThanOrEqual(intrinsicGas);
+ },
+ });
+
+ it({
+ id: "T05",
+ title: "should handle out-of-gas during authorization processing",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Very low gas limit that should fail during authorization processing
+ const lowGasTx = {
+ to: delegatingEOA.address,
+ data: encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [1n, 100n],
+ }),
+ gas: 25000n, // Very low gas
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, lowGasTx);
+ const { result } = await context.createBlock(signature);
+
+ // Transaction should fail due to out of gas
+ expect(result?.successful).toBe(false);
+ expect(result?.hash).toBeUndefined();
+
+ // Delegation should not be set
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(code).toBeFalsy();
+ },
+ });
+
+ it({
+ id: "T06",
+ title: "should test gas refund for authorization clearing",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ // First set a delegation
+ const setAuth = await delegatingEOA.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const setTx = {
+ to: delegatingEOA.address,
+ chainId: chainId,
+ authorizationList: [setAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const setSignature = await createViemTransaction(context, setTx);
+ const setHash = await sendRawTransaction(context, setSignature);
+ await context.createBlock();
+
+ // Verify delegation is set
+ const codeAfterSet = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(codeAfterSet?.startsWith("0xef0100")).toBe(true);
+
+ // Now clear the delegation (delegate to zero address)
+ const clearAuth = await delegatingEOA.signAuthorization({
+ contractAddress: "0x0000000000000000000000000000000000000000",
+ chainId: chainId,
+ nonce: 1,
+ });
+
+ const clearTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any address without code
+ chainId: chainId,
+ authorizationList: [clearAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const clearSignature = await createViemTransaction(context, clearTx);
+ const clearHash = await sendRawTransaction(context, clearSignature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash: clearHash });
+
+ expect(receipt.status).toBe("success");
+
+ // Gas used for clearing
+ console.log(`Gas used for clearing delegation: ${receipt.gasUsed}`);
+ expect(receipt.gasUsed).toBe(36800n);
+ },
+ });
+ },
+});
diff --git a/test/suites/dev/common/test-eip7702/test-eip7702-happypath.ts b/test/suites/dev/common/test-eip7702/test-eip7702-happypath.ts
new file mode 100644
index 00000000000..64afe42b3d8
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/test-eip7702-happypath.ts
@@ -0,0 +1,505 @@
+import "@moonbeam-network/api-augment";
+import { beforeAll, describeSuite, expect, deployCreateCompiledContract } from "@moonwall/cli";
+import { sendRawTransaction } from "@moonwall/util";
+import { keccak256, concat, encodeFunctionData, numberToHex, type Abi } from "viem";
+import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { createViemTransaction } from "./helpers";
+
+describeSuite({
+ id: "D020512",
+ title: "EIP-7702 Transactions",
+ foundationMethods: "dev",
+ testCases: ({ context, it }) => {
+ let contractAddress: `0x${string}`;
+ let contractAbi: Abi;
+ let chainId: number;
+
+ beforeAll(async () => {
+ // Get the chainId from the RPC
+ chainId = await context.viem().getChainId();
+
+ // Deploy the delegation contract
+ const { contractAddress: address, abi } = await deployCreateCompiledContract(
+ context,
+ "BalanceTracker"
+ );
+
+ expect(address).toBeTruthy();
+ console.log(`Delegation contract deployed at: ${address}`);
+
+ contractAddress = address;
+ contractAbi = abi;
+ });
+
+ it({
+ id: "T01",
+ title: "happy path - should successfully delegate with valid EIP-7702 authorization",
+ test: async () => {
+ // Create a new EOA for delegation
+ const privateKey = generatePrivateKey();
+ const delegatingEOA = privateKeyToAccount(privateKey);
+ const delegatingAddress = delegatingEOA.address;
+ console.log(`Created EOA for delegation: ${delegatingAddress}`);
+
+ // Fund the delegating EOA with some balance from ALITH
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingAddress, 1000000000000000000n),
+ ]);
+
+ // Set up initial delegation
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ console.log(
+ `Authorization created for ${delegatingAddress} to delegate to ${contractAddress}`
+ );
+ console.log(`Authorization nonce: ${authorization.nonce}`);
+ console.log(`Authorization details:`, {
+ contractAddress: contractAddress,
+ chainId: authorization.chainId,
+ nonce: authorization.nonce?.toString(),
+ r: authorization.r,
+ s: authorization.s,
+ yParity: authorization.yParity,
+ });
+
+ // Create the authorization list
+ const authorizationList = [authorization];
+
+ // Use the delegation ABI from helpers
+
+ // Set balance for an arbitrary address
+ const targetAddress = "0x1234567890123456789012345678901234567890" as `0x${string}`;
+ const targetBalance = 5000n;
+
+ const callData = encodeFunctionData({
+ abi: contractAbi,
+ functionName: "setBalance",
+ args: [targetAddress, targetBalance],
+ });
+
+ // Create a raw EIP-7702 transaction manually
+ console.log(`Creating EIP-7702 transaction with authorizationList...`);
+ console.log(`Authorization list being sent:`, authorizationList);
+
+ // Create the transaction object with authorizationList
+ const transaction = {
+ to: delegatingAddress,
+ data: callData,
+ chainId: chainId,
+ authorizationList,
+ txnType: "eip7702" as const,
+ };
+
+ console.log(`Transaction object:`, transaction);
+
+ // Sign the transaction
+ const signature = await createViemTransaction(context, transaction);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ console.log(`Transaction submitted by ALITH for delegation to ${delegatingAddress}`);
+ console.log(`Transaction hash: ${hash}`);
+
+ // Check transaction receipt
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ expect(receipt.status).toBe("success");
+
+ console.log(`Transaction receipt status: ${receipt.status}`);
+ console.log(`Transaction receipt logs:`, receipt.logs);
+
+ // Check the transaction details
+ const tx = await context.viem().getTransaction({ hash });
+ console.log(`Transaction type: ${tx.type}`);
+ console.log(`Transaction authorizationList:`, tx.authorizationList);
+
+ // Also check the raw transaction
+ console.log(`Raw transaction:`, tx);
+
+ // Check if the delegating address now has delegated code
+ const codeAtDelegator = await context.viem().getCode({
+ address: delegatingAddress,
+ });
+ console.log(`Code at delegator address ${delegatingAddress}: ${codeAtDelegator}`);
+
+ // Also check code at contract address for comparison
+ const codeAtContract = await context.viem().getCode({
+ address: contractAddress,
+ });
+ console.log(
+ `Code at contract address ${contractAddress}: ${codeAtContract?.slice(0, 50)}...`
+ );
+
+ // EIP-7702 sets a special delegated code format: 0xef0100 + 20-byte address
+ expect(codeAtDelegator).toBeTruthy();
+ expect(codeAtDelegator?.startsWith("0xef0100")).toBe(true);
+ expect(codeAtDelegator?.length).toBe(48); // 0x + ef0100 (6) + address (40)
+
+ // Now check if the delegation worked
+ // The storage should be in Baltathar's account context, not the contract's
+
+ // Calculate storage slot for mapping(address => uint256) balances
+ // slot = keccak256(abi.encode(targetAddress, 0))
+ const storageSlot = keccak256(
+ concat([
+ targetAddress.toLowerCase().padEnd(66, "0") as `0x${string}`,
+ numberToHex(0n, { size: 32 }),
+ ])
+ );
+
+ // Check storage at the delegating EOA's address
+ const storageAtDelegator = await context.viem().getStorageAt({
+ address: delegatingAddress,
+ slot: storageSlot,
+ });
+
+ const actualBalance = BigInt(storageAtDelegator || "0");
+ console.log(`Storage at delegating address ${delegatingAddress}: ${actualBalance}`);
+
+ // Also check the contract storage (should be 0 if delegation worked properly)
+ const contractStorageBalance = await context.viem().readContract({
+ address: contractAddress!,
+ abi: contractAbi,
+ functionName: "getBalance",
+ args: [targetAddress],
+ });
+
+ console.log(`Balance in contract storage: ${contractStorageBalance}`);
+
+ // Let's check if we can read the balance through the delegated address
+ try {
+ const delegatedBalance = await context.viem().readContract({
+ address: delegatingAddress,
+ abi: contractAbi,
+ functionName: "getBalance",
+ args: [targetAddress],
+ });
+ console.log(`Balance read through delegated address: ${delegatedBalance}`);
+ } catch (error) {
+ console.log(`Error reading through delegated address:`, error);
+ }
+
+ // Happy path expectations for EIP-7702
+ // The storage is NOT in the delegating address, but accessed through the contract
+ // The delegating address should have the delegation code
+ expect(codeAtDelegator).toBeTruthy();
+ expect(codeAtDelegator?.startsWith("0xef0100")).toBe(true);
+
+ // Reading through the delegated address should return the correct balance
+ const delegatedBalance = await context.viem().readContract({
+ address: delegatingAddress,
+ abi: contractAbi,
+ functionName: "getBalance",
+ args: [targetAddress],
+ });
+
+ expect(delegatedBalance).to.equal(targetBalance);
+ console.log(
+ `SUCCESS: EIP-7702 delegation worked! Balance ${delegatedBalance} can be read through the delegating address`
+ );
+
+ // Additional test: call incrementBalance to verify continued delegation
+ const incrementData = encodeFunctionData({
+ abi: contractAbi,
+ functionName: "incrementBalance",
+ args: [targetAddress, 500n],
+ });
+
+ // Second transaction: increment balance through the delegated address
+ // We don't need to send the authorization again since it's already set
+ const incrementTx = {
+ to: delegatingAddress,
+ data: incrementData,
+ chainId: chainId,
+ };
+
+ const signedIncrement = await createViemTransaction(context, incrementTx);
+ const incrementHash = await sendRawTransaction(context, signedIncrement);
+ await context.createBlock();
+
+ const incrementReceipt = await context
+ .viem()
+ .getTransactionReceipt({ hash: incrementHash });
+ expect(incrementReceipt.status).toBe("success");
+
+ // Check updated balance through the delegated address
+ const updatedBalance = await context.viem().readContract({
+ address: delegatingAddress,
+ abi: contractAbi,
+ functionName: "getBalance",
+ args: [targetAddress],
+ });
+
+ expect(updatedBalance).to.equal(5500n);
+
+ console.log(`After increment: Balance is now ${updatedBalance}`);
+ console.log(`EIP-7702 delegation is working correctly!`);
+ },
+ });
+
+ it({
+ id: "T02",
+ title: "should reject EIP-7702 authorization with invalid nonce",
+ test: async () => {
+ const privateKey = generatePrivateKey();
+ const delegatingEOA = privateKeyToAccount(privateKey);
+
+ // Fund the EOA
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, 1000000000000000000n),
+ ]);
+
+ // Create authorization with incorrect nonce (using nonce 1 instead of 0)
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 1, // Wrong nonce - should be 0 for a fresh account
+ });
+
+ const callData = encodeFunctionData({
+ abi: contractAbi,
+ functionName: "setBalance",
+ args: ["0x1234567890123456789012345678901234567890", 1000n],
+ });
+
+ const transaction = {
+ to: delegatingEOA.address,
+ data: callData,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ };
+
+ const signature = await createViemTransaction(context, transaction);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ // Check that delegation did not occur due to invalid nonce
+ const codeAtDelegator = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+
+ // Code should be empty since authorization failed
+ expect(codeAtDelegator).toBeFalsy();
+ },
+ });
+
+ it({
+ id: "T03",
+ title: "delegation to zero address should reset the delegation",
+ test: async () => {
+ // First, create a delegation
+ const privateKey = generatePrivateKey();
+ const delegatingEOA = privateKeyToAccount(privateKey);
+ const delegatingAddress = delegatingEOA.address;
+ console.log(`Created EOA for delegation: ${delegatingAddress}`);
+
+ // Fund the delegating EOA with some balance from ALITH
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, 1000000000000000000n),
+ ]);
+
+ // Set up initial delegation
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ console.log(
+ `Authorization created for ${delegatingAddress} to delegate to ${contractAddress}`
+ );
+ console.log(`Authorization nonce: ${authorization.nonce}`);
+
+ // Create the authorization list
+ const authorizationList = [authorization];
+
+ // Use the delegation ABI from helpers
+
+ // Set balance for an arbitrary address
+ const targetAddress = "0x1234567890123456789012345678901234567890" as `0x${string}`;
+ const targetBalance = 1000n;
+
+ const callData = encodeFunctionData({
+ abi: contractAbi,
+ functionName: "setBalance",
+ args: [targetAddress, targetBalance],
+ });
+
+ // Create the transaction object with authorizationList
+ const transaction = {
+ to: delegatingAddress,
+ data: callData,
+ chainId: chainId,
+ authorizationList,
+ txnType: "eip7702" as const,
+ };
+
+ const signature = await createViemTransaction(context, transaction);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ expect(receipt.status).toBe("success");
+
+ // Verify delegation is set
+ const codeAfterDelegation = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(codeAfterDelegation?.startsWith("0xef0100")).toBe(true);
+ console.log(`Initial delegation code: ${codeAfterDelegation}`);
+
+ // Verify the delegated address can be called successfully
+ const initialBalance = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: contractAbi,
+ functionName: "getBalance",
+ args: ["0x1234567890123456789012345678901234567890"],
+ });
+ expect(initialBalance).toBe(1000n);
+ console.log(`Initial balance through delegation: ${initialBalance}`);
+
+ // Now clear the delegation by authorizing to zero address
+ const clearAuthorization = await delegatingEOA.signAuthorization({
+ contractAddress: "0x0000000000000000000000000000000000000000",
+ chainId: chainId,
+ nonce: 1, // Nonce should be incremented
+ });
+
+ // Create the authorization list
+ const clearAuthorizationList = [clearAuthorization];
+
+ const clearTransaction = {
+ to: "0x0000000000000000000000000000000000000000", // any address without code work
+ data: "0x",
+ chainId: chainId,
+ authorizationList: clearAuthorizationList,
+ txnType: "eip7702" as const,
+ };
+
+ const clearSignature = await createViemTransaction(context, clearTransaction);
+ const clearHash = await sendRawTransaction(context, clearSignature);
+ await context.createBlock();
+
+ const clearReceipt = await context.viem().getTransactionReceipt({ hash: clearHash });
+
+ expect(clearReceipt.status).toBe("success");
+
+ // Check that delegation should be cleared according to EIP-7702
+ const codeAfterClear = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ console.log(`Code after clearing attempt: ${codeAfterClear}`);
+
+ // According to EIP-7702, delegation to zero address should clear the code
+ if (codeAfterClear === "0x" || !codeAfterClear) {
+ console.log("✅ Delegation properly cleared to zero address");
+ // Try to call - should fail
+ await expect(
+ context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: contractAbi,
+ functionName: "getBalance",
+ args: ["0x1234567890123456789012345678901234567890"],
+ })
+ ).rejects.toThrow();
+ } else {
+ expect.fail("🐛 BUG: Delegation not properly cleared - code still present");
+ console.log(`Code after clear: ${codeAfterClear}`);
+
+ // Extract delegated address from the code
+ if (codeAfterClear.startsWith("0xef0100")) {
+ const delegatedAddress = "0x" + codeAfterClear.slice(8);
+ console.log(`Delegated address after clear: ${delegatedAddress}`);
+
+ // This should be zero address if clearing worked
+ if (delegatedAddress === "0x0000000000000000000000000000000000000000") {
+ console.log("✅ Delegation points to zero address (partial fix)");
+ } else {
+ expect.fail("🐛 BUG: Delegation still points to original contract");
+ }
+ }
+
+ // Try to call the delegated address
+ try {
+ const balanceAfterClear = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: contractAbi,
+ functionName: "getBalance",
+ args: ["0x1234567890123456789012345678901234567890"],
+ });
+ console.log(`🐛 BUG: Balance still accessible after clear: ${balanceAfterClear}`);
+ expect.fail("🐛 BUG: Balance still accessible after clear: ${balanceAfterClear}");
+ } catch (error) {
+ console.log("✅ Function calls properly fail after clearing");
+ }
+ }
+
+ expect(codeAfterClear).toBeFalsy();
+ },
+ });
+
+ it({
+ id: "T04",
+ title: "should reject authorization with mismatched chain ID",
+ test: async () => {
+ const privateKey = generatePrivateKey();
+ const delegatingEOA = privateKeyToAccount(privateKey);
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, 1000000000000000000n),
+ ]);
+
+ // Create authorization with wrong chain ID
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: 1, // Wrong chain ID (should be 1281)
+ nonce: 0,
+ });
+
+ const callData = encodeFunctionData({
+ abi: contractAbi,
+ functionName: "setBalance",
+ args: ["0x1234567890123456789012345678901234567890", 1000n],
+ });
+
+ const transaction = {
+ to: delegatingEOA.address,
+ data: callData,
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ };
+
+ const signature = await createViemTransaction(context, transaction);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ // Check that delegation did not occur due to chain ID mismatch
+ const codeAtDelegator = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+
+ // Code should be empty since authorization failed
+ expect(codeAtDelegator).toBeFalsy();
+ },
+ });
+ },
+});
diff --git a/test/suites/dev/common/test-eip7702/test-eip7702-invalid.ts b/test/suites/dev/common/test-eip7702/test-eip7702-invalid.ts
new file mode 100644
index 00000000000..59da7b3b808
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/test-eip7702-invalid.ts
@@ -0,0 +1,497 @@
+import "@moonbeam-network/api-augment";
+
+import { beforeAll, describeSuite, expect, deployCreateCompiledContract } from "@moonwall/cli";
+import { type Abi, parseEther } from "viem";
+import { sendRawTransaction } from "@moonwall/util";
+import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { createFundedAccount, createViemTransaction } from "./helpers";
+
+describeSuite({
+ id: "D020805",
+ title: "EIP-7702 Invalid Transaction Handling",
+ foundationMethods: "dev",
+ testCases: ({ context, it }) => {
+ let contractAddress: `0x${string}`;
+ let contractAbi: Abi;
+ let chainId: number;
+
+ beforeAll(async () => {
+ // Get the chainId from the RPC
+ chainId = await context.viem().getChainId();
+
+ const contract = await deployCreateCompiledContract(context, "Counter");
+ contractAddress = contract.contractAddress;
+ contractAbi = contract.abi;
+ });
+
+ it({
+ id: "T01",
+ title: "should reject empty authorization list properly",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const receiverAccount = privateKeyToAccount(generatePrivateKey());
+ // EIP-7702 transactions with empty authorization list should be valid
+ // but behave like regular transactions
+ const tx = {
+ to: receiverAccount.address,
+ data: "0x",
+ gas: 21000n,
+ chainId: chainId,
+ authorizationList: [],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const { result } = await context.createBlock(signature);
+
+ // EIP-7702 transactions with empty authorization list must be rejected
+ // The transaction should fail and not produce a hash
+ expect(result?.successful).toBe(false);
+ expect(result?.hash).toBeUndefined();
+ },
+ });
+
+ it({
+ id: "T02",
+ title: "should reject authorization with invalid signature (s > secp256k1n/2)",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ // Create a valid authorization first
+ const validAuth = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Manipulate the signature to have invalid s value
+ // s must be <= secp256k1n/2 for canonical signatures
+ // Note: This creates an authorization with mismatched signature
+ const invalidAuth = {
+ ...validAuth,
+ s: "0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1", // > n/2
+ };
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x",
+ chainId: chainId,
+ authorizationList: [invalidAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Check that delegation was not set
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(code).toBeFalsy();
+
+ // Verify transaction succeeded but authorization was invalid
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ },
+ });
+
+ it({
+ id: "T03",
+ title: "should reject authorization with invalid chain ID",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ // Try to create authorization with invalid chain ID (different from tx chain ID)
+ // This should cause authorization to be invalid due to chain ID mismatch
+ const wrongChainId = 999999; // Wrong chain ID
+
+ const invalidAuth = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: wrongChainId,
+ nonce: 0,
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x",
+ chainId: chainId,
+ authorizationList: [invalidAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Delegation should not be set due to chain ID mismatch
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(code).toBeFalsy();
+
+ // Verify transaction succeeded but authorization was invalid
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ },
+ });
+
+ it({
+ id: "T04",
+ title: "should reject authorization with nonce overflow",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ // Try with wrong nonce (should be 0 for first delegation, use 1 instead)
+ const wrongNonce = 1;
+
+ const invalidAuth = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: wrongNonce,
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x" as `0x${string}`,
+ chainId: chainId,
+ authorizationList: [invalidAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Delegation should not be set due to wrong nonce
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(code).toBeFalsy();
+
+ // Verify transaction succeeded but authorization was invalid
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ },
+ });
+
+ it({
+ id: "T05",
+ title: "should handle authorization with zero address",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ // Create authorization with invalid contract address (not 20 bytes)
+ const validAuth = await delegatingEOA.signAuthorization({
+ contractAddress: "0x0000000000000000000000000000000000000000" as `0x${string}`, // Zero address
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x" as `0x${string}`,
+ chainId: chainId,
+ authorizationList: [validAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Delegation may be set even with zero address - this is actually valid behavior
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ // Zero address delegation is actually allowed in the spec, but resets the delegation to empty code
+ expect(code).toBeFalsy();
+
+ // Verify transaction result - may revert when calling zero address delegation
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ // Transaction may revert when calling zero address after delegation
+ expect(["success", "reverted"]).toContain(receipt.status);
+ },
+ });
+
+ it({
+ id: "T06",
+ title: "should handle authorization with EOA address",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ // Sign authorization with EOA address directly
+ const eoaAuth = await delegatingEOA.signAuthorization({
+ contractAddress: sender.account.address, // Use EOA address instead of contract
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ value: 1000n, // Send some value instead of calling
+ chainId: chainId,
+ authorizationList: [eoaAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Verify transaction result - may revert when calling EOA after delegation
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ // Transaction may revert when calling EOA after delegation
+ expect(["success", "reverted"]).toContain(receipt.status);
+
+ // Check that delegation was set (EOA can be delegated to)
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ // EOA delegation should work, so code should be set
+ if (code && code !== "0x") {
+ expect(code.startsWith("0xef0100")).toBe(true);
+ }
+ },
+ });
+
+ it({
+ id: "T07",
+ title: "should reject authorization with invalid signature",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ // Create a valid authorization first
+ const validAuth = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Create auth with wrong signature (manipulate r value to make signature invalid)
+ // Note: This creates an authorization with mismatched signature
+ const invalidAuth = {
+ ...validAuth,
+ r: "0x1111111111111111111111111111111111111111111111111111111111111111", // Wrong r value
+ };
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x",
+ chainId: chainId,
+ authorizationList: [invalidAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Delegation should not be set due to invalid signature
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(code).toBeFalsy();
+
+ // Verify transaction succeeded but authorization was invalid
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ },
+ });
+
+ it({
+ id: "T08",
+ title: "should reject duplicate authorizations in same transaction",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ const auth = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Include the same authorization twice
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x",
+ chainId: chainId,
+ authorizationList: [auth, auth], // Duplicate
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // First authorization should succeed, second should be ignored
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ // Transaction may succeed but only one delegation should be set
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+
+ if (code) {
+ expect(code.startsWith("0xef0100")).toBe(true);
+ console.log("First authorization succeeded, duplicate ignored");
+ }
+ },
+ });
+
+ it({
+ id: "T09",
+ title: "should reject authorization with zero r value",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ // Create a valid authorization first
+ const validAuth = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Invalid signature with r = 0
+ // Note: This creates an authorization with mismatched signature
+ const invalidAuth = {
+ ...validAuth,
+ r: "0x0000000000000000000000000000000000000000000000000000000000000000",
+ };
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x",
+ chainId: chainId,
+ authorizationList: [invalidAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Invalid signature with zero r should not set delegation
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(code).toBeFalsy();
+
+ // Verify transaction succeeded but authorization was invalid
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ },
+ });
+
+ it({
+ id: "T10",
+ title: "should reject authorization with zero s value",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ // Create a valid authorization first
+ const validAuth = await delegatingEOA.signAuthorization({
+ contractAddress: contractAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Invalid signature with s = 0
+ // Note: This creates an authorization with mismatched signature
+ const invalidAuth = {
+ ...validAuth,
+ s: "0x0000000000000000000000000000000000000000000000000000000000000000",
+ };
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: "0x",
+ chainId: chainId,
+ authorizationList: [invalidAuth],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Invalid signature with zero s should not set delegation
+ const code = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(code).toBeFalsy();
+
+ // Verify transaction succeeded but authorization was invalid
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ },
+ });
+ },
+});
diff --git a/test/suites/dev/common/test-eip7702/test-eip7702-self-delegation.ts b/test/suites/dev/common/test-eip7702/test-eip7702-self-delegation.ts
new file mode 100644
index 00000000000..39cfcce4e54
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/test-eip7702-self-delegation.ts
@@ -0,0 +1,121 @@
+import "@moonbeam-network/api-augment";
+import { beforeAll, describeSuite, expect, deployCreateCompiledContract } from "@moonwall/cli";
+import { encodeFunctionData, type Abi, parseEther } from "viem";
+import { sendRawTransaction } from "@moonwall/util";
+import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { createViemTransaction } from "./helpers";
+
+describeSuite({
+ id: "D020806",
+ title: "EIP-7702 Self-Delegation Test",
+ foundationMethods: "dev",
+ testCases: ({ context, it }) => {
+ let counterAddress: `0x${string}`;
+ let counterAbi: Abi;
+ let chainId: number;
+
+ beforeAll(async () => {
+ // Get the chainId from the RPC
+ chainId = await context.viem().getChainId();
+
+ const counter = await deployCreateCompiledContract(context, "Counter");
+ counterAddress = counter.contractAddress;
+ counterAbi = counter.abi;
+ });
+
+ it({
+ id: "T01",
+ title: "should test gas cost for self-delegation with correct nonce",
+ test: async () => {
+ // Check counter was incremented
+ const init_count = await context.viem().readContract({
+ address: counterAddress,
+ abi: counterAbi,
+ functionName: "count",
+ args: [],
+ });
+ expect(init_count).toBe(0n);
+
+ const eoaPrivateKey = generatePrivateKey();
+ const selfDelegatingEOA = privateKeyToAccount(eoaPrivateKey);
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(selfDelegatingEOA.address, parseEther("5")),
+ ]);
+
+ // Self-authorization (EOA delegates to a contract on behalf of itself)
+ // In EIP-7702, when the authorizing address is the same as the sender,
+ // the authorization nonce should be current_nonce + 1 because the EVM
+ // increments the nonce before processing the authorization list
+ const currentNonce = await context.viem().getTransactionCount({
+ address: selfDelegatingEOA.address,
+ });
+
+ console.log(`Self-delegating EOA current nonce: ${currentNonce}`);
+
+ const selfAuth = await selfDelegatingEOA.signAuthorization({
+ contractAddress: counterAddress,
+ chainId: chainId,
+ nonce: currentNonce + 1, // current_nonce + 1 for self-authorizing transactions
+ });
+
+ console.log(`Authorization created with nonce: ${selfAuth.nonce}`);
+
+ // Transaction sent by the same EOA that signed the authorization
+ const selfTx = {
+ to: selfDelegatingEOA.address,
+ data: encodeFunctionData({
+ abi: counterAbi,
+ functionName: "increment",
+ args: [],
+ }),
+ nonce: currentNonce, // Current nonce for the transaction
+ chainId: chainId,
+ authorizationList: [selfAuth],
+ txnType: "eip7702" as const,
+ privateKey: eoaPrivateKey,
+ };
+
+ console.log(`Transaction will be sent with nonce: ${selfTx.nonce}`);
+
+ // Send the self-signed transaction directly
+ const signedTx = await createViemTransaction(context, selfTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ console.log(`Transaction signed, sending to network...`);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ console.log(`Self-delegation gas used: ${receipt.gasUsed}`);
+
+ // Verify delegation was set
+ const code = await context.viem().getCode({
+ address: selfDelegatingEOA.address,
+ });
+ expect(code).toBeDefined();
+ expect(code?.startsWith("0xef0100")).toBe(true);
+
+ console.log(`Delegation code set: ${code}`);
+
+ // Check counter was incremented
+ const count = await context.viem().readContract({
+ address: selfDelegatingEOA.address,
+ abi: counterAbi,
+ functionName: "count",
+ args: [],
+ });
+ expect(count).toBe((init_count as bigint) + 1n);
+
+ console.log(`Counter value through delegation: ${count}`);
+ console.log(`✅ Self-delegation test passed!`);
+ },
+ });
+ },
+});
diff --git a/test/suites/dev/common/test-eip7702/test-eip7702-setcode.ts b/test/suites/dev/common/test-eip7702/test-eip7702-setcode.ts
new file mode 100644
index 00000000000..c3861f7ea33
--- /dev/null
+++ b/test/suites/dev/common/test-eip7702/test-eip7702-setcode.ts
@@ -0,0 +1,898 @@
+import "@moonbeam-network/api-augment";
+import { beforeAll, describeSuite, expect, deployCreateCompiledContract } from "@moonwall/cli";
+import { sendRawTransaction } from "@moonwall/util";
+import { encodeFunctionData, type Abi, parseEther, parseGwei, keccak256 } from "viem";
+import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
+import { createFundedAccount, createViemTransaction } from "./helpers";
+
+describeSuite({
+ id: "D020807",
+ title: "EIP-7702 Core Set-Code Transaction Tests",
+ foundationMethods: "dev",
+ testCases: ({ context, it }) => {
+ let storageWriterAddress: `0x${string}`;
+ let storageWriterAbi: Abi;
+ let transientStorageAddress: `0x${string}`;
+ let transientStorageAbi: Abi;
+ let selfDestructorAddress: `0x${string}`;
+ let selfDestructorAbi: Abi;
+ let contractCreatorAddress: `0x${string}`;
+ let contractCreatorAbi: Abi;
+ let callerAddress: `0x${string}`;
+ let callerAbi: Abi;
+ let reentrantCallerAddress: `0x${string}`;
+ let reentrantCallerAbi: Abi;
+ let chainId: number;
+
+ beforeAll(async () => {
+ // Get the chainId from the RPC
+ chainId = await context.viem().getChainId();
+
+ // Deploy all test contracts
+ const storageWriter = await deployCreateCompiledContract(context, "StorageWriter");
+ storageWriterAddress = storageWriter.contractAddress;
+ storageWriterAbi = storageWriter.abi;
+
+ const transientStorage = await deployCreateCompiledContract(context, "TransientStorage");
+ transientStorageAddress = transientStorage.contractAddress;
+ transientStorageAbi = transientStorage.abi;
+
+ const selfDestructor = await deployCreateCompiledContract(context, "SelfDestructor");
+ selfDestructorAddress = selfDestructor.contractAddress;
+ selfDestructorAbi = selfDestructor.abi;
+
+ const contractCreator = await deployCreateCompiledContract(context, "ContractCreator");
+ contractCreatorAddress = contractCreator.contractAddress;
+ contractCreatorAbi = contractCreator.abi;
+
+ const caller = await deployCreateCompiledContract(context, "Caller");
+ callerAddress = caller.contractAddress;
+ callerAbi = caller.abi;
+
+ const reentrantCaller = await deployCreateCompiledContract(context, "ReentrantCaller");
+ reentrantCallerAddress = reentrantCaller.contractAddress;
+ reentrantCallerAbi = reentrantCaller.abi;
+ });
+
+ it({
+ id: "T01",
+ title: "should handle set-code transaction with self-authorization",
+ test: async () => {
+ const selfSponsor = await createFundedAccount(context);
+
+ // Fund the self-sponsoring account
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(selfSponsor.account.address, parseEther("10")),
+ ]);
+
+ // Self-sponsor: account signs authorization and sends transaction
+ const authorization = await selfSponsor.account.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 1,
+ });
+
+ const callData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [1n, 42n],
+ });
+
+ const tx = {
+ to: selfSponsor.account.address, // Sending to self
+ data: callData,
+
+ nonce: 0, // First transaction from this account
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: selfSponsor.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, tx);
+ console.log("Signed transaction:", signedTx);
+
+ const hash = await sendRawTransaction(context, signedTx);
+ console.log(`Transaction signed, sending to network...`);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+ console.log("Transaction receipt:", receipt);
+
+ expect(receipt.status).toBe("success");
+
+ expect(receipt.status).toBe("success");
+
+ // Verify delegation was set
+ const code = await context.viem().getCode({
+ address: selfSponsor.account.address,
+ });
+ expect(code).toBeDefined();
+ expect(code?.startsWith("0xef0100")).toBe(true);
+
+ // Verify storage was written
+ const storedValue = await context.viem().readContract({
+ address: selfSponsor.account.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [1n],
+ });
+ expect(storedValue).toBe(42n);
+ },
+ });
+
+ it({
+ id: "T02",
+ title: "should execute simple SSTORE through set-code",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = privateKeyToAccount(generatePrivateKey());
+
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(delegatingEOA.address, parseEther("1")),
+ ]);
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const callData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [100n, 999n],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+
+ // Verify storage was written
+ const storedValue = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [100n],
+ });
+ expect(storedValue).toBe(999n);
+ },
+ });
+
+ it({
+ id: "T03",
+ title: "should handle set-code with existing storage and non-zero nonce",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const existingEOAPrivateKey = generatePrivateKey();
+ const existingEOA = privateKeyToAccount(existingEOAPrivateKey);
+
+ // Fund and use the account first
+ await context.createBlock([
+ context
+ .polkadotJs()
+ .tx.balances.transferAllowDeath(existingEOA.address, parseEther("10")),
+ ]);
+
+ // Make a transaction to increase nonce
+ {
+ const dummyTx = {
+ to: "0x1234567890123456789012345678901234567890",
+ chainId: chainId,
+ privateKey: existingEOAPrivateKey,
+ };
+
+ const signature = await createViemTransaction(context, dummyTx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ }
+
+ // Now the account has nonce = 1
+ const currentNonce = await context.viem().getTransactionCount({
+ address: existingEOA.address,
+ });
+ expect(currentNonce).toBe(1);
+
+ // Set code with non-zero nonce account
+ // In some implementations, authorization nonce might need to match account nonce
+ const authNonce = await context.viem().getTransactionCount({
+ address: existingEOA.address,
+ });
+ const authorization = await existingEOA.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: authNonce, // Try using current account nonce for authorization
+ });
+
+ const callData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [5n, 555n],
+ });
+
+ const tx = {
+ to: existingEOA.address,
+ data: callData,
+
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ expect(receipt.status).toBe("success");
+
+ // Verify delegation was set despite non-zero account nonce
+ const code = await context.viem().getCode({
+ address: existingEOA.address,
+ });
+ expect(code).toBeDefined();
+ expect(code?.startsWith("0xef0100")).toBe(true);
+
+ // Verify storage
+ const storedValue = await context.viem().readContract({
+ address: existingEOA.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [5n],
+ });
+ expect(storedValue).toBe(555n);
+ },
+ });
+
+ it({
+ id: "T04",
+ title: "should handle SSTORE then SLOAD in separate transactions",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // First transaction: SSTORE
+ const storeTx = {
+ to: delegatingEOA.address,
+ data: encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [20n, 200n],
+ }),
+
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, storeTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Second transaction: SLOAD (no authorization needed, already delegated)
+ const loadTx = {
+ to: delegatingEOA.address,
+ data: encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [20n],
+ }),
+
+ chainId: chainId,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, loadTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+ }
+
+ // Decode the return value from the transaction
+ // The load function should return the stored value (200n)
+ // Note: For view functions called via transactions, the return value might not be directly accessible
+ // We can verify it through a static call instead
+ const loadedValue = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [20n],
+ });
+ expect(loadedValue).toBe(200n);
+ },
+ });
+
+ it({
+ id: "T05",
+ title: "should handle TSTORE with re-entry to TLOAD",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: transientStorageAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Store and load transient storage in same transaction
+ const callData = encodeFunctionData({
+ abi: transientStorageAbi,
+ functionName: "storeAndLoad",
+ args: [1n, 12345n],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+ },
+ });
+
+ it({
+ id: "T06",
+ title: "should execute SELFDESTRUCT in delegated context",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+ const recipient = privateKeyToAccount(generatePrivateKey());
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: selfDestructorAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const initialDelegatingBalance = await context.viem().getBalance({
+ address: delegatingEOA.address,
+ });
+
+ const initialRecipientBalance = await context.viem().getBalance({
+ address: recipient.address,
+ });
+
+ // Execute selfdestruct
+ const callData = encodeFunctionData({
+ abi: selfDestructorAbi,
+ functionName: "destruct",
+ args: [recipient.address],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+
+ // After EIP-6780, SELFDESTRUCT only transfers balance in same transaction
+ // Account should still exist with delegation
+ const codeAfter = await context.viem().getCode({
+ address: delegatingEOA.address,
+ });
+ expect(codeAfter?.startsWith("0xef0100")).toBe(true);
+
+ // Check balances after SELFDESTRUCT
+ const finalDelegatingBalance = await context.viem().getBalance({
+ address: delegatingEOA.address,
+ });
+ const finalRecipientBalance = await context.viem().getBalance({
+ address: recipient.address,
+ });
+
+ // The delegatingEOA is not paying for gas - senderAccount is
+ // So the entire balance of delegatingEOA should be transferred to recipient
+ // Note: After EIP-6780, SELFDESTRUCT only transfers balance but doesn't destroy the account
+
+ // Assert that recipient received ALL funds from delegatingEOA
+ expect(finalRecipientBalance).toBe(initialRecipientBalance + initialDelegatingBalance);
+
+ // Assert that delegating EOA's balance is now zero (all transferred)
+ expect(finalDelegatingBalance).toBe(0n);
+
+ console.log(
+ `Balance transfer: ${initialDelegatingBalance} wei (from ${delegatingEOA.address} to ${recipient.address})`
+ );
+ },
+ });
+
+ it({
+ id: "T07",
+ title: "should handle contract creation opcodes (CREATE, CREATE2)",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: contractCreatorAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Test CREATE opcode
+ const createCallData = encodeFunctionData({
+ abi: contractCreatorAbi,
+ functionName: "createContract",
+ args: [],
+ });
+
+ const createTx = {
+ to: delegatingEOA.address,
+ data: createCallData,
+
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, createTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Check logs for ContractCreated event
+ console.log(`Contract created via CREATE opcode`);
+ // Indexed address parameter
+ const createdAddress = receipt.logs[0].topics[1];
+ expect(createdAddress).toBeDefined();
+ // Should be a 32-byte hex string
+ expect(createdAddress).toMatch(/^0x[0-9a-fA-F]{64}$/);
+
+ // Test CREATE2 opcode
+ const salt = keccak256("0x1234");
+ const create2CallData = encodeFunctionData({
+ abi: contractCreatorAbi,
+ functionName: "createContract2",
+ args: [salt],
+ });
+
+ const create2Tx = {
+ to: delegatingEOA.address,
+ data: create2CallData,
+ chainId: chainId,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, create2Tx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Check logs for ContractCreated event from CREATE2
+ const created2Address = receipt.logs[0].topics[1]; // Indexed address parameter
+ expect(created2Address).toBeDefined();
+ expect(created2Address).toMatch(/^0x[0-9a-fA-F]{64}$/); // Should be a 32-byte hex string
+ }
+ },
+ });
+
+ it({
+ id: "T08",
+ title: "should handle re-entry until max call stack depth",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const delegatingEOA = (await createFundedAccount(context)).account;
+
+ const authorization = await delegatingEOA.signAuthorization({
+ contractAddress: reentrantCallerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Try to reach max depth (1024 in EVM)
+ // We'll test with a smaller depth to avoid gas issues
+ const targetDepth = 64n;
+
+ const callData = encodeFunctionData({
+ abi: reentrantCallerAbi,
+ functionName: "reenter",
+ args: [delegatingEOA.address, targetDepth],
+ });
+
+ const tx = {
+ to: delegatingEOA.address,
+ data: callData,
+
+ chainId: chainId,
+ authorizationList: [authorization],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ // Check if transaction succeeded or failed due to stack depth
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+
+ console.log(`Re-entry test status: ${receipt.status}`);
+
+ // With depth 64, should succeed
+ expect(receipt.status).toBe("success");
+
+ // Verify the contract reached the expected depth
+ // The depth state variable should show the maximum depth reached
+ const maxDepthReached = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: reentrantCallerAbi,
+ functionName: "maxDepth",
+ args: [],
+ });
+ expect(maxDepthReached).toBe(targetDepth);
+
+ // The depth should be back to 0 after completion
+ const currentDepth = await context.viem().readContract({
+ address: delegatingEOA.address,
+ abi: reentrantCallerAbi,
+ functionName: "depth",
+ args: [],
+ });
+ expect(currentDepth).toBe(0n);
+ },
+ });
+
+ it({
+ id: "T09",
+ title: "should handle cross-delegation calls between set-code accounts",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const eoa1 = (await createFundedAccount(context)).account;
+ const eoa2 = (await createFundedAccount(context)).account;
+
+ // EOA1 delegates to caller contract
+ const auth1 = await eoa1.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // EOA2 delegates to storage writer
+ const auth2 = await eoa2.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Set up both delegations
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ data: "0x" as `0x${string}`,
+ chainId: chainId,
+ authorizationList: [auth1, auth2],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Now EOA1 (delegated to caller) calls EOA2 (delegated to storage writer)
+ const storeData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [50n, 500n],
+ });
+
+ const crossCallData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "callAddress",
+ args: [eoa2.address, storeData],
+ });
+
+ const crossCallTx = {
+ to: eoa1.address,
+ data: crossCallData,
+
+ chainId: chainId,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, crossCallTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+ }
+
+ // Verify storage was written in EOA2's context
+ const storedValue = await context.viem().readContract({
+ address: eoa2.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [50n],
+ });
+ expect(storedValue).toBe(500n);
+ },
+ });
+
+ it({
+ id: "T10",
+ title: "should handle nested calls/delegations",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const eoa1 = (await createFundedAccount(context)).account;
+ const eoa2 = (await createFundedAccount(context)).account;
+
+ // Set up delegation chain:
+ // EOA1 delegates to Caller contract (which can call other addresses)
+ // EOA2 delegates to StorageWriter contract
+ const auth1 = await eoa1.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth2 = await eoa2.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Set up both delegations in a single transaction
+ const setupTx = {
+ to: "0x0000000000000000000000000000000000000000", // Any recipient wihout code should work
+ data: "0x" as `0x${string}`,
+ chainId: chainId,
+ authorizationList: [auth1, auth2],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signedTx = await createViemTransaction(context, setupTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+
+ // Verify both delegations are set
+ const code1 = await context.viem().getCode({ address: eoa1.address });
+ const code2 = await context.viem().getCode({ address: eoa2.address });
+
+ expect(code1?.startsWith("0xef0100")).toBe(true);
+ expect(code2?.startsWith("0xef0100")).toBe(true);
+
+ // Prepare the nested call: EOA2.store(42, 1337)
+ const storeData = encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [42n, 1337n],
+ });
+
+ // Call EOA1 (as Caller) to call EOA2 with the store data
+ const callData = encodeFunctionData({
+ abi: callerAbi,
+ functionName: "callAddress",
+ args: [eoa2.address, storeData],
+ });
+
+ const chainCallTx = {
+ to: eoa1.address,
+ data: callData,
+
+ chainId: chainId,
+ };
+
+ {
+ const signedTx = await createViemTransaction(context, chainCallTx);
+ const hash = await sendRawTransaction(context, signedTx);
+ await context.createBlock();
+
+ // Get transaction receipt to check for events and status
+ const receipt = await context.viem().getTransactionReceipt({
+ hash,
+ });
+
+ expect(receipt.status).toBe("success");
+ }
+
+ // Verify that storage was written in EOA2's context
+ // This proves that EOA2 executed StorageWriter code, not followed another chain
+ const storedValue = await context.viem().readContract({
+ address: eoa2.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [42n],
+ });
+ expect(storedValue).toBe(1337n);
+
+ // Also verify that EOA1 doesn't have this storage
+ // EOA1 is delegated to Caller, not StorageWriter, so trying to call
+ // StorageWriter functions on it should fail
+ try {
+ await context.viem().readContract({
+ address: eoa1.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [42n],
+ });
+ // If we get here, the test should fail
+ expect(true).toBe(false);
+ } catch (error) {
+ // Expected to fail since EOA1 has Caller code, not StorageWriter
+ expect(error).toBeDefined();
+ expect(error.message).toContain("Contract does not have fallback nor receive functions");
+ }
+
+ console.log("Verified: Delegated calls do not follow chains");
+ },
+ });
+
+ it({
+ id: "T11",
+ title: "should handle multiple authorizations in single transaction",
+ test: async () => {
+ const sender = await createFundedAccount(context);
+ const eoa1 = (await createFundedAccount(context)).account;
+ const eoa2 = (await createFundedAccount(context)).account;
+ const eoa3 = (await createFundedAccount(context)).account;
+ const eoa4 = (await createFundedAccount(context)).account;
+
+ // Create multiple authorizations to different contracts
+ const auth1 = await eoa1.signAuthorization({
+ contractAddress: storageWriterAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth2 = await eoa2.signAuthorization({
+ contractAddress: callerAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth3 = await eoa3.signAuthorization({
+ contractAddress: transientStorageAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ const auth4 = await eoa4.signAuthorization({
+ contractAddress: contractCreatorAddress,
+ chainId: chainId,
+ nonce: 0,
+ });
+
+ // Send transaction with all authorizations
+ const tx = {
+ to: eoa1.address,
+ data: encodeFunctionData({
+ abi: storageWriterAbi,
+ functionName: "store",
+ args: [1n, 100n],
+ }),
+
+ chainId: chainId,
+ authorizationList: [auth1, auth2, auth3, auth4],
+ txnType: "eip7702" as const,
+ privateKey: sender.privateKey,
+ };
+
+ const signature = await createViemTransaction(context, tx);
+ const hash = await sendRawTransaction(context, signature);
+ await context.createBlock();
+
+ const receipt = await context.viem().getTransactionReceipt({ hash });
+ expect(receipt.status).toBe("success");
+
+ // Verify all delegations were set
+ const code1 = await context.viem().getCode({ address: eoa1.address });
+ const code2 = await context.viem().getCode({ address: eoa2.address });
+ const code3 = await context.viem().getCode({ address: eoa3.address });
+ const code4 = await context.viem().getCode({ address: eoa4.address });
+
+ expect(code1?.startsWith("0xef0100")).toBe(true);
+ expect(code2?.startsWith("0xef0100")).toBe(true);
+ expect(code3?.startsWith("0xef0100")).toBe(true);
+ expect(code4?.startsWith("0xef0100")).toBe(true);
+
+ // Verify the actual call succeeded
+ const storedValue = await context.viem().readContract({
+ address: eoa1.address,
+ abi: storageWriterAbi,
+ functionName: "load",
+ args: [1n],
+ });
+ expect(storedValue).toBe(100n);
+ },
+ });
+ },
+});
diff --git a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-10.ts b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-10.ts
index c69762904d4..34c46af64ed 100644
--- a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-10.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-10.ts
@@ -10,7 +10,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D010706",
+ id: "D010701",
title: "Mock XCM - transact ETHEREUM input size check fails",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-4.ts b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-4.ts
index a5484f46fd5..303dda534b5 100644
--- a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-4.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-4.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D010708",
+ id: "D010702",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-5.ts b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-5.ts
index b6d260dd944..2a8d19b9d6a 100644
--- a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-5.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-5.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D010709",
+ id: "D010703",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-6.ts b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-6.ts
index 3ee288a044e..fefd8f9936c 100644
--- a/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-6.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-mock-hrmp-transact-ethereum-6.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers/constants.js";
describeSuite({
- id: "D010710",
+ id: "D010704",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer-two-ERC20.ts b/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer-two-ERC20.ts
index 85b96737563..182e844f372 100644
--- a/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer-two-ERC20.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer-two-ERC20.ts
@@ -13,7 +13,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D010711",
+ id: "D010705",
title: "Mock XCM - Send two local ERC20",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer.ts b/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer.ts
index bf28b59f54c..36ef7045fc8 100644
--- a/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-xcm-erc20-transfer.ts
@@ -14,7 +14,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D010712",
+ id: "D010706",
title: "Mock XCM - Send local erc20",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/common/test-xcm-v5/test-xcm-location-to-account-api.ts b/test/suites/dev/common/test-xcm-v5/test-xcm-location-to-account-api.ts
index 9011bc38389..d850df3a1cc 100644
--- a/test/suites/dev/common/test-xcm-v5/test-xcm-location-to-account-api.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-xcm-location-to-account-api.ts
@@ -2,7 +2,7 @@ import { describeSuite, expect } from "@moonwall/cli";
import { RELAY_V3_SOURCE_LOCATION } from "../../../../helpers/assets";
describeSuite({
- id: "D010713",
+ id: "D010707",
title: "XCM - LocationToAccountApi",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/common/test-xcm-v5/test-xcm-payment-api-transact-native.ts b/test/suites/dev/common/test-xcm-v5/test-xcm-payment-api-transact-native.ts
index fca451e8d0a..250ac9028c1 100644
--- a/test/suites/dev/common/test-xcm-v5/test-xcm-payment-api-transact-native.ts
+++ b/test/suites/dev/common/test-xcm-v5/test-xcm-payment-api-transact-native.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D010714",
+ id: "D010708",
title: "XCM - XcmPaymentApi - Transact",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/common/test-xcm/test-xcm-allowed-instructions.ts b/test/suites/dev/common/test-xcm/test-xcm-allowed-instructions.ts
index 118a044a80b..5439a8ffbb0 100644
--- a/test/suites/dev/common/test-xcm/test-xcm-allowed-instructions.ts
+++ b/test/suites/dev/common/test-xcm/test-xcm-allowed-instructions.ts
@@ -16,7 +16,7 @@ import type { ApiPromise } from "@polkadot/api";
// the important thing (and what we are testing) is that they are
// executed and are not blocked with 'WeightNotComputable' due to using max weight.
describeSuite({
- id: "D017000",
+ id: "D010602",
title: "XCM - Max Weight Instructions",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/sample/sample_basic.ts b/test/suites/dev/moonbase/sample/sample_basic.ts
index 33d925f0eb3..028e646635b 100644
--- a/test/suites/dev/moonbase/sample/sample_basic.ts
+++ b/test/suites/dev/moonbase/sample/sample_basic.ts
@@ -5,7 +5,7 @@ import { BN } from "@polkadot/util";
import type { ApiPromise } from "@polkadot/api";
describeSuite({
- id: "D024401",
+ id: "D024501",
title: "Dev test suite",
foundationMethods: "dev",
testCases: ({ it, context, log }) => {
diff --git a/test/suites/dev/moonbase/test-contract/test-self-destruct.ts b/test/suites/dev/moonbase/test-contract/test-self-destruct.ts
index b974abc4d64..c22d06046a0 100644
--- a/test/suites/dev/moonbase/test-contract/test-self-destruct.ts
+++ b/test/suites/dev/moonbase/test-contract/test-self-destruct.ts
@@ -3,7 +3,7 @@ import { createEthersTransaction } from "@moonwall/util";
import { encodeFunctionData } from "viem";
describeSuite({
- id: "D020512",
+ id: "D020513",
title: "Test self-destruct contract",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-eth-call/test-eth-call-state-override.ts b/test/suites/dev/moonbase/test-eth-call/test-eth-call-state-override.ts
index 2752d8ccb62..59e26ac996d 100644
--- a/test/suites/dev/moonbase/test-eth-call/test-eth-call-state-override.ts
+++ b/test/suites/dev/moonbase/test-eth-call/test-eth-call-state-override.ts
@@ -13,7 +13,7 @@ import { encodeFunctionData, encodePacked, keccak256, pad, parseEther, type Abi
import { expectOk } from "../../../../helpers";
describeSuite({
- id: "D020801",
+ id: "D020901",
title: "Call - State Override",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-fee/test-eth-fee-history.ts b/test/suites/dev/moonbase/test-eth-fee/test-eth-fee-history.ts
index 035be105e8a..fac533209f2 100644
--- a/test/suites/dev/moonbase/test-eth-fee/test-eth-fee-history.ts
+++ b/test/suites/dev/moonbase/test-eth-fee/test-eth-fee-history.ts
@@ -7,7 +7,7 @@ import { parseGwei } from "viem";
// We use ethers library in this test as apparently web3js's types are not fully EIP-1559
// compliant yet.
describeSuite({
- id: "D020901",
+ id: "D021001",
title: "Fee History",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-fee/test-eth-paysFee.ts b/test/suites/dev/moonbase/test-eth-fee/test-eth-paysFee.ts
index 28ce7c49656..67b9828b48e 100644
--- a/test/suites/dev/moonbase/test-eth-fee/test-eth-paysFee.ts
+++ b/test/suites/dev/moonbase/test-eth-fee/test-eth-paysFee.ts
@@ -5,7 +5,7 @@ import { BALTATHAR_ADDRESS, GLMR, createRawTransfer } from "@moonwall/util";
// We use ethers library in this test as apparently web3js's types are not fully EIP-1559
// compliant yet.
describeSuite({
- id: "D020902",
+ id: "D021002",
title: "Ethereum - PaysFee",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-fee/test-eth-txn-weights.ts b/test/suites/dev/moonbase/test-eth-fee/test-eth-txn-weights.ts
index 62802ebb675..83fcc0d14c2 100644
--- a/test/suites/dev/moonbase/test-eth-fee/test-eth-txn-weights.ts
+++ b/test/suites/dev/moonbase/test-eth-fee/test-eth-txn-weights.ts
@@ -19,7 +19,7 @@ import {
// GasToWeight by gas_price, but does not adjust this afterwards. This leads to accounting for too
// much weight in a block.
describeSuite({
- id: "D020903",
+ id: "D021003",
title: "Ethereum Weight Accounting",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-discard.ts b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-discard.ts
index deb53196857..331fce3139a 100644
--- a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-discard.ts
+++ b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-discard.ts
@@ -1,7 +1,7 @@
import { describeSuite, expect, customDevRpcRequest } from "@moonwall/cli";
describeSuite({
- id: "D021001",
+ id: "D021101",
title: "Transaction Cost discards",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-error.ts b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-error.ts
index 4bc5f80e165..ca54e68f9ba 100644
--- a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-error.ts
+++ b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-error.ts
@@ -16,7 +16,7 @@ import { ALITH_GENESIS_TRANSFERABLE_BALANCE, ConstantStore } from "../../../../h
import { UNIT } from "../test-parameters/test-parameters";
describeSuite({
- id: "D021002",
+ id: "D021102",
title: "Ethereum Rpc pool errors",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-multiple.ts b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-multiple.ts
index 9aaf0e4889e..3b3d37abe7b 100644
--- a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-multiple.ts
+++ b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-multiple.ts
@@ -14,7 +14,7 @@ import { encodeDeployData } from "viem";
*/
describeSuite({
- id: "D021003",
+ id: "D021103",
title: "EthPool - Multiple pending transactions",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-nonce-future.ts b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-nonce-future.ts
index d6a133d2660..8f3c3bfc8c8 100644
--- a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-nonce-future.ts
+++ b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-nonce-future.ts
@@ -11,7 +11,7 @@ import {
import { encodeDeployData } from "viem";
describeSuite({
- id: "D021004",
+ id: "D021104",
title: "EthPool - Future Ethereum transaction",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-resubmit-txn.ts b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-resubmit-txn.ts
index 9ba5cd12328..1ebc2a56535 100644
--- a/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-resubmit-txn.ts
+++ b/test/suites/dev/moonbase/test-eth-pool/test-eth-pool-resubmit-txn.ts
@@ -10,7 +10,7 @@ import { parseGwei } from "viem";
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
describeSuite({
- id: "D021005",
+ id: "D021105",
title: "Resubmit transations",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-constants.ts b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-constants.ts
index b73b0f1677a..8f14960fbb3 100644
--- a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-constants.ts
+++ b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-constants.ts
@@ -1,7 +1,7 @@
import { describeSuite, expect, customDevRpcRequest } from "@moonwall/cli";
describeSuite({
- id: "D021101",
+ id: "D021201",
title: "RPC Constants",
foundationMethods: "dev",
testCases: ({ it, context }) => {
diff --git a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-deprecated.ts b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-deprecated.ts
index 7e93f7058c2..e833e23c12b 100644
--- a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-deprecated.ts
+++ b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-deprecated.ts
@@ -2,7 +2,7 @@ import "@moonbeam-network/api-augment";
import { describeSuite, expect, customDevRpcRequest } from "@moonwall/cli";
describeSuite({
- id: "D021102",
+ id: "D021202",
title: "Deprecated RPC",
foundationMethods: "dev",
testCases: ({ it }) => {
diff --git a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-log-filtering.ts b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-log-filtering.ts
index bcde84a0a9f..2bac5bef980 100644
--- a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-log-filtering.ts
+++ b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-log-filtering.ts
@@ -9,7 +9,7 @@ import {
import type { TransactionReceipt } from "viem";
describeSuite({
- id: "D021103",
+ id: "D021203",
title: "Ethereum RPC - Filtering non-matching logs",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-pending-transactions.ts b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-pending-transactions.ts
index 0883bb90124..0ead8ba76c3 100644
--- a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-pending-transactions.ts
+++ b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-pending-transactions.ts
@@ -9,7 +9,7 @@ import {
import { parseGwei } from "viem";
describeSuite({
- id: "D021104",
+ id: "D021204",
title: "Ethereum RPC - eth_pendingTransactions",
foundationMethods: "dev",
testCases: ({ it, context }) => {
diff --git a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-transaction-receipt.ts b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-transaction-receipt.ts
index 342b8f5bf9e..d6fcc792942 100644
--- a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-transaction-receipt.ts
+++ b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-transaction-receipt.ts
@@ -3,7 +3,7 @@ import type { ApiPromise } from "@polkadot/api";
import { BALTATHAR_ADDRESS, createViemTransaction, extractFee } from "@moonwall/util";
describeSuite({
- id: "D021105",
+ id: "D021205",
title: "Ethereum RPC - eth_getTransactionReceipt",
foundationMethods: "dev",
testCases: ({ it, context, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-tx-index.ts b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-tx-index.ts
index 9048c012a16..6007c5bc940 100644
--- a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-tx-index.ts
+++ b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-tx-index.ts
@@ -2,7 +2,7 @@ import { describeSuite, beforeAll, expect } from "@moonwall/cli";
import { BALTATHAR_ADDRESS, createRawTransfer } from "@moonwall/util";
describeSuite({
- id: "D021106",
+ id: "D021206",
title: "Transaction Index",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-version.ts b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-version.ts
index 8eedc279a41..d19a497a134 100644
--- a/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-version.ts
+++ b/test/suites/dev/moonbase/test-eth-rpc/test-eth-rpc-version.ts
@@ -1,7 +1,7 @@
import { describeSuite, expect, customDevRpcRequest } from "@moonwall/cli";
describeSuite({
- id: "D021107",
+ id: "D021207",
title: "Version RPC",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-access-list.ts b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-access-list.ts
index b8ab2434fa0..d69c4b80d29 100644
--- a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-access-list.ts
+++ b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-access-list.ts
@@ -4,7 +4,7 @@ import { createViemTransaction } from "@moonwall/util";
import { error } from "node:console";
describeSuite({
- id: "D021201",
+ id: "D021301",
title: "Ethereum Transaction - Access List",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-native-transfer.ts b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-native-transfer.ts
index b747631fdbd..68a5f83d3fa 100644
--- a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-native-transfer.ts
+++ b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-native-transfer.ts
@@ -8,7 +8,7 @@ import {
} from "@moonwall/util";
describeSuite({
- id: "D021202",
+ id: "D021302",
title: "Native Token Transfer Test",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-size.ts b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-size.ts
index 2f10f52652c..4a571b89669 100644
--- a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-size.ts
+++ b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-size.ts
@@ -3,7 +3,7 @@ import { customDevRpcRequest, describeSuite, expect } from "@moonwall/cli";
import { EXTRINSIC_GAS_LIMIT, createEthersTransaction } from "@moonwall/util";
describeSuite({
- id: "D021203",
+ id: "D021303",
title: "Ethereum Transaction - Large Transaction",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-types.ts b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-types.ts
index ba32148653f..80a59759e9b 100644
--- a/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-types.ts
+++ b/test/suites/dev/moonbase/test-eth-tx/test-eth-tx-types.ts
@@ -5,7 +5,7 @@ import type { EthereumTransactionTransactionV2 } from "@polkadot/types/lookup";
import { DEFAULT_TXN_MAX_BASE_FEE } from "../../../../helpers";
describeSuite({
- id: "D021204",
+ id: "D021304",
title: "Ethereum Transaction - Legacy",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
@@ -72,19 +72,8 @@ describeSuite({
expect(extrinsic.isEip2930).to.be.true;
- const {
- chainId,
- nonce,
- gasPrice,
- gasLimit,
- action,
- value,
- input,
- accessList,
- oddYParity,
- r,
- s,
- } = extrinsic.asEip2930;
+ const { chainId, nonce, gasPrice, gasLimit, action, value, input, accessList, signature } =
+ extrinsic.asEip2930;
expect(chainId.toNumber()).to.equal(1281);
expect(nonce.toNumber()).to.equal(currentNonce);
expect(gasPrice.toNumber()).to.equal(DEFAULT_TXN_MAX_BASE_FEE);
@@ -93,11 +82,11 @@ describeSuite({
expect(value.toBigInt()).to.equal(512n);
expect(input.toHex()).to.equal("0x");
expect(accessList.toString()).toBe("[]");
- expect(oddYParity.isTrue).to.be.true;
- expect(r.toHex()).to.equal(
+ expect(signature.oddYParity.isTrue).to.be.true;
+ expect(signature.r.toHex()).to.equal(
"0x8b978b8a38a3237af932f1988af0b01e60311a440c80bfcae96d7b9ac4ef8310"
);
- expect(s.toHex()).to.equal(
+ expect(signature.s.toHex()).to.equal(
"0x67c4d6d489d7d5180c8764eb4eff3e16e0330c9a0000b52756847b9ca14069e1"
);
},
@@ -137,9 +126,7 @@ describeSuite({
value,
input,
accessList,
- oddYParity,
- r,
- s,
+ signature,
} = extrinsic.asEip1559;
expect(chainId.toNumber()).to.equal(1281);
expect(nonce.toNumber()).to.equal(currentNonce);
@@ -150,11 +137,11 @@ describeSuite({
expect(value.toBigInt()).to.equal(512n);
expect(input.toHex()).to.equal("0x");
expect(accessList.toString()).toBe("[]");
- expect(oddYParity.isFalse).to.be.true;
- expect(r.toHex()).to.equal(
+ expect(signature.oddYParity.isFalse).to.be.true;
+ expect(signature.r.toHex()).to.equal(
"0x6a11d199415bee29b89a65a689546bbb7f50e95fae3a7d238e6a0d5e9753f998"
);
- expect(s.toHex()).to.equal(
+ expect(signature.s.toHex()).to.equal(
"0x45ec58c0626fef976a5e3a9cbad8d3aadbad03a4784fd7ca0cd332d2f571a000"
);
},
diff --git a/test/suites/dev/moonbase/test-eth-tx/test-test-tx-nonce.ts b/test/suites/dev/moonbase/test-eth-tx/test-test-tx-nonce.ts
index 4aaeb9021e5..9697b0a17a6 100644
--- a/test/suites/dev/moonbase/test-eth-tx/test-test-tx-nonce.ts
+++ b/test/suites/dev/moonbase/test-eth-tx/test-test-tx-nonce.ts
@@ -16,7 +16,7 @@ import {
import { encodeFunctionData } from "viem";
describeSuite({
- id: "D021205",
+ id: "D021305",
title: "Ethereum Transaction - Nonce",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-ethers/test-ethers.ts b/test/suites/dev/moonbase/test-ethers/test-ethers.ts
index 6be24875ff4..d23f927eba4 100644
--- a/test/suites/dev/moonbase/test-ethers/test-ethers.ts
+++ b/test/suites/dev/moonbase/test-ethers/test-ethers.ts
@@ -3,7 +3,7 @@ import { describeSuite, expect, fetchCompiledContract } from "@moonwall/cli";
import { ethers } from "ethers";
describeSuite({
- id: "D021301",
+ id: "D021401",
title: "Ethers.js",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-evm/test-pallet-evm-overflow.ts b/test/suites/dev/moonbase/test-evm/test-pallet-evm-overflow.ts
index 588e8ce2262..08f964f54bc 100644
--- a/test/suites/dev/moonbase/test-evm/test-pallet-evm-overflow.ts
+++ b/test/suites/dev/moonbase/test-evm/test-pallet-evm-overflow.ts
@@ -6,7 +6,7 @@ import { ALITH_ADDRESS, GLMR, generateKeyringPair } from "@moonwall/util";
// A signed call cannot make a transfer directly in pallet_evm
describeSuite({
- id: "D021401",
+ id: "D021501",
title: "Pallet EVM - Transfering",
foundationMethods: "dev",
testCases: ({ context, it }) => {
@@ -30,6 +30,7 @@ describeSuite({
1_000_000_000n,
"0",
null,
+ [],
[]
)
)
diff --git a/test/suites/dev/moonbase/test-evm/test-pallet-evm-transfer.ts b/test/suites/dev/moonbase/test-evm/test-pallet-evm-transfer.ts
index a1e828d7ec9..277e77a8527 100644
--- a/test/suites/dev/moonbase/test-evm/test-pallet-evm-transfer.ts
+++ b/test/suites/dev/moonbase/test-evm/test-pallet-evm-transfer.ts
@@ -11,7 +11,7 @@ import {
// A signed call cannot make a transfer directly in pallet_evm
describeSuite({
- id: "D021402",
+ id: "D021502",
title: "Pallet EVM - call",
foundationMethods: "dev",
testCases: ({ context, it }) => {
@@ -33,6 +33,7 @@ describeSuite({
1_000_000_000n,
"0",
null,
+ [],
[]
)
)
@@ -64,6 +65,7 @@ describeSuite({
100_000_000_000_000n,
"0",
null,
+ [],
[]
)
)
diff --git a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-genesis.ts b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-genesis.ts
index d9a8bcf32d3..31670ab45b7 100644
--- a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-genesis.ts
+++ b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-genesis.ts
@@ -3,7 +3,7 @@ import { describeSuite, expect } from "@moonwall/cli";
import { ConstantStore } from "../../../../helpers";
describeSuite({
- id: "D021501",
+ id: "D021601",
title: "Genesis Fee Multiplier",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-max.ts b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-max.ts
index 636a0c71518..6d68fcf882b 100644
--- a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-max.ts
+++ b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-max.ts
@@ -12,7 +12,7 @@ import { encodeFunctionData } from "viem";
// number used internally by transaction-payment for fee calculations.
describeSuite({
- id: "D021502",
+ id: "D021602",
title: "Max Fee Multiplier",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-min.ts b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-min.ts
index ada5a982e70..7add89bd573 100644
--- a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-min.ts
+++ b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-min.ts
@@ -10,7 +10,7 @@ import { nToHex } from "@polkadot/util";
// To make sense of them, basically remove 18 zeroes (divide by 10^18). This will give you the
// number used internally by transaction-payment for fee calculations.
describeSuite({
- id: "D021503",
+ id: "D021603",
title: "Min Fee Multiplier",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-xcm.ts b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-xcm.ts
index 1447814f2d4..779ad60cc2f 100644
--- a/test/suites/dev/moonbase/test-fees/test-fee-multiplier-xcm.ts
+++ b/test/suites/dev/moonbase/test-fees/test-fee-multiplier-xcm.ts
@@ -43,7 +43,7 @@ async function setFeeMultiplier(context: any, value: bigint) {
// To make sense of them, basically remove 18 zeroes (divide by 10^18). This will give you the
// number used internally by transaction-payment for fee calculations.
describeSuite({
- id: "D021504",
+ id: "D021604",
title: "Fee Multiplier - XCM Executions",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-fees/test-fees-repartition.ts b/test/suites/dev/moonbase/test-fees/test-fees-repartition.ts
index 1e4353f407e..c9bf40139ab 100644
--- a/test/suites/dev/moonbase/test-fees/test-fees-repartition.ts
+++ b/test/suites/dev/moonbase/test-fees/test-fees-repartition.ts
@@ -4,7 +4,7 @@ import { BALTATHAR_ADDRESS, TREASURY_ACCOUNT, createRawTransfer, extractFee } fr
// These tests are checking the default value of FeesTreasuryProportion which is set to 20%
describeSuite({
- id: "D021505",
+ id: "D021605",
title: "Fees - Transaction",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-fees/test-length-fees.ts b/test/suites/dev/moonbase/test-fees/test-length-fees.ts
index 88d6736d1a8..2023fca1748 100644
--- a/test/suites/dev/moonbase/test-fees/test-length-fees.ts
+++ b/test/suites/dev/moonbase/test-fees/test-length-fees.ts
@@ -4,7 +4,7 @@ import { BALTATHAR_ADDRESS, baltathar } from "@moonwall/util";
//TODO: Change these to be less literal
describeSuite({
- id: "D021506",
+ id: "D021606",
title: "Substrate Length Fees",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-fees/test-length-fees2.ts b/test/suites/dev/moonbase/test-fees/test-length-fees2.ts
index 23daac335f8..e3e503acf7f 100644
--- a/test/suites/dev/moonbase/test-fees/test-length-fees2.ts
+++ b/test/suites/dev/moonbase/test-fees/test-length-fees2.ts
@@ -4,7 +4,7 @@ import { createViemTransaction } from "@moonwall/util";
import { ConstantStore } from "../../../../helpers/constants";
describeSuite({
- id: "D021507",
+ id: "D021607",
title: "Substrate Length Fees - Ethereum txn Interaction",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-filter/test-filter-api-creation.ts b/test/suites/dev/moonbase/test-filter/test-filter-api-creation.ts
index 3b5c12b24d6..562f03eea18 100644
--- a/test/suites/dev/moonbase/test-filter/test-filter-api-creation.ts
+++ b/test/suites/dev/moonbase/test-filter/test-filter-api-creation.ts
@@ -8,7 +8,7 @@ import {
import { fromHex, toHex } from "viem";
describeSuite({
- id: "D021601",
+ id: "D021701",
title: "Filter API",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-filter/test-filter-api-pending.ts b/test/suites/dev/moonbase/test-filter/test-filter-api-pending.ts
index c5f4c063438..8c53e34962b 100644
--- a/test/suites/dev/moonbase/test-filter/test-filter-api-pending.ts
+++ b/test/suites/dev/moonbase/test-filter/test-filter-api-pending.ts
@@ -3,7 +3,7 @@ import { customDevRpcRequest, describeSuite, expect } from "@moonwall/cli";
import { fromHex } from "viem";
describeSuite({
- id: "D021602",
+ id: "D021702",
title: "Filter Pending Transaction API",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-filter/test-filter-api-polling.ts b/test/suites/dev/moonbase/test-filter/test-filter-api-polling.ts
index d56d13b73c4..a34718167a5 100644
--- a/test/suites/dev/moonbase/test-filter/test-filter-api-polling.ts
+++ b/test/suites/dev/moonbase/test-filter/test-filter-api-polling.ts
@@ -7,7 +7,7 @@ import {
} from "@moonwall/cli";
describeSuite({
- id: "D021603",
+ id: "D021703",
title: "Filter Block API",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-gas/test-gas-contract-creation.ts b/test/suites/dev/moonbase/test-gas/test-gas-contract-creation.ts
index ad19f0f6f0f..2ff1391081f 100644
--- a/test/suites/dev/moonbase/test-gas/test-gas-contract-creation.ts
+++ b/test/suites/dev/moonbase/test-gas/test-gas-contract-creation.ts
@@ -3,7 +3,7 @@ import { describeSuite, expect, fetchCompiledContract } from "@moonwall/cli";
import { ALITH_ADDRESS } from "@moonwall/util";
describeSuite({
- id: "D021701",
+ id: "D021801",
title: "Estimate Gas - Contract creation",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-gas/test-gas-estimation-allcontracts.ts b/test/suites/dev/moonbase/test-gas/test-gas-estimation-allcontracts.ts
index a08ff588ae7..bd2786d84c5 100644
--- a/test/suites/dev/moonbase/test-gas/test-gas-estimation-allcontracts.ts
+++ b/test/suites/dev/moonbase/test-gas/test-gas-estimation-allcontracts.ts
@@ -19,7 +19,7 @@ import { encodeDeployData } from "viem";
import { expectEVMResult } from "../../../../helpers";
describeSuite({
- id: "D021702",
+ id: "D021802",
title: "Estimate Gas - Multiply",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-gas/test-gas-estimation-contracts.ts b/test/suites/dev/moonbase/test-gas/test-gas-estimation-contracts.ts
index ee3dfa4b6fb..b2ed665ce7c 100644
--- a/test/suites/dev/moonbase/test-gas/test-gas-estimation-contracts.ts
+++ b/test/suites/dev/moonbase/test-gas/test-gas-estimation-contracts.ts
@@ -10,7 +10,7 @@ import { ALITH_ADDRESS, PRECOMPILE_BATCH_ADDRESS } from "@moonwall/util";
import { encodeFunctionData } from "viem";
describeSuite({
- id: "D021703",
+ id: "D021803",
title: "Estimate Gas - Contract estimation",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-gas/test-gas-estimation-multiply.ts b/test/suites/dev/moonbase/test-gas/test-gas-estimation-multiply.ts
index 6afd0dcb9e6..1e6600469a6 100644
--- a/test/suites/dev/moonbase/test-gas/test-gas-estimation-multiply.ts
+++ b/test/suites/dev/moonbase/test-gas/test-gas-estimation-multiply.ts
@@ -4,7 +4,7 @@ import { ALITH_ADDRESS } from "@moonwall/util";
import type { Abi } from "viem";
describeSuite({
- id: "D021704",
+ id: "D021804",
title: "Estimate Gas - Multiply",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-gas/test-gas-estimation-subcall-oog.ts b/test/suites/dev/moonbase/test-gas/test-gas-estimation-subcall-oog.ts
index 9a9b268aa3b..80792801ce8 100644
--- a/test/suites/dev/moonbase/test-gas/test-gas-estimation-subcall-oog.ts
+++ b/test/suites/dev/moonbase/test-gas/test-gas-estimation-subcall-oog.ts
@@ -4,7 +4,7 @@ import { ALITH_ADDRESS } from "@moonwall/util";
import { type Abi, decodeEventLog, encodeFunctionData } from "viem";
describeSuite({
- id: "D021705",
+ id: "D021805",
title: "Estimate Gas - subCall",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-locks/test-locks-multiple-locks.ts b/test/suites/dev/moonbase/test-locks/test-locks-multiple-locks.ts
index 74b21c59d21..fc767230258 100644
--- a/test/suites/dev/moonbase/test-locks/test-locks-multiple-locks.ts
+++ b/test/suites/dev/moonbase/test-locks/test-locks-multiple-locks.ts
@@ -10,7 +10,7 @@ import {
import { createProposal } from "../../../../helpers";
describeSuite({
- id: "D021801",
+ id: "D021901",
title: "Locks - Voting and staking locks are not mutually exclusive",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter.ts b/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter.ts
index 4932a0dc3fe..09b46f1e86b 100644
--- a/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter.ts
+++ b/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter.ts
@@ -25,7 +25,7 @@ const RELAYCHAIN_ARBITRARY_ADDRESS_1: string =
const ARBITRARY_VESTING_PERIOD = 201600n;
describeSuite({
- id: "D021901",
+ id: "D022001",
title: "Maintenance Mode - Filter",
foundationMethods: "dev",
testCases: ({ context, it }) => {
@@ -70,6 +70,7 @@ describeSuite({
10_000_000_000n,
"0",
null,
+ [],
[]
)
)
@@ -195,7 +196,14 @@ describeSuite({
V4: {
parents: 0n,
interior: {
- X1: [{ AccountKey20: { network: null, key: hexToU8a(baltathar.address) } }],
+ X1: [
+ {
+ AccountKey20: {
+ network: null,
+ key: hexToU8a(baltathar.address),
+ },
+ },
+ ],
},
},
} as any,
diff --git a/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter2.ts b/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter2.ts
index c9d55cbbf1a..0aa04ceb16a 100644
--- a/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter2.ts
+++ b/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter2.ts
@@ -20,7 +20,7 @@ import {
const ARBITRARY_ASSET_ID = 42259045809535163221576417993425387648n;
describeSuite({
- id: "D021902",
+ id: "D022002",
title: "Maintenance Mode - Filter2",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter3.ts b/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter3.ts
index 3036fd4eaa7..320b8835c53 100644
--- a/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter3.ts
+++ b/test/suites/dev/moonbase/test-maintenance/test-maintenance-filter3.ts
@@ -17,7 +17,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D021903",
+ id: "D022003",
title: "Maintenance Mode - Filter2",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-maintenance/test-maintenance-mode.ts b/test/suites/dev/moonbase/test-maintenance/test-maintenance-mode.ts
index fbee1be9124..631b9c14107 100644
--- a/test/suites/dev/moonbase/test-maintenance/test-maintenance-mode.ts
+++ b/test/suites/dev/moonbase/test-maintenance/test-maintenance-mode.ts
@@ -5,7 +5,7 @@ import type { Result } from "@polkadot/types";
import type { SpRuntimeDispatchError } from "@polkadot/types/lookup";
describeSuite({
- id: "D021904",
+ id: "D022004",
title: "Maintenance Mode - General",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-moon/test-moon-rpc.ts b/test/suites/dev/moonbase/test-moon/test-moon-rpc.ts
index bffde5f18d3..686c115d7ef 100644
--- a/test/suites/dev/moonbase/test-moon/test-moon-rpc.ts
+++ b/test/suites/dev/moonbase/test-moon/test-moon-rpc.ts
@@ -15,7 +15,7 @@ const createApi = async (endpoint: string) =>
});
describeSuite({
- id: "D022001",
+ id: "D022101",
title: "Moon RPC Methods - moon_isBlockFinalized ",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-pov/test-pov-limit.ts b/test/suites/dev/moonbase/test-pov/test-pov-limit.ts
index f6c613501f5..4c5fe02eb48 100644
--- a/test/suites/dev/moonbase/test-pov/test-pov-limit.ts
+++ b/test/suites/dev/moonbase/test-pov/test-pov-limit.ts
@@ -4,7 +4,7 @@ import { deployHeavyContracts, type HeavyContract } from "../../../../helpers";
import { ALITH_ADDRESS, createEthersTransaction } from "@moonwall/util";
describeSuite({
- id: "D0121111",
+ id: "D022703",
title: "PoV Limit",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-pov/test-precompile-over-pov.ts b/test/suites/dev/moonbase/test-pov/test-precompile-over-pov.ts
index b994c295ee3..43a6703a01d 100644
--- a/test/suites/dev/moonbase/test-pov/test-precompile-over-pov.ts
+++ b/test/suites/dev/moonbase/test-pov/test-precompile-over-pov.ts
@@ -12,7 +12,7 @@ import { type Abi, encodeFunctionData } from "viem";
import { ALITH_ADDRESS, PRECOMPILE_BATCH_ADDRESS, createEthersTransaction } from "@moonwall/util";
describeSuite({
- id: "D022703",
+ id: "D022704",
title: "PoV precompile test - gasLimit",
foundationMethods: "dev",
testCases: ({ context, log, it }) => {
diff --git a/test/suites/dev/moonbase/test-pov/test-precompile-over-pov2.ts b/test/suites/dev/moonbase/test-pov/test-precompile-over-pov2.ts
index f0975f6ae6a..3e6cc5b143c 100644
--- a/test/suites/dev/moonbase/test-pov/test-precompile-over-pov2.ts
+++ b/test/suites/dev/moonbase/test-pov/test-precompile-over-pov2.ts
@@ -11,7 +11,7 @@ import { type Abi, encodeFunctionData } from "viem";
import { type HeavyContract, deployHeavyContracts, ConstantStore } from "../../../../helpers";
describeSuite({
- id: "D022704",
+ id: "D022705",
title: "PoV precompile test - PoV Limit (6.5Mb in Dev)",
foundationMethods: "dev",
testCases: ({ context, log, it }) => {
diff --git a/test/suites/dev/moonbase/test-pov/test-xcm-to-evm-pov.ts b/test/suites/dev/moonbase/test-pov/test-xcm-to-evm-pov.ts
index 798f1373cd2..2b3175ba15c 100644
--- a/test/suites/dev/moonbase/test-pov/test-xcm-to-evm-pov.ts
+++ b/test/suites/dev/moonbase/test-pov/test-xcm-to-evm-pov.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers/constants";
describeSuite({
- id: "D022705",
+ id: "D022706",
title: "XCM to EVM - PoV tests",
foundationMethods: "dev",
testCases: ({ context, log, it }) => {
diff --git a/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery2.ts b/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery2.ts
index ca9081d691d..17b84779a3d 100644
--- a/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery2.ts
+++ b/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery2.ts
@@ -47,7 +47,7 @@ describeSuite({
args: [0],
account: BALTATHAR_ADDRESS,
});
- expect(estimatedGas).to.equal(151470n);
+ expect(estimatedGas).to.equal(151480n);
const rawTxn = await context.writePrecompile!({
precompileName: "Randomness",
diff --git a/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery3.ts b/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery3.ts
index ed3d882a7b1..87ebfa9dd0f 100644
--- a/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery3.ts
+++ b/test/suites/dev/moonbase/test-randomness/test-randomness-babe-lottery3.ts
@@ -49,7 +49,7 @@ describeSuite({
id: "T01",
title: "should fail to fulfill before the delay",
test: async function () {
- expect(estimatedGasBefore).toMatchInlineSnapshot(`112520n`);
+ expect(estimatedGasBefore).toMatchInlineSnapshot(`112528n`);
expect(
await context.readPrecompile!({
@@ -86,7 +86,7 @@ describeSuite({
id: "T02",
title: "should succeed to fulfill after the delay",
test: async function () {
- expect(estimatedGasBefore).toMatchInlineSnapshot(`112520n`);
+ expect(estimatedGasBefore).toMatchInlineSnapshot(`112528n`);
await context.createBlock([
// Faking relay epoch + 2 in randomness storage
@@ -109,7 +109,7 @@ describeSuite({
account: BALTATHAR_ADDRESS,
});
log("Estimated Gas for startLottery", estimatedGas);
- expect(estimatedGas).toMatchInlineSnapshot(`152898n`);
+ expect(estimatedGas).toMatchInlineSnapshot(`152908n`);
const rawTxn = await context.writePrecompile!({
precompileName: "Randomness",
diff --git a/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery4.ts b/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery4.ts
index e54bbe9cb04..d1d5d577589 100644
--- a/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery4.ts
+++ b/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery4.ts
@@ -20,7 +20,7 @@ describeSuite({
value: 1n * GLMR,
});
log("Estimated Gas for startLottery", estimatedGas);
- expect(estimatedGas).to.equal(111649n);
+ expect(estimatedGas).to.equal(112323n);
await context.writeContract!({
contractAddress: lotteryContract,
@@ -47,7 +47,7 @@ describeSuite({
args: [0],
});
log("Estimated Gas for startLottery", estimatedGas);
- expect(estimatedGas).toMatchInlineSnapshot(`150495n`);
+ expect(estimatedGas).toMatchInlineSnapshot(`150504n`);
const rawTxn = await context.writePrecompile!({
precompileName: "Randomness",
diff --git a/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery5.ts b/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery5.ts
index f03309fb4e6..0d19f7edaab 100644
--- a/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery5.ts
+++ b/test/suites/dev/moonbase/test-randomness/test-randomness-vrf-lottery5.ts
@@ -48,7 +48,7 @@ describeSuite({
args: [0],
});
- expect(estimatedGas).to.equal(150495n);
+ expect(estimatedGas).to.equal(150504n);
const rawTxn = await context.writePrecompile!({
precompileName: "Randomness",
diff --git a/test/suites/dev/moonbase/test-storage-growth/test-precompile-storage-growth.ts b/test/suites/dev/moonbase/test-storage-growth/test-precompile-storage-growth.ts
index 42323c4854a..e4f1e68b772 100644
--- a/test/suites/dev/moonbase/test-storage-growth/test-precompile-storage-growth.ts
+++ b/test/suites/dev/moonbase/test-storage-growth/test-precompile-storage-growth.ts
@@ -35,7 +35,7 @@ describeSuite({
});
// Snapshot estimated gas
- expect(estimatedGas).toMatchInlineSnapshot(`49656n`);
+ expect(estimatedGas).toMatchInlineSnapshot(`49663n`);
const rawTxn = await context.writePrecompile!({
precompileName: "Proxy",
@@ -68,7 +68,7 @@ describeSuite({
});
// Snapshot estimated gas
- expect(estimatedGas).toMatchInlineSnapshot(`51118n`);
+ expect(estimatedGas).toMatchInlineSnapshot(`51125n`);
const rawTxn = await context.writePrecompile!({
precompileName: "Proxy",
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-dmp-asset-transfer.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-dmp-asset-transfer.ts
index a6273f0b85d..597b33200bd 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-dmp-asset-transfer.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-dmp-asset-transfer.ts
@@ -13,7 +13,7 @@ import {
const RELAY_TOKEN = 1_000_000_000_000n;
describeSuite({
- id: "D024001",
+ id: "D024101",
title: "Mock XCM - receive downward transfer",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-3.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-3.ts
index b974c7e190f..56722021ad7 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-3.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-3.ts
@@ -37,7 +37,7 @@ const STATEMINT_LOCATION = {
};
describeSuite({
- id: "D024010",
+ id: "D024102",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-4.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-4.ts
index d84a9d2613b..271efab520e 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-4.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-4.ts
@@ -13,7 +13,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024011",
+ id: "D024103",
title: "Mock XCM - receive horizontal transfer of DEV",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-5.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-5.ts
index 90ad20e0bcb..af7fffdc7ce 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-5.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-5.ts
@@ -14,7 +14,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024012",
+ id: "D024104",
title: "Mock XCM - receive horizontal transfer of DEV with new reanchor",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-6.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-6.ts
index 3e14fe72aaf..17269c85ef1 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-6.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-6.ts
@@ -51,7 +51,7 @@ const STATEMINT_ASSET_ONE_LOCATION = {
};
describeSuite({
- id: "D024013",
+ id: "D024105",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-8.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-8.ts
index 565e350b066..2ffd0e9565f 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-8.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-asset-transfer-8.ts
@@ -35,7 +35,7 @@ const STATEMINT_LOCATION = {
};
describeSuite({
- id: "D024014",
+ id: "D024106",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-10.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-10.ts
index c3fee727a5d..9ac1c6a00df 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-10.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-10.ts
@@ -11,7 +11,7 @@ import {
import { ConstantStore } from "../../../../helpers";
describeSuite({
- id: "D024020",
+ id: "D024107",
title: "Mock XCM - transact ETHEREUM input size check succeeds",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-11.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-11.ts
index f3f59cc7633..0a3614e37ec 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-11.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-11.ts
@@ -11,7 +11,7 @@ import {
import { ConstantStore } from "../../../../helpers";
describeSuite({
- id: "D024021",
+ id: "D024108",
title: "Mock XCM - transact ETHEREUM input size check fails",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-12.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-12.ts
index 025872a33f7..a6f401c6f70 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-12.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-12.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers/constants.js";
describeSuite({
- id: "D024022",
+ id: "D024109",
title: "Mock XCM - receive horizontal transact ETHEREUM (transfer)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-4.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-4.ts
index ed5c41d5f65..ed664c3d667 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-4.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-4.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers";
describeSuite({
- id: "D024025",
+ id: "D024110",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-5.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-5.ts
index 658610ba184..3cba01cea03 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-5.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-5.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers";
describeSuite({
- id: "D024026",
+ id: "D024111",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-6.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-6.ts
index ecb86366030..e67924ef61e 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-6.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-6.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers/constants.js";
describeSuite({
- id: "D024027",
+ id: "D024112",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-7.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-7.ts
index 73d11d8307d..ae7088e116f 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-7.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-7.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers";
describeSuite({
- id: "D024028",
+ id: "D024113",
title: "Mock XCM - transact ETHEREUM (proxy) disabled switch",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-8.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-8.ts
index 4c80f897d28..823917fda8f 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-8.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-8.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D024029",
+ id: "D024114",
title: "Mock XCM - transact ETHEREUM (non-proxy) disabled switch",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-9.ts b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-9.ts
index cfb15960d42..012ce353306 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-9.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-mock-hrmp-transact-ethereum-9.ts
@@ -3,7 +3,7 @@ import { describeSuite, expect } from "@moonwall/cli";
import { alith } from "@moonwall/util";
describeSuite({
- id: "D024030",
+ id: "D024115",
title: "Mock XCM - EthereumXcm only disable by root",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-data-field-size.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-data-field-size.ts
index a1575aa5aad..e79e4342c68 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-data-field-size.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-data-field-size.ts
@@ -11,7 +11,7 @@ import { parseEther } from "ethers";
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D024031",
+ id: "D024116",
title: "Mock ERC20 <> XCM - Test wrong size of GeneralKey data field",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-excess-gas.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-excess-gas.ts
index 7d5f0335887..d153a560da5 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-excess-gas.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-excess-gas.ts
@@ -14,7 +14,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D024032",
+ id: "D024117",
title: "Mock XCM - Test bad contract with excess gas usage",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-fees-and-trap.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-fees-and-trap.ts
index a249fdc5798..312cd42a241 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-fees-and-trap.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-fees-and-trap.ts
@@ -14,7 +14,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D024033",
+ id: "D024118",
title: "Mock XCM - Fails trying to pay fees with ERC20",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3-filter.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3-filter.ts
index 3c8307f95ab..648a41e349a 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3-filter.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3-filter.ts
@@ -13,7 +13,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D024034",
+ id: "D024119",
title: "Mock XCM V3 - XCM Weight Limit",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3.ts
index d73261116f9..24c7e40924d 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-erc20-v3.ts
@@ -13,7 +13,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D024035",
+ id: "D024120",
title: "Mock XCM V3 - Receive erc20 via XCM",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-1.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-1.ts
index 271183324ef..9cfca951c2e 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-1.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-1.ts
@@ -3,7 +3,7 @@ import { beforeAll, describeSuite, expect } from "@moonwall/cli";
import { alith } from "@moonwall/util";
describeSuite({
- id: "D024036",
+ id: "D024121",
title: "Precompiles - xcm transactor",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-2.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-2.ts
index 06c27c784b9..7234152ebf9 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-2.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcm-transactor-2.ts
@@ -2,7 +2,7 @@ import "@moonbeam-network/api-augment";
import { describeSuite, expect, dispatchAsGeneralAdmin } from "@moonwall/cli";
describeSuite({
- id: "D024037",
+ id: "D024122",
title: "Precompiles - xcm transactor",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-max-weight-instructions.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-max-weight-instructions.ts
index 1fcebe55ce8..2f982c0968a 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-max-weight-instructions.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-max-weight-instructions.ts
@@ -13,7 +13,7 @@ import { parseEther } from "ethers";
import type { ApiPromise } from "@polkadot/api";
describeSuite({
- id: "D024038",
+ id: "D024123",
title: "XCM V3 - Max Weight Instructions",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-new-instructions.ts b/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-new-instructions.ts
index 5d10b53d441..d6eaef5478e 100644
--- a/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-new-instructions.ts
+++ b/test/suites/dev/moonbase/test-xcm-v3/test-xcmv3-new-instructions.ts
@@ -16,7 +16,7 @@ import type { ApiPromise } from "@polkadot/api";
// the important thing (and what we are testing) is that they are
// executed and are not blocked with 'WeightNotComputable' due to using max weight.
describeSuite({
- id: "D024039",
+ id: "D024124",
title: "XCM V3 - Max Weight Instructions",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-2.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-2.ts
index 6b6a77ec5c0..265fa93b006 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-2.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-2.ts
@@ -37,7 +37,7 @@ const STATEMINT_LOCATION = {
};
describeSuite({
- id: "D024109",
+ id: "D024201",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-3.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-3.ts
index f937d308dbf..55e040f2e02 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-3.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-3.ts
@@ -13,7 +13,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024110",
+ id: "D024202",
title: "Mock XCM - receive horizontal transfer of DEV",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-4.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-4.ts
index 903a6e03a03..e2e5fc6701c 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-4.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-4.ts
@@ -14,7 +14,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024111",
+ id: "D024203",
title: "Mock XCM - receive horizontal transfer of DEV with new reanchor",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-5.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-5.ts
index 2e7c446ff9d..190a7e5ed4f 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-5.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-5.ts
@@ -50,7 +50,7 @@ const STATEMINT_ASSET_ONE_LOCATION = {
};
describeSuite({
- id: "D024112",
+ id: "D024204",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-6.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-6.ts
index 1fcca03bc2b..76331641fbd 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-6.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-asset-transfer-6.ts
@@ -35,7 +35,7 @@ const STATEMINT_LOCATION = {
};
describeSuite({
- id: "D024113",
+ id: "D024205",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-10.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-10.ts
index 4839ba04b05..ab4ca9c75cd 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-10.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-10.ts
@@ -10,7 +10,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024119",
+ id: "D024206",
title: "Mock XCM - transact ETHEREUM input size check fails",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-4.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-4.ts
index 20024cbfb56..3ed310b73f9 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-4.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-4.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024121",
+ id: "D024207",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-5.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-5.ts
index ee308871465..035c5a4d6f2 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-5.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-5.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024122",
+ id: "D024208",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-6.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-6.ts
index 1fe8a802652..c7f27c0efaa 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-6.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-6.ts
@@ -12,7 +12,7 @@ import {
import { ConstantStore } from "../../../../helpers/constants.js";
describeSuite({
- id: "D024123",
+ id: "D024209",
title: "Mock XCM - receive horizontal transact ETHEREUM (proxy)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-7.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-7.ts
index 2ff740b8767..0ac8465ee96 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-7.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-7.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024124",
+ id: "D024210",
title: "Mock XCM - transact ETHEREUM (proxy) disabled switch",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-8.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-8.ts
index bd79d891dc3..6cf9de8228e 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-8.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-8.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024125",
+ id: "D024211",
title: "Mock XCM - transact ETHEREUM (non-proxy) disabled switch",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-9.ts b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-9.ts
index e639a199f1d..e71e35cdda5 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-9.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-mock-hrmp-transact-ethereum-9.ts
@@ -3,7 +3,7 @@ import { describeSuite, expect } from "@moonwall/cli";
import { alith } from "@moonwall/util";
describeSuite({
- id: "D024126",
+ id: "D024212",
title: "Mock XCM - EthereumXcm only disable by root",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer-two-ERC20.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer-two-ERC20.ts
index b5411650158..00e02314b11 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer-two-ERC20.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer-two-ERC20.ts
@@ -13,7 +13,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D024128",
+ id: "D024213",
title: "Mock XCM - Send two local ERC20",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer.ts
index 98b658ed0f8..ad8c501758b 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-erc20-transfer.ts
@@ -14,7 +14,7 @@ import {
export const ERC20_TOTAL_SUPPLY = 1_000_000_000n;
describeSuite({
- id: "D024129",
+ id: "D024214",
title: "Mock XCM - Send local erc20",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-fee-with-origin-token.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-fee-with-origin-token.ts
index 2117a6d57f8..937b0008635 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-fee-with-origin-token.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-fee-with-origin-token.ts
@@ -56,7 +56,7 @@ const DEFAULT_ADDRESS = "0x0101010101010101010101010101010101010101";
*
*/
describeSuite({
- id: "D024130",
+ id: "D024215",
title: "Mock XCM - Transfer some ERC20 token and pay with origin chain's token",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-with-dot.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-with-dot.ts
index b30af3dfd21..7e568902410 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-with-dot.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-evm-with-dot.ts
@@ -23,7 +23,7 @@ import {
} from "../../../../helpers/index.js";
describeSuite({
- id: "D024131",
+ id: "D024216",
title: "Mock XCM - Send EVM transaction through and pay with xcDOT",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-location-to-account-api.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-location-to-account-api.ts
index d2e20e7c3bc..7f5a2d959bd 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-location-to-account-api.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-location-to-account-api.ts
@@ -2,7 +2,7 @@ import { describeSuite, expect } from "@moonwall/cli";
import { RELAY_V3_SOURCE_LOCATION } from "../../../../helpers/assets";
describeSuite({
- id: "D024132",
+ id: "D024217",
title: "XCM - LocationToAccountApi",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-foreign.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-foreign.ts
index 865609dcb22..4b21fb39637 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-foreign.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-foreign.ts
@@ -20,7 +20,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024133",
+ id: "D024218",
title: "XCM - XcmPaymentApi - Transact",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-native.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-native.ts
index a832479c632..fe62f1a646b 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-native.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api-transact-native.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024134",
+ id: "D024219",
title: "XCM - XcmPaymentApi - Transact",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api.ts
index 075d032d084..d337d4dec9a 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-payment-api.ts
@@ -9,7 +9,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024135",
+ id: "D024220",
title: "XCM - XcmPaymentApi",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-1.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-1.ts
index 09af7013e6a..2a8cafe93d0 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-1.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-1.ts
@@ -14,7 +14,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024136",
+ id: "D024221",
title: "XCM Moonbase: version compatibility",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-2.ts b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-2.ts
index d9b93d51077..31f54ae0319 100644
--- a/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-2.ts
+++ b/test/suites/dev/moonbase/test-xcm-v4/test-xcm-ver-conversion-2.ts
@@ -14,7 +14,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024137",
+ id: "D024222",
title: "XCM Moonriver: version compatibility",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-2.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-2.ts
index 086f43eaf10..f9f5fde1ea2 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-2.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-2.ts
@@ -39,7 +39,7 @@ const STATEMINT_LOCATION = {
};
describeSuite({
- id: "D024209",
+ id: "D024301",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-3.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-3.ts
index f7f10553691..4d1114b8003 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-3.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-3.ts
@@ -13,7 +13,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024210",
+ id: "D024302",
title: "Mock XCM - receive horizontal transfer of DEV",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-4.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-4.ts
index af59989c5ab..dae762180d8 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-4.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-4.ts
@@ -14,7 +14,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024211",
+ id: "D024303",
title: "Mock XCM - receive horizontal transfer of DEV with new reanchor",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-5.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-5.ts
index 97a7d03c695..d3d9232c433 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-5.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-5.ts
@@ -52,7 +52,7 @@ const STATEMINT_ASSET_ONE_LOCATION = {
};
describeSuite({
- id: "D024212",
+ id: "D024304",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-6.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-6.ts
index ffc5f3b88a2..c2d6f607579 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-6.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-asset-transfer-6.ts
@@ -37,7 +37,7 @@ const STATEMINT_LOCATION = {
};
describeSuite({
- id: "D024213",
+ id: "D024305",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-7.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-7.ts
index fe8ef739914..ed3ddd8cfce 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-7.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-7.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D024214",
+ id: "D024306",
title: "Mock XCM - transact ETHEREUM (proxy) disabled switch",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-8.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-8.ts
index a64f7299710..f665c380738 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-8.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-8.ts
@@ -11,7 +11,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D024215",
+ id: "D024307",
title: "Mock XCM - transact ETHEREUM (non-proxy) disabled switch",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-9.ts b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-9.ts
index b9c97106b5c..b3e15d68567 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-9.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-mock-hrmp-transact-ethereum-9.ts
@@ -3,7 +3,7 @@ import { describeSuite, expect } from "@moonwall/cli";
import { alith } from "@moonwall/util";
describeSuite({
- id: "D024216",
+ id: "D024308",
title: "Mock XCM - EthereumXcm only disable by root",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-fee-with-origin-token.ts b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-fee-with-origin-token.ts
index 5c385cf3e6c..ace80c032c3 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-fee-with-origin-token.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-fee-with-origin-token.ts
@@ -56,7 +56,7 @@ const DEFAULT_ADDRESS = "0x0101010101010101010101010101010101010101";
*
*/
describeSuite({
- id: "D024218",
+ id: "D024309",
title: "Mock XCM - Transfer some ERC20 token and pay with origin chain's token",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-with-dot.ts b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-with-dot.ts
index 157024f1cdc..e683bec2720 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-with-dot.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-evm-with-dot.ts
@@ -22,7 +22,7 @@ import {
} from "../../../../helpers/xcm.js";
describeSuite({
- id: "D024219",
+ id: "D024310",
title: "Mock XCM - Send EVM transaction through and pay with xcDOT",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api-transact-foreign.ts b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api-transact-foreign.ts
index 029cdc65766..fa81552742b 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api-transact-foreign.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api-transact-foreign.ts
@@ -22,7 +22,7 @@ import {
} from "../../../../helpers/assets.js";
describeSuite({
- id: "D024220",
+ id: "D024311",
title: "XCM - XcmPaymentApi - Transact",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api.ts b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api.ts
index d373bb25e1d..767fad4f9a3 100644
--- a/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api.ts
+++ b/test/suites/dev/moonbase/test-xcm-v5/test-xcm-payment-api.ts
@@ -9,7 +9,7 @@ import {
} from "../../../../helpers/assets.js";
describeSuite({
- id: "D024221",
+ id: "D024312",
title: "XCM - XcmPaymentApi",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-auto-pause-xcm.ts b/test/suites/dev/moonbase/test-xcm/test-auto-pause-xcm.ts
index eb496a894dd..3f397f165f5 100644
--- a/test/suites/dev/moonbase/test-xcm/test-auto-pause-xcm.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-auto-pause-xcm.ts
@@ -13,7 +13,7 @@ import {
const foreign_para_id = 2000;
describeSuite({
- id: "D024101",
+ id: "D024001",
title: "Auto-pause XCM",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-asset-transfer-1.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-asset-transfer-1.ts
index 4d7277deede..66b15c31414 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-asset-transfer-1.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-asset-transfer-1.ts
@@ -41,7 +41,7 @@ const STATEMINT_LOCATION = {
};
describeSuite({
- id: "D024108",
+ id: "D024008",
title: "Mock XCM - receive horizontal transfer",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-1.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-1.ts
index 0bbc3ddf5db..210c98481d7 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-1.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-1.ts
@@ -13,7 +13,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024015",
+ id: "D024009",
title: "Mock XCM - receive horizontal transact",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-2.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-2.ts
index 3a6846d197b..03664e0c2f8 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-2.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-2.ts
@@ -13,7 +13,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024016",
+ id: "D024010",
title: "Mock XCM - receive horizontal transact with two Descends",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-3.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-3.ts
index 4686c902514..54516636b5b 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-3.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-3.ts
@@ -13,7 +13,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024017",
+ id: "D024011",
title: "Mock XCM - receive horizontal transact without withdraw",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-4.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-4.ts
index 6282af924a9..b96d093d2d5 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-4.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-4.ts
@@ -13,7 +13,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024018",
+ id: "D024012",
title: "Mock XCM - receive horizontal transact without buy execution",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-1.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-1.ts
index 31e3b15e9f8..2cd63498da4 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-1.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-1.ts
@@ -14,7 +14,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024019",
+ id: "D024013",
title: "Mock XCM - receive horizontal transact ETHEREUM (transfer)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-2.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-2.ts
index 577caa88405..36facfe1887 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-2.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-2.ts
@@ -13,7 +13,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024023",
+ id: "D024014",
title: "Mock XCM - receive horizontal transact ETHEREUM (call)",
foundationMethods: "dev",
testCases: ({ context, it, log }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-3.ts b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-3.ts
index ecc0e6e5243..cfccf264be2 100644
--- a/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-3.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-mock-hrmp-transact-ethereum-3.ts
@@ -21,7 +21,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024024",
+ id: "D024015",
title: "Mock XCM - receive horizontal transact ETHEREUM (asset fee)",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/test/suites/dev/moonbase/test-xcm/test-xcm-dry-run-api.ts b/test/suites/dev/moonbase/test-xcm/test-xcm-dry-run-api.ts
index b5c98d07bfd..5ceec846fa0 100644
--- a/test/suites/dev/moonbase/test-xcm/test-xcm-dry-run-api.ts
+++ b/test/suites/dev/moonbase/test-xcm/test-xcm-dry-run-api.ts
@@ -10,7 +10,7 @@ import {
} from "../../../../helpers";
describeSuite({
- id: "D024217",
+ id: "D024016",
title: "XCM - DryRunApi",
foundationMethods: "dev",
testCases: ({ context, it }) => {
diff --git a/typescript-api/src/moonbase/interfaces/augment-api-query.ts b/typescript-api/src/moonbase/interfaces/augment-api-query.ts
index 78ec37b3fc2..46035b0923c 100644
--- a/typescript-api/src/moonbase/interfaces/augment-api-query.ts
+++ b/typescript-api/src/moonbase/interfaces/augment-api-query.ts
@@ -40,8 +40,8 @@ import type {
CumulusPalletXcmpQueueQueueConfigData,
CumulusPrimitivesCoreAggregateMessageOrigin,
EthereumBlock,
- EthereumReceiptReceiptV3,
- EthereumTransactionTransactionV2,
+ EthereumReceiptReceiptV4,
+ EthereumTransactionTransactionV3,
FpRpcTransactionStatus,
FrameSupportDispatchPerDispatchClassWeight,
FrameSupportTokensMiscIdAmount,
@@ -506,7 +506,7 @@ declare module "@polkadot/api-base/types/storage" {
**/
currentReceipts: AugmentedQuery<
ApiType,
- () => Observable