From 74ae9b67c153721f9071071066fcc8d8c5682320 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Sun, 15 Mar 2026 17:39:49 -0400 Subject: [PATCH 01/14] feat: added trusted relayer --- contracts/near/Cargo.lock | 357 ++++++++++++++++++++------ contracts/near/Cargo.toml | 3 +- contracts/near/eth2-client/Cargo.toml | 1 + contracts/near/eth2-client/src/lib.rs | 8 + 4 files changed, 286 insertions(+), 83 deletions(-) diff --git a/contracts/near/Cargo.lock b/contracts/near/Cargo.lock index 0631bceb5..cfa571b9c 100644 --- a/contracts/near/Cargo.lock +++ b/contracts/near/Cargo.lock @@ -1256,9 +1256,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", @@ -1362,9 +1362,9 @@ dependencies = [ "hex", "indicatif", "lazy_static", - "near-crypto", + "near-crypto 0.29.2", "near-plugins", - "near-primitives", + "near-primitives 0.29.2", "near-sdk", "near-workspaces", "rlp", @@ -1414,6 +1414,7 @@ dependencies = [ "near-sdk", "near-units", "near-workspaces", + "omni-utils", "rstest", "schemars", "serde", @@ -2288,6 +2289,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -2438,12 +2448,6 @@ dependencies = [ "cc", ] -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "linux-raw-sys" version = "0.9.4" @@ -2613,6 +2617,16 @@ dependencies = [ "serde", ] +[[package]] +name = "near-account-id" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91f75ff8eee73815c247d0e17f3c0b705f0e993922a5548acd2ad377aeb67fca" +dependencies = [ + "borsh", + "serde", +] + [[package]] name = "near-chain-configs" version = "0.29.2" @@ -2623,11 +2637,11 @@ dependencies = [ "bytesize", "chrono", "derive_more 1.0.0", - "near-config-utils", - "near-crypto", - "near-parameters", - "near-primitives", - "near-time", + "near-config-utils 0.29.2", + "near-crypto 0.29.2", + "near-parameters 0.29.2", + "near-primitives 0.29.2", + "near-time 0.29.2", "num-rational", "serde", "serde_json", @@ -2649,6 +2663,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "near-config-utils" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2ba8f7129472fc147b867e904e4b8f398aa79f263f54dff6283c4860446ef8" +dependencies = [ + "anyhow", + "json_comments", + "thiserror 2.0.12", + "tracing", +] + [[package]] name = "near-crypto" version = "0.29.2" @@ -2662,10 +2688,10 @@ dependencies = [ "derive_more 1.0.0", "ed25519-dalek", "hex", - "near-account-id", - "near-config-utils", - "near-schema-checker-lib", - "near-stdx", + "near-account-id 1.1.1", + "near-config-utils 0.29.2", + "near-schema-checker-lib 0.29.2", + "near-stdx 0.29.2", "primitive-types 0.10.1", "rand 0.8.5", "secp256k1", @@ -2675,20 +2701,54 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "near-crypto" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c12a12485f8baafa85d5c413885b795bfa1d7d0ab7fd49b4f7fbe6cd270325b" +dependencies = [ + "blake2", + "borsh", + "bs58 0.4.0", + "curve25519-dalek", + "derive_more 2.0.1", + "ed25519-dalek", + "hex", + "near-account-id 2.5.0", + "near-config-utils 0.34.7", + "near-schema-checker-lib 0.34.7", + "near-stdx 0.34.7", + "primitive-types 0.10.1", + "secp256k1", + "serde", + "serde_json", + "subtle", + "thiserror 2.0.12", +] + [[package]] name = "near-fmt" version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0599477a38b5596c283212d4db8eb11c6cc33fb43d02002db9cd3f141ba735f1" dependencies = [ - "near-primitives-core", + "near-primitives-core 0.29.2", +] + +[[package]] +name = "near-fmt" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31b6d8fb4146cf0a7dcadf7816bf7b8efd5c081d6d2ca524bc80815b5f86812" +dependencies = [ + "near-primitives-core 0.34.7", ] [[package]] name = "near-gas" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180edcc7dc2fac41f93570d0c7b759c1b6d492f6ad093d749d644a40b4310a97" +checksum = "919d705b6dab5a7c6cc4b9a60e3025ed2f7cf3d4c3c32ad1a47264a4190e6409" dependencies = [ "borsh", "schemars", @@ -2705,9 +2765,9 @@ dependencies = [ "lazy_static", "log", "near-chain-configs", - "near-crypto", + "near-crypto 0.29.2", "near-jsonrpc-primitives", - "near-primitives", + "near-primitives 0.29.2", "reqwest", "serde", "serde_json", @@ -2722,9 +2782,9 @@ checksum = "6f003113d08e1f0ab9e6335efb1f7167662954804274653904ef57a9b5f8e687" dependencies = [ "arbitrary", "near-chain-configs", - "near-crypto", - "near-primitives", - "near-schema-checker-lib", + "near-crypto 0.29.2", + "near-primitives 0.29.2", + "near-schema-checker-lib 0.29.2", "serde", "serde_json", "thiserror 2.0.12", @@ -2739,9 +2799,28 @@ checksum = "fbfe696b28e2406001d4d5be14414a32c91f9c7202ae631367a6b22288ccad8d" dependencies = [ "borsh", "enum-map", - "near-account-id", - "near-primitives-core", - "near-schema-checker-lib", + "near-account-id 1.1.1", + "near-primitives-core 0.29.2", + "near-schema-checker-lib 0.29.2", + "num-rational", + "serde", + "serde_repr", + "serde_yaml", + "strum 0.24.1", + "thiserror 2.0.12", +] + +[[package]] +name = "near-parameters" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a561606a8beb563bf166c8a9ceb7f97058b376d17ea1a9b4b65ebc9bff29ac" +dependencies = [ + "borsh", + "enum-map", + "near-account-id 2.5.0", + "near-primitives-core 0.34.7", + "near-schema-checker-lib 0.34.7", "num-rational", "serde", "serde_repr", @@ -2792,13 +2871,13 @@ dependencies = [ "enum-map", "hex", "itertools 0.12.1", - "near-crypto", - "near-fmt", - "near-parameters", - "near-primitives-core", - "near-schema-checker-lib", - "near-stdx", - "near-time", + "near-crypto 0.29.2", + "near-fmt 0.29.2", + "near-parameters 0.29.2", + "near-primitives-core 0.29.2", + "near-schema-checker-lib 0.29.2", + "near-stdx 0.29.2", + "near-time 0.29.2", "num-rational", "ordered-float", "primitive-types 0.10.1", @@ -2815,6 +2894,46 @@ dependencies = [ "zstd 0.13.3", ] +[[package]] +name = "near-primitives" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ccddcf4a73e19afd681faaa7e83fc4046ec71f4bbe58c58ff4ae4432f36e3aa" +dependencies = [ + "arbitrary", + "base64 0.21.7", + "bitvec", + "borsh", + "bytes", + "bytesize", + "chrono", + "derive_more 2.0.1", + "easy-ext", + "enum-map", + "hex", + "itertools 0.14.0", + "near-crypto 0.34.7", + "near-fmt 0.34.7", + "near-parameters 0.34.7", + "near-primitives-core 0.34.7", + "near-schema-checker-lib 0.34.7", + "near-stdx 0.34.7", + "near-time 0.34.7", + "num-rational", + "ordered-float", + "primitive-types 0.10.1", + "serde", + "serde_json", + "serde_with", + "sha3", + "smallvec", + "smart-default", + "strum 0.24.1", + "thiserror 2.0.12", + "tracing", + "zstd 0.13.3", +] + [[package]] name = "near-primitives-core" version = "0.29.2" @@ -2827,11 +2946,35 @@ dependencies = [ "bs58 0.4.0", "derive_more 1.0.0", "enum-map", - "near-account-id", - "near-schema-checker-lib", + "near-account-id 1.1.1", + "near-schema-checker-lib 0.29.2", + "num-rational", + "serde", + "serde_repr", + "sha2", + "thiserror 2.0.12", +] + +[[package]] +name = "near-primitives-core" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c93d8c5d6aecfec0aa9d60ab34408c68b13d5c1bfc0f3afeee8c99fa521cdb3" +dependencies = [ + "arbitrary", + "base64 0.21.7", + "borsh", + "bs58 0.4.0", + "derive_more 2.0.1", + "enum-map", + "near-account-id 2.5.0", + "near-gas", + "near-schema-checker-lib 0.34.7", + "near-token", "num-rational", "serde", "serde_repr", + "serde_with", "sha2", "thiserror 2.0.12", ] @@ -2855,14 +2998,30 @@ version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00d54cd2888814fc2398316ec6d870754d7dd08704233bda770a75360afc8a7b" +[[package]] +name = "near-schema-checker-core" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f969a965d1ea04e1f085ee4d6c7273ae1064f578711087f3beaf8d400672cc7e" + [[package]] name = "near-schema-checker-lib" version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "311745157f685c26e05ca8532efbfcc09f63ab9fc7d94b824b2c75946ef37197" dependencies = [ - "near-schema-checker-core", - "near-schema-checker-macro", + "near-schema-checker-core 0.29.2", + "near-schema-checker-macro 0.29.2", +] + +[[package]] +name = "near-schema-checker-lib" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ae7538880de8a8d75e150dd0f4f685211ddd654ab12a339f40458df6d191dd" +dependencies = [ + "near-schema-checker-core 0.34.7", + "near-schema-checker-macro 0.34.7", ] [[package]] @@ -2871,21 +3030,27 @@ version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "515c63689e1e7940ac34629ad9d16ba8fd6bea58ad8ddbd4acf705d6149f3c77" +[[package]] +name = "near-schema-checker-macro" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9eb7d4dc413fe39ffa7fe5591ed4c24bc8139b9de8497689178d0101ae5167" + [[package]] name = "near-sdk" -version = "5.13.0" +version = "5.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad9bb847fb4458b00b64e28c4a7adac5d0658603d988c4b4d12eb18104767b80" +checksum = "0f3fa35758aba48e4f13528ba2f603e860dad03233d446e5c65ebd619296b607" dependencies = [ "base64 0.22.1", "borsh", "bs58 0.5.1", - "near-account-id", - "near-crypto", + "near-account-id 2.5.0", + "near-crypto 0.34.7", "near-gas", - "near-parameters", - "near-primitives", - "near-primitives-core", + "near-parameters 0.34.7", + "near-primitives 0.34.7", + "near-primitives-core 0.34.7", "near-sdk-macros", "near-sys", "near-token", @@ -2893,14 +3058,15 @@ dependencies = [ "once_cell", "serde", "serde_json", + "serde_with", "wee_alloc", ] [[package]] name = "near-sdk-macros" -version = "5.13.0" +version = "5.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0562cf707a41f2f71976f2baa48989369175a96e75b65a4297c815f49327bde" +checksum = "bb141510850a842d010d706c00bcbf31beba188c706415cc9392ffd62a127e09" dependencies = [ "Inflector", "darling 0.20.11", @@ -2919,11 +3085,17 @@ version = "0.29.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf9306662fe8ced267a85aa1d3fc9205f1968d88b9ddbb9a03c657da8457533" +[[package]] +name = "near-stdx" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c5dc0456309fcb256a0609d829971fd99f343e1a7f3b72f85364e64250a4555" + [[package]] name = "near-sys" -version = "0.2.3" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ee6acd2229cde1f13daabca434022900ab371d2c19de6be6a5a0497dc942ef7" +checksum = "f4ea77bb86969ff09c83faa517b2209c4876928381ed31e29c06cae2de0a216b" [[package]] name = "near-time" @@ -2935,11 +3107,22 @@ dependencies = [ "time", ] +[[package]] +name = "near-time" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9ae070cbd84d16b948fcc335ea82db35919bf856e349f333143ff2894eeafd" +dependencies = [ + "parking_lot", + "serde", + "time", +] + [[package]] name = "near-token" -version = "0.3.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3e60aa26a74dc514b1b6408fdd06cefe2eb0ff029020956c1c6517594048fd" +checksum = "34de6b54d82d0790b2a56b677e7b4ecb7f021a7e8559f8611065c890d56cfcda" dependencies = [ "borsh", "serde", @@ -2979,9 +3162,9 @@ dependencies = [ [[package]] name = "near-vm-runner" -version = "0.29.2" +version = "0.34.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca3f18ed6a87b334b93b53e4c2c98cf185fd1fde5a4b538980508fb7e51b147" +checksum = "3c9b4794d695cf13a1a117d76a3e87b6b660f8f7862f9df1544ba8bbd96634c9" dependencies = [ "blst", "borsh", @@ -2989,17 +3172,18 @@ dependencies = [ "ed25519-dalek", "enum-map", "lru", - "near-crypto", - "near-parameters", - "near-primitives-core", - "near-schema-checker-lib", - "near-stdx", + "near-crypto 0.34.7", + "near-parameters 0.34.7", + "near-primitives-core 0.34.7", + "near-schema-checker-lib 0.34.7", + "near-stdx 0.34.7", "num-rational", + "parking_lot", + "rand 0.8.5", "rayon", "ripemd", - "rustix 0.38.44", + "rustix", "serde", - "serde_repr", "sha2", "sha3", "strum 0.24.1", @@ -3023,12 +3207,12 @@ dependencies = [ "json-patch", "libc", "near-abi-client", - "near-account-id", - "near-crypto", + "near-account-id 1.1.1", + "near-crypto 0.29.2", "near-gas", "near-jsonrpc-client", "near-jsonrpc-primitives", - "near-primitives", + "near-primitives 0.29.2", "near-sandbox-utils", "near-token", "rand 0.8.5", @@ -3194,6 +3378,27 @@ dependencies = [ "memchr", ] +[[package]] +name = "omni-utils" +version = "0.1.0" +source = "git+https://github.com/near-one/omni-utils?rev=9bc04ddefbc69c56d857651b50aa46695767d6c1#9bc04ddefbc69c56d857651b50aa46695767d6c1" +dependencies = [ + "near-sdk", + "omni-utils-derive", + "serde", + "serde_json", +] + +[[package]] +name = "omni-utils-derive" +version = "0.1.0" +source = "git+https://github.com/near-one/omni-utils?rev=9bc04ddefbc69c56d857651b50aa46695767d6c1#9bc04ddefbc69c56d857651b50aa46695767d6c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "once_cell" version = "1.21.3" @@ -3915,19 +4120,6 @@ dependencies = [ "semver 1.0.26", ] -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.0", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - [[package]] name = "rustix" version = "1.0.7" @@ -3937,7 +4129,7 @@ dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys 0.9.4", + "linux-raw-sys", "windows-sys 0.59.0", ] @@ -4209,6 +4401,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ + "indexmap 2.9.0", "itoa", "memchr", "ryu", @@ -4627,7 +4820,7 @@ dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.7", + "rustix", "windows-sys 0.59.0", ] @@ -5565,7 +5758,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d65cbf2f12c15564212d48f4e3dfb87923d25d611f2aed18f4cb23f0413d89e" dependencies = [ "libc", - "rustix 1.0.7", + "rustix", ] [[package]] diff --git a/contracts/near/Cargo.toml b/contracts/near/Cargo.toml index b9ba64f0e..eaf00d257 100644 --- a/contracts/near/Cargo.toml +++ b/contracts/near/Cargo.toml @@ -20,7 +20,7 @@ overflow-checks = true [workspace.dependencies] borsh = { version = "1.5.7", features = ["unstable__schema"] } -near-sdk = { version = "5.13.0", features = ["legacy", "unit-testing"] } +near-sdk = { version = "5.24.1", features = ["legacy", "unit-testing"] } rlp = "0.5.2" rlp-derive = "0.1.0" ethereum-types = "0.14.1" @@ -34,6 +34,7 @@ derive_more = "^0.99.2" hex = "0.4.2" bitvec = "1.0.0" near-plugins = { git = "https://github.com/aurora-is-near/near-plugins", tag = "v0.4.1" } +omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "9bc04ddefbc69c56d857651b50aa46695767d6c1" } [patch] [patch.crates-io] diff --git a/contracts/near/eth2-client/Cargo.toml b/contracts/near/eth2-client/Cargo.toml index 669a18108..884404e5e 100644 --- a/contracts/near/eth2-client/Cargo.toml +++ b/contracts/near/eth2-client/Cargo.toml @@ -40,6 +40,7 @@ near-sdk.workspace = true borsh.workspace = true bitvec.workspace = true near-plugins.workspace = true +omni-utils.workspace = true near-abi = "0.4.3" schemars = "0.8.22" amcl = { git = "https://github.com/sigp/incubator-milagro-crypto-rust.git", default-features = false, features = [ diff --git a/contracts/near/eth2-client/src/lib.rs b/contracts/near/eth2-client/src/lib.rs index 15b286073..8e32032cf 100644 --- a/contracts/near/eth2-client/src/lib.rs +++ b/contracts/near/eth2-client/src/lib.rs @@ -15,6 +15,7 @@ use near_sdk::collections::{LazyOption, LookupMap}; use near_sdk::{ env, near, require, AccountId, BorshStorageKey, PanicOnDefault, Promise, PublicKey, }; +use omni_utils::macros::trusted_relayer; use tree_hash::TreeHash; use amcl::bls381::bls381::utils::serialize_uncompressed_g1; @@ -45,6 +46,7 @@ pub enum Role { UnrestrictedSubmitLightClientUpdate, UnrestrictedSubmitExecutionHeader, DAO, + RelayerManager, } #[near(contract_state)] @@ -90,6 +92,10 @@ pub struct Eth2Client { trusted_blocks_submitter: Option, } +#[trusted_relayer( + bypass_roles(Role::DAO, Role::UnrestrictedSubmitLightClientUpdate), + manager_roles(Role::DAO, Role::RelayerManager) +)] #[near] impl Eth2Client { #[init] @@ -227,6 +233,7 @@ impl Eth2Client { .map(|header| header.block_number) } + #[trusted_relayer] #[pause(except(roles(Role::UnrestrictedSubmitLightClientUpdate, Role::DAO)))] pub fn submit_beacon_chain_light_client_update( &mut self, @@ -242,6 +249,7 @@ impl Eth2Client { } #[result_serializer(borsh)] + #[trusted_relayer] #[pause(except(roles(Role::UnrestrictedSubmitExecutionHeader, Role::DAO)))] pub fn submit_execution_header(&mut self, #[serializer(borsh)] block_header: BlockHeader) { if let Some(trusted_blocks_submitter) = &self.trusted_blocks_submitter { From 7a1fd5837f840c73f4e6182336a353ffd2480c3b Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Sun, 15 Mar 2026 20:15:31 -0400 Subject: [PATCH 02/14] fix: ci --- contracts/near/.buildkite/pipeline.yml | 23 +++++++++++++++---- contracts/near/Cargo.toml | 1 + .../near/eth2-client/src/tests/unit_tests.rs | 6 ++--- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/contracts/near/.buildkite/pipeline.yml b/contracts/near/.buildkite/pipeline.yml index c1a1f649a..369174715 100644 --- a/contracts/near/.buildkite/pipeline.yml +++ b/contracts/near/.buildkite/pipeline.yml @@ -1,7 +1,9 @@ steps: - command: | source ~/.cargo/env - rustup default stable + rustup install 1.86.0 + rustup default 1.86.0 + rustup target add wasm32-unknown-unknown ci/test_verify_eth_headers.sh label: "verify eth headers" @@ -10,7 +12,9 @@ steps: - command: | source ~/.cargo/env - rustup default stable + rustup install 1.86.0 + rustup default 1.86.0 + rustup target add wasm32-unknown-unknown ci/test_verify_eth_proofs.sh label: "verify eth proofs" @@ -19,7 +23,9 @@ steps: - command: | source ~/.cargo/env - rustup default stable + rustup install 1.86.0 + rustup default 1.86.0 + rustup target add wasm32-unknown-unknown eth-client/test.sh label: "eth-client tests" @@ -28,7 +34,9 @@ steps: - command: | source ~/.cargo/env - rustup default stable + rustup install 1.86.0 + rustup default 1.86.0 + rustup target add wasm32-unknown-unknown eth-prover/test.sh label: "eth-prover tests" @@ -36,6 +44,10 @@ steps: - "queue=medium" - command: | + source ~/.cargo/env + rustup install 1.86.0 + rustup default 1.86.0 + rustup target add wasm32-unknown-unknown ./build_all.sh changed_files=$$(git status --porcelain --untracked-files=no | wc -l) if [ $$changed_files -gt 0 ]; then @@ -49,6 +61,9 @@ steps: - command: | source ~/.cargo/env + rustup install 1.86.0 + rustup default 1.86.0 + rustup target add wasm32-unknown-unknown cargo test label: "rust contracts test" diff --git a/contracts/near/Cargo.toml b/contracts/near/Cargo.toml index eaf00d257..b794bf196 100644 --- a/contracts/near/Cargo.toml +++ b/contracts/near/Cargo.toml @@ -3,6 +3,7 @@ authors = ["Near One "] repository = "https://github.com/Near-One/rainbow-bridge" [workspace] +resolver = "2" members = [ "eth2-client", "eth-prover", diff --git a/contracts/near/eth2-client/src/tests/unit_tests.rs b/contracts/near/eth2-client/src/tests/unit_tests.rs index 84b41974a..472795dc0 100644 --- a/contracts/near/eth2-client/src/tests/unit_tests.rs +++ b/contracts/near/eth2-client/src/tests/unit_tests.rs @@ -5,7 +5,7 @@ mod tests { use eth_types::eth2::LightClientUpdate; use eth_types::BlockHeader; use near_sdk::test_utils::VMContextBuilder; - use near_sdk::{test_vm_config, testing_env, AccountId}; + use near_sdk::{test_vm_config, testing_env, AccountId, Gas}; macro_rules! inner_set_env { ($builder:ident) => { @@ -28,8 +28,8 @@ mod tests { let mut vm_config = test_vm_config(); vm_config.limit_config.max_number_logs = u64::MAX; vm_config.limit_config.max_total_log_length = u64::MAX; - vm_config.limit_config.max_total_prepaid_gas = u64::MAX; - vm_config.limit_config.max_gas_burnt = u64::MAX; + vm_config.limit_config.max_total_prepaid_gas = Gas::from_gas(u64::MAX); + vm_config.limit_config.max_gas_burnt = Gas::from_gas(u64::MAX); testing_env!(builder.build(), vm_config); }; } From 625a218df241bb01e8c661ab110e631013424436 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Sun, 15 Mar 2026 20:18:15 -0400 Subject: [PATCH 03/14] chore: updated image hash --- contracts/near/eth-prover/Cargo.toml | 2 +- contracts/near/eth2-client/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/near/eth-prover/Cargo.toml b/contracts/near/eth-prover/Cargo.toml index f84e3ceb5..241ce418a 100644 --- a/contracts/near/eth-prover/Cargo.toml +++ b/contracts/near/eth-prover/Cargo.toml @@ -11,7 +11,7 @@ repository.workspace = true # docker image, descriptor of build environment image = "sourcescan/cargo-near:0.16.0-rust-1.86.0" # tag after colon above serves only descriptive purpose; image is identified by digest -image_digest = "sha256:b41cb89907f92b114da9e2be4e109bff30ab792c22ddcbd2a4cff8e340cb9acb" +image_digest = "sha256:3220302ebb7036c1942e772810f21edd9381edf9a339983da43487c77fbad488" # list of environment variables names, whose values, if set, will be used as external build parameters # in a reproducible manner # supported by `sourcescan/cargo-near:0.10.1-rust-1.82.0` image or later images diff --git a/contracts/near/eth2-client/Cargo.toml b/contracts/near/eth2-client/Cargo.toml index 884404e5e..5d4122c10 100644 --- a/contracts/near/eth2-client/Cargo.toml +++ b/contracts/near/eth2-client/Cargo.toml @@ -11,7 +11,7 @@ repository.workspace = true # docker image, descriptor of build environment image = "sourcescan/cargo-near:0.16.0-rust-1.86.0" # tag after colon above serves only descriptive purpose; image is identified by digest -image_digest = "sha256:b41cb89907f92b114da9e2be4e109bff30ab792c22ddcbd2a4cff8e340cb9acb" +image_digest = "sha256:3220302ebb7036c1942e772810f21edd9381edf9a339983da43487c77fbad488" # list of environment variables names, whose values, if set, will be used as external build parameters # in a reproducible manner # supported by `sourcescan/cargo-near:0.10.1-rust-1.82.0` image or later images From 19bd2fb923a70bf60bb7765c9985deb71f2a28e6 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Sun, 15 Mar 2026 20:49:27 -0400 Subject: [PATCH 04/14] fix: tests --- contracts/near/Cargo.lock | 1 + contracts/near/eth-prover/src/tests.rs | 4 +--- contracts/near/eth-prover/src/tests_storage_proof.rs | 2 +- contracts/near/eth2-client/Cargo.toml | 1 + contracts/near/eth2-client/src/tests/unit_tests.rs | 6 +++--- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/near/Cargo.lock b/contracts/near/Cargo.lock index cfa571b9c..35c739f84 100644 --- a/contracts/near/Cargo.lock +++ b/contracts/near/Cargo.lock @@ -1411,6 +1411,7 @@ dependencies = [ "lazy_static", "near-abi", "near-plugins", + "near-primitives-core 0.34.7", "near-sdk", "near-units", "near-workspaces", diff --git a/contracts/near/eth-prover/src/tests.rs b/contracts/near/eth-prover/src/tests.rs index 829ac92b5..59dcae912 100644 --- a/contracts/near/eth-prover/src/tests.rs +++ b/contracts/near/eth-prover/src/tests.rs @@ -40,7 +40,7 @@ mod tests { .parse() .unwrap(), predecessor_account_id: "alice.near".parse().unwrap(), - input, + input: input.into(), block_index: 0, block_timestamp: 0, epoch_height: 0, @@ -350,8 +350,6 @@ mod tests { let actual_borsh_proof = "0200000053000000f851a06adc4881ae9f2b2bbbf70a60e5b05f0734c02d731e80ac1503231d851b24ffe680808080808080a0103165b38cd8ad3ffa4b1de70e7391ac2c321ffe265bc77f2316ba33288c37178080808080808080b0010000f901ad30b901a9f901a60182574ab9010000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080000000000000000000000000002008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000010000000000000000000020000000000080000000000000000000000000000000000000000000000000000004000000f89df89b94d26114cd6ee289accf82350c8d8487fedb8a0c07f863a0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa00000000000000000000000002c7116a63ab91084a7a5d6fef2e4eda0c84487afa00000000000000000000000007d3cd5685188c6aa498697db91ca548a1249863ea0000000000000000000000000000000000000000000000001158e460913d00000"; let actual_borsh_skip_bridge_call = "01"; - use borsh::BorshSerialize; - let borsh_log_index = borsh::to_vec(&log_index).unwrap().encode_hex::(); let borsh_log_entry_data = borsh::to_vec(&log_entry).unwrap().encode_hex::(); let borsh_receipt_index = borsh::to_vec(&receipt_index) diff --git a/contracts/near/eth-prover/src/tests_storage_proof.rs b/contracts/near/eth-prover/src/tests_storage_proof.rs index ab2aa1db9..01b6f8b0c 100644 --- a/contracts/near/eth-prover/src/tests_storage_proof.rs +++ b/contracts/near/eth-prover/src/tests_storage_proof.rs @@ -90,7 +90,7 @@ mod tests_storage_proof { .parse() .unwrap(), predecessor_account_id: "carol.near".parse().unwrap(), - input, + input: input.into(), block_index: 0, block_timestamp: 0, epoch_height: 0, diff --git a/contracts/near/eth2-client/Cargo.toml b/contracts/near/eth2-client/Cargo.toml index 5d4122c10..a8373b9dd 100644 --- a/contracts/near/eth2-client/Cargo.toml +++ b/contracts/near/eth2-client/Cargo.toml @@ -55,6 +55,7 @@ serde_json = "1.0" hex = "0.4.0" near-workspaces = "0.18" near-units = "0.2.0" +near-primitives-core = "0.34" tokio = { version = "1", features = ["full"] } anyhow = "1.0" cargo-near-build = "0.4.3" diff --git a/contracts/near/eth2-client/src/tests/unit_tests.rs b/contracts/near/eth2-client/src/tests/unit_tests.rs index 472795dc0..ddf649db2 100644 --- a/contracts/near/eth2-client/src/tests/unit_tests.rs +++ b/contracts/near/eth2-client/src/tests/unit_tests.rs @@ -5,7 +5,7 @@ mod tests { use eth_types::eth2::LightClientUpdate; use eth_types::BlockHeader; use near_sdk::test_utils::VMContextBuilder; - use near_sdk::{test_vm_config, testing_env, AccountId, Gas}; + use near_sdk::{test_vm_config, testing_env, AccountId}; macro_rules! inner_set_env { ($builder:ident) => { @@ -28,8 +28,8 @@ mod tests { let mut vm_config = test_vm_config(); vm_config.limit_config.max_number_logs = u64::MAX; vm_config.limit_config.max_total_log_length = u64::MAX; - vm_config.limit_config.max_total_prepaid_gas = Gas::from_gas(u64::MAX); - vm_config.limit_config.max_gas_burnt = Gas::from_gas(u64::MAX); + vm_config.limit_config.max_total_prepaid_gas = near_primitives_core::gas::Gas::MAX; + vm_config.limit_config.max_gas_burnt = near_primitives_core::gas::Gas::MAX; testing_env!(builder.build(), vm_config); }; } From 08143b7333e5ea5b107c2346ed02c76ed179c48d Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Tue, 17 Mar 2026 22:46:18 -0400 Subject: [PATCH 05/14] feat: allow only `DAO` to set relayer config --- contracts/near/Cargo.lock | 4 ++-- contracts/near/Cargo.toml | 2 +- contracts/near/eth2-client/src/lib.rs | 3 ++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/contracts/near/Cargo.lock b/contracts/near/Cargo.lock index 35c739f84..121055881 100644 --- a/contracts/near/Cargo.lock +++ b/contracts/near/Cargo.lock @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "omni-utils" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=9bc04ddefbc69c56d857651b50aa46695767d6c1#9bc04ddefbc69c56d857651b50aa46695767d6c1" +source = "git+https://github.com/near-one/omni-utils?rev=f1e99f128b622182055da0e3b8c91131ca2d8d3b#f1e99f128b622182055da0e3b8c91131ca2d8d3b" dependencies = [ "near-sdk", "omni-utils-derive", @@ -3393,7 +3393,7 @@ dependencies = [ [[package]] name = "omni-utils-derive" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=9bc04ddefbc69c56d857651b50aa46695767d6c1#9bc04ddefbc69c56d857651b50aa46695767d6c1" +source = "git+https://github.com/near-one/omni-utils?rev=f1e99f128b622182055da0e3b8c91131ca2d8d3b#f1e99f128b622182055da0e3b8c91131ca2d8d3b" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/near/Cargo.toml b/contracts/near/Cargo.toml index b794bf196..d47b7ba78 100644 --- a/contracts/near/Cargo.toml +++ b/contracts/near/Cargo.toml @@ -35,7 +35,7 @@ derive_more = "^0.99.2" hex = "0.4.2" bitvec = "1.0.0" near-plugins = { git = "https://github.com/aurora-is-near/near-plugins", tag = "v0.4.1" } -omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "9bc04ddefbc69c56d857651b50aa46695767d6c1" } +omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "f1e99f128b622182055da0e3b8c91131ca2d8d3b" } [patch] [patch.crates-io] diff --git a/contracts/near/eth2-client/src/lib.rs b/contracts/near/eth2-client/src/lib.rs index 8e32032cf..7439a7504 100644 --- a/contracts/near/eth2-client/src/lib.rs +++ b/contracts/near/eth2-client/src/lib.rs @@ -94,7 +94,8 @@ pub struct Eth2Client { #[trusted_relayer( bypass_roles(Role::DAO, Role::UnrestrictedSubmitLightClientUpdate), - manager_roles(Role::DAO, Role::RelayerManager) + manager_roles(Role::DAO, Role::RelayerManager), + config_roles(Role::DAO) )] #[near] impl Eth2Client { From 0f72d45f576876345303a114a1ff131b4e9f875e Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Tue, 17 Mar 2026 23:52:15 -0400 Subject: [PATCH 06/14] fix: `Method init is private` in tests --- relayer/Cargo.lock | 313 +++++++++++++++++++++++++++++------- relayer/tests/common/mod.rs | 45 +++++- 2 files changed, 288 insertions(+), 70 deletions(-) diff --git a/relayer/Cargo.lock b/relayer/Cargo.lock index 6751515f0..55f001859 100644 --- a/relayer/Cargo.lock +++ b/relayer/Cargo.lock @@ -2038,9 +2038,9 @@ dependencies = [ [[package]] name = "ed25519-dalek" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ "curve25519-dalek", "ed25519", @@ -3435,6 +3435,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -3914,6 +3923,16 @@ dependencies = [ "serde", ] +[[package]] +name = "near-account-id" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "702dbca982e748975658812c7be2ca53211f454137486f98f6cf768934e2cb29" +dependencies = [ + "borsh", + "serde", +] + [[package]] name = "near-chain-configs" version = "0.30.1" @@ -3924,11 +3943,11 @@ dependencies = [ "bytesize", "chrono", "derive_more 1.0.0", - "near-config-utils", - "near-crypto", - "near-parameters", - "near-primitives", - "near-time", + "near-config-utils 0.30.1", + "near-crypto 0.30.1", + "near-parameters 0.30.1", + "near-primitives 0.30.1", + "near-time 0.30.1", "num-rational", "serde", "serde_json", @@ -3950,6 +3969,18 @@ dependencies = [ "tracing", ] +[[package]] +name = "near-config-utils" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da2ba8f7129472fc147b867e904e4b8f398aa79f263f54dff6283c4860446ef8" +dependencies = [ + "anyhow", + "json_comments", + "thiserror 2.0.12", + "tracing", +] + [[package]] name = "near-crypto" version = "0.30.1" @@ -3963,10 +3994,10 @@ dependencies = [ "derive_more 1.0.0", "ed25519-dalek", "hex", - "near-account-id", - "near-config-utils", - "near-schema-checker-lib", - "near-stdx", + "near-account-id 1.1.1", + "near-config-utils 0.30.1", + "near-schema-checker-lib 0.30.1", + "near-stdx 0.30.1", "primitive-types 0.10.1", "rand 0.8.5", "secp256k1", @@ -3976,18 +4007,43 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "near-crypto" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c12a12485f8baafa85d5c413885b795bfa1d7d0ab7fd49b4f7fbe6cd270325b" +dependencies = [ + "blake2", + "borsh", + "bs58 0.4.0", + "curve25519-dalek", + "derive_more 2.0.1", + "ed25519-dalek", + "hex", + "near-account-id 2.6.0", + "near-config-utils 0.34.7", + "near-schema-checker-lib 0.34.7", + "near-stdx 0.34.7", + "primitive-types 0.10.1", + "secp256k1", + "serde", + "serde_json", + "subtle", + "thiserror 2.0.12", +] + [[package]] name = "near-fetch" version = "0.8.0" source = "git+https://github.com/r-near/fetch?branch=main#2a6aa1b5bfebb24a9bdd86914eb0066117ac8f82" dependencies = [ "base64 0.22.1", - "near-account-id", - "near-crypto", + "near-account-id 1.1.1", + "near-crypto 0.30.1", "near-gas", "near-jsonrpc-client", "near-jsonrpc-primitives", - "near-primitives", + "near-primitives 0.30.1", "near-token", "serde", "serde_json", @@ -4002,14 +4058,23 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64c0e4d846b9c27b30e5f24e788fb8cc55c046f72e2048e2539dbcb04d9a71c4" dependencies = [ - "near-primitives-core", + "near-primitives-core 0.30.1", +] + +[[package]] +name = "near-fmt" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31b6d8fb4146cf0a7dcadf7816bf7b8efd5c081d6d2ca524bc80815b5f86812" +dependencies = [ + "near-primitives-core 0.34.7", ] [[package]] name = "near-gas" -version = "0.3.0" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180edcc7dc2fac41f93570d0c7b759c1b6d492f6ad093d749d644a40b4310a97" +checksum = "919d705b6dab5a7c6cc4b9a60e3025ed2f7cf3d4c3c32ad1a47264a4190e6409" dependencies = [ "borsh", "schemars", @@ -4026,9 +4091,9 @@ dependencies = [ "lazy_static", "log", "near-chain-configs", - "near-crypto", + "near-crypto 0.30.1", "near-jsonrpc-primitives", - "near-primitives", + "near-primitives 0.30.1", "reqwest 0.12.19", "serde", "serde_json", @@ -4043,9 +4108,9 @@ checksum = "63ac3e779b1ad979957f05e43c92a79fbe7e1315647ab4d530e2a9a66bc62f5e" dependencies = [ "arbitrary", "near-chain-configs", - "near-crypto", - "near-primitives", - "near-schema-checker-lib", + "near-crypto 0.30.1", + "near-primitives 0.30.1", + "near-schema-checker-lib 0.30.1", "serde", "serde_json", "thiserror 2.0.12", @@ -4060,9 +4125,28 @@ checksum = "4dbb139bec6b7088d6afab0a3662725e5ee82d0ad725b67c1d45447c3d45fe55" dependencies = [ "borsh", "enum-map", - "near-account-id", - "near-primitives-core", - "near-schema-checker-lib", + "near-account-id 1.1.1", + "near-primitives-core 0.30.1", + "near-schema-checker-lib 0.30.1", + "num-rational", + "serde", + "serde_repr", + "serde_yaml", + "strum 0.24.1", + "thiserror 2.0.12", +] + +[[package]] +name = "near-parameters" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a561606a8beb563bf166c8a9ceb7f97058b376d17ea1a9b4b65ebc9bff29ac" +dependencies = [ + "borsh", + "enum-map", + "near-account-id 2.6.0", + "near-primitives-core 0.34.7", + "near-schema-checker-lib 0.34.7", "num-rational", "serde", "serde_repr", @@ -4090,13 +4174,13 @@ dependencies = [ "enum-map", "hex", "itertools 0.12.1", - "near-crypto", - "near-fmt", - "near-parameters", - "near-primitives-core", - "near-schema-checker-lib", - "near-stdx", - "near-time", + "near-crypto 0.30.1", + "near-fmt 0.30.1", + "near-parameters 0.30.1", + "near-primitives-core 0.30.1", + "near-schema-checker-lib 0.30.1", + "near-stdx 0.30.1", + "near-time 0.30.1", "num-rational", "ordered-float", "primitive-types 0.10.1", @@ -4113,6 +4197,46 @@ dependencies = [ "zstd 0.13.3", ] +[[package]] +name = "near-primitives" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ccddcf4a73e19afd681faaa7e83fc4046ec71f4bbe58c58ff4ae4432f36e3aa" +dependencies = [ + "arbitrary", + "base64 0.21.7", + "bitvec", + "borsh", + "bytes", + "bytesize", + "chrono", + "derive_more 2.0.1", + "easy-ext", + "enum-map", + "hex", + "itertools 0.14.0", + "near-crypto 0.34.7", + "near-fmt 0.34.7", + "near-parameters 0.34.7", + "near-primitives-core 0.34.7", + "near-schema-checker-lib 0.34.7", + "near-stdx 0.34.7", + "near-time 0.34.7", + "num-rational", + "ordered-float", + "primitive-types 0.10.1", + "serde", + "serde_json", + "serde_with", + "sha3", + "smallvec", + "smart-default", + "strum 0.24.1", + "thiserror 2.0.12", + "tracing", + "zstd 0.13.3", +] + [[package]] name = "near-primitives-core" version = "0.30.1" @@ -4125,11 +4249,35 @@ dependencies = [ "bs58 0.4.0", "derive_more 1.0.0", "enum-map", - "near-account-id", - "near-schema-checker-lib", + "near-account-id 1.1.1", + "near-schema-checker-lib 0.30.1", + "num-rational", + "serde", + "serde_repr", + "sha2 0.10.9", + "thiserror 2.0.12", +] + +[[package]] +name = "near-primitives-core" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c93d8c5d6aecfec0aa9d60ab34408c68b13d5c1bfc0f3afeee8c99fa521cdb3" +dependencies = [ + "arbitrary", + "base64 0.21.7", + "borsh", + "bs58 0.4.0", + "derive_more 2.0.1", + "enum-map", + "near-account-id 2.6.0", + "near-gas", + "near-schema-checker-lib 0.34.7", + "near-token", "num-rational", "serde", "serde_repr", + "serde_with", "sha2 0.10.9", "thiserror 2.0.12", ] @@ -4153,14 +4301,30 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed1fbfbc3c53b00aa893f8cb64abc5c12601edb8cecb878baf6f8f00e3184d3d" +[[package]] +name = "near-schema-checker-core" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f969a965d1ea04e1f085ee4d6c7273ae1064f578711087f3beaf8d400672cc7e" + [[package]] name = "near-schema-checker-lib" version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f424ce08c8d715f529a8f8dcd246f574042f0ed0b393d0aaefdf3cc693d5a9f" dependencies = [ - "near-schema-checker-core", - "near-schema-checker-macro", + "near-schema-checker-core 0.30.1", + "near-schema-checker-macro 0.30.1", +] + +[[package]] +name = "near-schema-checker-lib" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ae7538880de8a8d75e150dd0f4f685211ddd654ab12a339f40458df6d191dd" +dependencies = [ + "near-schema-checker-core 0.34.7", + "near-schema-checker-macro 0.34.7", ] [[package]] @@ -4169,21 +4333,27 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d191936f902770069255b16c95d1fb8edd6f3c3817c9228933a20ec8466737a3" +[[package]] +name = "near-schema-checker-macro" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9eb7d4dc413fe39ffa7fe5591ed4c24bc8139b9de8497689178d0101ae5167" + [[package]] name = "near-sdk" -version = "5.14.0" +version = "5.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1477ca4eb6d4a70a0e5740c5d34c268eedacce936ca557d3450ed5bd873fd06" +checksum = "0f3fa35758aba48e4f13528ba2f603e860dad03233d446e5c65ebd619296b607" dependencies = [ "base64 0.22.1", "borsh", "bs58 0.5.1", - "near-account-id", - "near-crypto", + "near-account-id 2.6.0", + "near-crypto 0.34.7", "near-gas", - "near-parameters", - "near-primitives", - "near-primitives-core", + "near-parameters 0.34.7", + "near-primitives 0.34.7", + "near-primitives-core 0.34.7", "near-sdk-macros", "near-sys", "near-token", @@ -4191,14 +4361,15 @@ dependencies = [ "once_cell", "serde", "serde_json", + "serde_with", "wee_alloc", ] [[package]] name = "near-sdk-macros" -version = "5.14.0" +version = "5.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29fe6d31a827e421d0d3f5c38fe3cc73f9f2a2aae41d2601d37c22d7ec1aae" +checksum = "bb141510850a842d010d706c00bcbf31beba188c706415cc9392ffd62a127e09" dependencies = [ "Inflector", "darling 0.20.11", @@ -4217,11 +4388,17 @@ version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f292226fd8f4c7c21cf6b1da1c17e9b484ebc1b9aeb4251d69336d28b7917ace" +[[package]] +name = "near-stdx" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c5dc0456309fcb256a0609d829971fd99f343e1a7f3b72f85364e64250a4555" + [[package]] name = "near-sys" -version = "0.2.4" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7d8e0ba9994e4d54cb4b301cd5fa9f2defcb69851148103512b9640a7e91572" +checksum = "f4ea77bb86969ff09c83faa517b2209c4876928381ed31e29c06cae2de0a216b" [[package]] name = "near-time" @@ -4233,11 +4410,22 @@ dependencies = [ "time", ] +[[package]] +name = "near-time" +version = "0.34.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de9ae070cbd84d16b948fcc335ea82db35919bf856e349f333143ff2894eeafd" +dependencies = [ + "parking_lot", + "serde", + "time", +] + [[package]] name = "near-token" -version = "0.3.0" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3e60aa26a74dc514b1b6408fdd06cefe2eb0ff029020956c1c6517594048fd" +checksum = "34de6b54d82d0790b2a56b677e7b4ecb7f021a7e8559f8611065c890d56cfcda" dependencies = [ "borsh", "serde", @@ -4245,9 +4433,9 @@ dependencies = [ [[package]] name = "near-vm-runner" -version = "0.30.1" +version = "0.34.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8e44b5b6582676805ab61bc60e65e56eec1460c58a7c951dd662b7a5c677554" +checksum = "3c9b4794d695cf13a1a117d76a3e87b6b660f8f7862f9df1544ba8bbd96634c9" dependencies = [ "blst", "borsh", @@ -4255,18 +4443,18 @@ dependencies = [ "ed25519-dalek", "enum-map", "lru 0.12.5", - "near-crypto", - "near-parameters", - "near-primitives-core", - "near-schema-checker-lib", - "near-stdx", + "near-crypto 0.34.7", + "near-parameters 0.34.7", + "near-primitives-core 0.34.7", + "near-schema-checker-lib 0.34.7", + "near-stdx 0.34.7", "num-rational", + "parking_lot", "rand 0.8.5", "rayon", "ripemd", "rustix", "serde", - "serde_repr", "sha2 0.10.9", "sha3", "strum 0.24.1", @@ -4291,12 +4479,12 @@ dependencies = [ "json-patch", "libc", "near-abi-client", - "near-account-id", - "near-crypto", + "near-account-id 1.1.1", + "near-crypto 0.30.1", "near-gas", "near-jsonrpc-client", "near-jsonrpc-primitives", - "near-primitives", + "near-primitives 0.30.1", "near-sandbox-utils", "near-token", "rand 0.8.5", @@ -5258,10 +5446,10 @@ dependencies = [ "figment", "hex", "indicatif", - "near-crypto", + "near-crypto 0.30.1", "near-fetch", "near-gas", - "near-primitives", + "near-primitives 0.30.1", "near-workspaces", "sensitive_url", "serde", @@ -5875,6 +6063,7 @@ version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ + "indexmap 2.9.0", "itoa", "memchr", "ryu", diff --git a/relayer/tests/common/mod.rs b/relayer/tests/common/mod.rs index a29501eb8..34d5c2d82 100644 --- a/relayer/tests/common/mod.rs +++ b/relayer/tests/common/mod.rs @@ -17,6 +17,7 @@ pub struct TestFixture { pub worker: Worker, pub contract: Contract, pub near_client: ContractClient, + pub near_client_with_contract_signer: ContractClient, } impl TestFixture { @@ -34,24 +35,39 @@ impl TestFixture { .await .wrap_err("Failed to create sandbox environment")?; + let (contract_id, contract_secret_key) = worker.generate_dev_account_credentials(); + // Deploy the contract let contract = worker - .dev_deploy(&wasm) - .await - .wrap_err("Failed to deploy contract")?; + .create_root_account_subaccount_and_deploy( + contract_id.clone(), + contract_secret_key.clone(), + &wasm, + ) + .await? + .into_result()?; + + let contract_signer = InMemorySigner::from_secret_key( + contract.id().clone(), + contract_secret_key + .to_string() + .parse() + .wrap_err("Failed to parse secret key")?, + ); let alice = worker .dev_create_account() .await .wrap_err("Failed to create test account")?; - let secret_key: SecretKey = alice + let alice_secret_key: SecretKey = alice .secret_key() .to_string() .parse() .wrap_err("Failed to parse secret key")?; - let signer = InMemorySigner::from_secret_key(alice.id().clone(), secret_key.clone()); + let alice_signer = + InMemorySigner::from_secret_key(alice.id().clone(), alice_secret_key.clone()); // Create the near-fetch client pointing to the sandbox RPC let near_fetch_client = near_fetch::Client::new(&worker.rpc_addr()); @@ -61,7 +77,15 @@ impl TestFixture { let near_config = NearConfig::default(); let near_client = ContractClient::new( contract.id().clone(), - signer, + alice_signer, + near_fetch_client.clone(), + relayer_config.clone(), + near_config.timeout_secs, + ); + + let near_client_with_contract_signer = ContractClient::new( + contract.id().clone(), + contract_signer, near_fetch_client, relayer_config, near_config.timeout_secs, @@ -71,13 +95,16 @@ impl TestFixture { worker, contract, near_client, + near_client_with_contract_signer, }) } /// Initialize the contract with Sepolia test data pub async fn init_with_sepolia(&self) -> Result { let init_input = load_sepolia_init_data()?; - self.near_client.init_contract(init_input.clone()).await?; + self.near_client_with_contract_signer + .init_contract(init_input.clone()) + .await?; Ok(init_input) } @@ -86,7 +113,9 @@ impl TestFixture { let mut init_input = load_sepolia_init_data()?; init_input.validate_updates = false; init_input.verify_bls_signatures = false; - self.near_client.init_contract(init_input.clone()).await?; + self.near_client_with_contract_signer + .init_contract(init_input.clone()) + .await?; Ok(init_input) } } From 4765d3f3c1ef8364e22eda9e78752e56ac1a19ac Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Tue, 17 Mar 2026 23:55:50 -0400 Subject: [PATCH 07/14] fix: tests by granting `UnrestrictedSubmitLightClientUpdate` --- .../eth2-client/src/tests/integration_tests.rs | 13 +++++++++++++ contracts/near/eth2-client/src/tests/unit_tests.rs | 14 +++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/contracts/near/eth2-client/src/tests/integration_tests.rs b/contracts/near/eth2-client/src/tests/integration_tests.rs index 2233befc5..921c73029 100644 --- a/contracts/near/eth2-client/src/tests/integration_tests.rs +++ b/contracts/near/eth2-client/src/tests/integration_tests.rs @@ -98,6 +98,19 @@ mod integration_tests { .args_borsh(init_input) .transact() .await?; + + // Grant alice the UnrestrictedSubmitLightClientUpdate role so she passes + // the trusted_relayer guard on submit methods. The contract is super admin + // (set during init), so it can grant roles. + let _ = contract + .call("acl_grant_role") + .args_json(serde_json::json!({ + "role": "UnrestrictedSubmitLightClientUpdate", + "account_id": alice.id().to_string(), + })) + .transact() + .await?; + Ok((alice, contract)) } diff --git a/contracts/near/eth2-client/src/tests/unit_tests.rs b/contracts/near/eth2-client/src/tests/unit_tests.rs index ddf649db2..397c99175 100644 --- a/contracts/near/eth2-client/src/tests/unit_tests.rs +++ b/contracts/near/eth2-client/src/tests/unit_tests.rs @@ -4,6 +4,7 @@ mod tests { use crate::Eth2Client; use eth_types::eth2::LightClientUpdate; use eth_types::BlockHeader; + use near_plugins::AccessControllable; use near_sdk::test_utils::VMContextBuilder; use near_sdk::{test_vm_config, testing_env, AccountId}; @@ -50,9 +51,20 @@ mod tests { current_account_id: eth2_client_account(), predecessor_account_id: eth2_client_account(), ); - let contract = Eth2Client::init(init_input); + let mut contract = Eth2Client::init(init_input); assert_eq!(contract.last_block_number(), headers[0][0].number); + // Grant the UnrestrictedSubmitLightClientUpdate role to accounts(0) (the common + // test submitter) so it passes the trusted_relayer guard injected by the + // #[trusted_relayer] macro. The super admin (eth2_client_account) was set during init(). + // Note: only accounts(0) gets the role. Other accounts (e.g. accounts(1)) intentionally + // do NOT get it, so tests like test_panic_on_submit_update_paused still work correctly. + use near_sdk::test_utils::accounts; + contract.acl_grant_role( + crate::Role::UnrestrictedSubmitLightClientUpdate.into(), + accounts(0), + ); + TestContext { contract, headers: &headers, From dd3269a9a4cad382d67051448473edec96547e94 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Wed, 18 Mar 2026 00:30:59 -0400 Subject: [PATCH 08/14] fix(eth2-client): clippy --- contracts/near/eth2-client/src/lib.rs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts/near/eth2-client/src/lib.rs b/contracts/near/eth2-client/src/lib.rs index 7439a7504..ee21766b6 100644 --- a/contracts/near/eth2-client/src/lib.rs +++ b/contracts/near/eth2-client/src/lib.rs @@ -138,7 +138,7 @@ impl Eth2Client { hashes_gc_threshold: args.hashes_gc_threshold, network: args.network, finalized_execution_blocks: LookupMap::new(StorageKey::FinalizedExecutionBlocks), - finalized_beacon_header: args.finalized_beacon_header.into(), + finalized_beacon_header: args.finalized_beacon_header, finalized_execution_header: LazyOption::new( StorageKey::FinalizedExecutionHeader, Some(&finalized_execution_header_info), @@ -295,8 +295,7 @@ impl Eth2Client { { let header_number_to_remove = (finalized_execution_header.block_number + diff_between_unfinalized_head_and_tail) - .checked_sub(self.hashes_gc_threshold) - .unwrap_or(0); + .saturating_sub(self.hashes_gc_threshold); require!( header_number_to_remove < finalized_execution_header.block_number, @@ -569,8 +568,8 @@ impl Eth2Client { Self::fp2_to_u8(&msg_fp2[0], &mut msg_fp2_0); Self::fp2_to_u8(&msg_fp2[1], &mut msg_fp2_1); - let mut msg_g2_0 = env::bls12381_map_fp2_to_g2(&msg_fp2_0); - let mut msg_g2_1 = env::bls12381_map_fp2_to_g2(&msg_fp2_1); + let mut msg_g2_0 = env::bls12381_map_fp2_to_g2(msg_fp2_0); + let mut msg_g2_1 = env::bls12381_map_fp2_to_g2(msg_fp2_1); let mut msg_g2_concat = vec![0u8; 1]; msg_g2_concat.append(&mut msg_g2_0); msg_g2_concat.push(0); From f8134d2bfa42f41b25c4fc060beae4e823c96b1a Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Wed, 18 Mar 2026 00:31:37 -0400 Subject: [PATCH 09/14] fix(relayer): lifecycle tests --- relayer/tests/common/mod.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/relayer/tests/common/mod.rs b/relayer/tests/common/mod.rs index 34d5c2d82..369402c75 100644 --- a/relayer/tests/common/mod.rs +++ b/relayer/tests/common/mod.rs @@ -18,6 +18,7 @@ pub struct TestFixture { pub contract: Contract, pub near_client: ContractClient, pub near_client_with_contract_signer: ContractClient, + relayer_account_id: near_workspaces::AccountId, } impl TestFixture { @@ -96,6 +97,7 @@ impl TestFixture { contract, near_client, near_client_with_contract_signer, + relayer_account_id: alice.id().clone(), }) } @@ -105,6 +107,7 @@ impl TestFixture { self.near_client_with_contract_signer .init_contract(init_input.clone()) .await?; + self.grant_relayer_role().await?; Ok(init_input) } @@ -116,8 +119,26 @@ impl TestFixture { self.near_client_with_contract_signer .init_contract(init_input.clone()) .await?; + self.grant_relayer_role().await?; Ok(init_input) } + + /// Grant the relayer's signer the UnrestrictedSubmitLightClientUpdate role + /// so it passes the trusted_relayer guard on submit methods. + /// Must be called after init, since init resets ACL state via acl_init_super_admin. + async fn grant_relayer_role(&self) -> Result<()> { + self.contract + .call("acl_grant_role") + .args_json(serde_json::json!({ + "role": "UnrestrictedSubmitLightClientUpdate", + "account_id": self.relayer_account_id.to_string(), + })) + .transact() + .await? + .into_result() + .wrap_err("Failed to grant UnrestrictedSubmitLightClientUpdate role")?; + Ok(()) + } } /// Simple helper to load Sepolia test data From b4e64c1e157065a0922e9076fe996e4bb0c4b3b8 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Wed, 18 Mar 2026 00:52:10 -0400 Subject: [PATCH 10/14] feat: different bypass roles for different methods --- contracts/near/Cargo.lock | 4 ++-- contracts/near/Cargo.toml | 2 +- contracts/near/eth2-client/src/lib.rs | 5 ++--- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/contracts/near/Cargo.lock b/contracts/near/Cargo.lock index 121055881..85a8b51f6 100644 --- a/contracts/near/Cargo.lock +++ b/contracts/near/Cargo.lock @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "omni-utils" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=f1e99f128b622182055da0e3b8c91131ca2d8d3b#f1e99f128b622182055da0e3b8c91131ca2d8d3b" +source = "git+https://github.com/near-one/omni-utils?rev=8362aacb90fd1b50ca34be28a1e8377e116874bb#8362aacb90fd1b50ca34be28a1e8377e116874bb" dependencies = [ "near-sdk", "omni-utils-derive", @@ -3393,7 +3393,7 @@ dependencies = [ [[package]] name = "omni-utils-derive" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=f1e99f128b622182055da0e3b8c91131ca2d8d3b#f1e99f128b622182055da0e3b8c91131ca2d8d3b" +source = "git+https://github.com/near-one/omni-utils?rev=8362aacb90fd1b50ca34be28a1e8377e116874bb#8362aacb90fd1b50ca34be28a1e8377e116874bb" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/near/Cargo.toml b/contracts/near/Cargo.toml index d47b7ba78..537bc66ca 100644 --- a/contracts/near/Cargo.toml +++ b/contracts/near/Cargo.toml @@ -35,7 +35,7 @@ derive_more = "^0.99.2" hex = "0.4.2" bitvec = "1.0.0" near-plugins = { git = "https://github.com/aurora-is-near/near-plugins", tag = "v0.4.1" } -omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "f1e99f128b622182055da0e3b8c91131ca2d8d3b" } +omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "8362aacb90fd1b50ca34be28a1e8377e116874bb" } [patch] [patch.crates-io] diff --git a/contracts/near/eth2-client/src/lib.rs b/contracts/near/eth2-client/src/lib.rs index ee21766b6..f72188403 100644 --- a/contracts/near/eth2-client/src/lib.rs +++ b/contracts/near/eth2-client/src/lib.rs @@ -93,7 +93,6 @@ pub struct Eth2Client { } #[trusted_relayer( - bypass_roles(Role::DAO, Role::UnrestrictedSubmitLightClientUpdate), manager_roles(Role::DAO, Role::RelayerManager), config_roles(Role::DAO) )] @@ -234,7 +233,7 @@ impl Eth2Client { .map(|header| header.block_number) } - #[trusted_relayer] + #[trusted_relayer(bypass_roles(Role::DAO, Role::UnrestrictedSubmitLightClientUpdate))] #[pause(except(roles(Role::UnrestrictedSubmitLightClientUpdate, Role::DAO)))] pub fn submit_beacon_chain_light_client_update( &mut self, @@ -250,7 +249,7 @@ impl Eth2Client { } #[result_serializer(borsh)] - #[trusted_relayer] + #[trusted_relayer(bypass_roles(Role::DAO, Role::UnrestrictedSubmitExecutionHeader))] #[pause(except(roles(Role::UnrestrictedSubmitExecutionHeader, Role::DAO)))] pub fn submit_execution_header(&mut self, #[serializer(borsh)] block_header: BlockHeader) { if let Some(trusted_blocks_submitter) = &self.trusted_blocks_submitter { From af6b3684912b4a35bed0ad2ff83839ab04aaff66 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Wed, 18 Mar 2026 01:13:50 -0400 Subject: [PATCH 11/14] fix(tests): grant `UnrestrictedSubmitExecutionHeader` role --- .../eth2-client/src/tests/integration_tests.rs | 14 +++++++++++--- contracts/near/eth2-client/src/tests/unit_tests.rs | 4 ++++ relayer/tests/common/mod.rs | 14 ++++++++++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/contracts/near/eth2-client/src/tests/integration_tests.rs b/contracts/near/eth2-client/src/tests/integration_tests.rs index 921c73029..b116e9ddc 100644 --- a/contracts/near/eth2-client/src/tests/integration_tests.rs +++ b/contracts/near/eth2-client/src/tests/integration_tests.rs @@ -99,9 +99,9 @@ mod integration_tests { .transact() .await?; - // Grant alice the UnrestrictedSubmitLightClientUpdate role so she passes - // the trusted_relayer guard on submit methods. The contract is super admin - // (set during init), so it can grant roles. + // Grant alice the bypass roles so she passes the trusted_relayer guard + // on submit methods. The contract is super admin (set during init), so + // it can grant roles. let _ = contract .call("acl_grant_role") .args_json(serde_json::json!({ @@ -110,6 +110,14 @@ mod integration_tests { })) .transact() .await?; + let _ = contract + .call("acl_grant_role") + .args_json(serde_json::json!({ + "role": "UnrestrictedSubmitExecutionHeader", + "account_id": alice.id().to_string(), + })) + .transact() + .await?; Ok((alice, contract)) } diff --git a/contracts/near/eth2-client/src/tests/unit_tests.rs b/contracts/near/eth2-client/src/tests/unit_tests.rs index 397c99175..02bdab0e5 100644 --- a/contracts/near/eth2-client/src/tests/unit_tests.rs +++ b/contracts/near/eth2-client/src/tests/unit_tests.rs @@ -64,6 +64,10 @@ mod tests { crate::Role::UnrestrictedSubmitLightClientUpdate.into(), accounts(0), ); + contract.acl_grant_role( + crate::Role::UnrestrictedSubmitExecutionHeader.into(), + accounts(0), + ); TestContext { contract, diff --git a/relayer/tests/common/mod.rs b/relayer/tests/common/mod.rs index 369402c75..c747340c3 100644 --- a/relayer/tests/common/mod.rs +++ b/relayer/tests/common/mod.rs @@ -123,8 +123,8 @@ impl TestFixture { Ok(init_input) } - /// Grant the relayer's signer the UnrestrictedSubmitLightClientUpdate role - /// so it passes the trusted_relayer guard on submit methods. + /// Grant the relayer's signer the bypass roles so it passes the + /// trusted_relayer guard on submit methods. /// Must be called after init, since init resets ACL state via acl_init_super_admin. async fn grant_relayer_role(&self) -> Result<()> { self.contract @@ -137,6 +137,16 @@ impl TestFixture { .await? .into_result() .wrap_err("Failed to grant UnrestrictedSubmitLightClientUpdate role")?; + self.contract + .call("acl_grant_role") + .args_json(serde_json::json!({ + "role": "UnrestrictedSubmitExecutionHeader", + "account_id": self.relayer_account_id.to_string(), + })) + .transact() + .await? + .into_result() + .wrap_err("Failed to grant UnrestrictedSubmitExecutionHeader role")?; Ok(()) } } From 931c2512aba5f9756da3b4c4900dcf334c491209 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Wed, 18 Mar 2026 18:58:47 -0400 Subject: [PATCH 12/14] chore: removed unrestricted roles from paused --- contracts/near/eth2-client/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/near/eth2-client/src/lib.rs b/contracts/near/eth2-client/src/lib.rs index f72188403..180490703 100644 --- a/contracts/near/eth2-client/src/lib.rs +++ b/contracts/near/eth2-client/src/lib.rs @@ -234,7 +234,7 @@ impl Eth2Client { } #[trusted_relayer(bypass_roles(Role::DAO, Role::UnrestrictedSubmitLightClientUpdate))] - #[pause(except(roles(Role::UnrestrictedSubmitLightClientUpdate, Role::DAO)))] + #[pause(except(roles(Role::DAO)))] pub fn submit_beacon_chain_light_client_update( &mut self, #[serializer(borsh)] update: LightClientUpdate, @@ -250,7 +250,7 @@ impl Eth2Client { #[result_serializer(borsh)] #[trusted_relayer(bypass_roles(Role::DAO, Role::UnrestrictedSubmitExecutionHeader))] - #[pause(except(roles(Role::UnrestrictedSubmitExecutionHeader, Role::DAO)))] + #[pause(except(roles(Role::DAO)))] pub fn submit_execution_header(&mut self, #[serializer(borsh)] block_header: BlockHeader) { if let Some(trusted_blocks_submitter) = &self.trusted_blocks_submitter { require!( From d8f29a8e61878b23ba1e05c8f77e6624468413a1 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Thu, 19 Mar 2026 15:32:54 -0400 Subject: [PATCH 13/14] chore: updated `omni-utils` --- contracts/near/Cargo.lock | 4 ++-- contracts/near/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/near/Cargo.lock b/contracts/near/Cargo.lock index 85a8b51f6..dcb540892 100644 --- a/contracts/near/Cargo.lock +++ b/contracts/near/Cargo.lock @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "omni-utils" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=8362aacb90fd1b50ca34be28a1e8377e116874bb#8362aacb90fd1b50ca34be28a1e8377e116874bb" +source = "git+https://github.com/near-one/omni-utils?rev=068950734e6520e311adaaa6c3bd71a42d80e0df#068950734e6520e311adaaa6c3bd71a42d80e0df" dependencies = [ "near-sdk", "omni-utils-derive", @@ -3393,7 +3393,7 @@ dependencies = [ [[package]] name = "omni-utils-derive" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=8362aacb90fd1b50ca34be28a1e8377e116874bb#8362aacb90fd1b50ca34be28a1e8377e116874bb" +source = "git+https://github.com/near-one/omni-utils?rev=068950734e6520e311adaaa6c3bd71a42d80e0df#068950734e6520e311adaaa6c3bd71a42d80e0df" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/near/Cargo.toml b/contracts/near/Cargo.toml index 537bc66ca..0723f0769 100644 --- a/contracts/near/Cargo.toml +++ b/contracts/near/Cargo.toml @@ -35,7 +35,7 @@ derive_more = "^0.99.2" hex = "0.4.2" bitvec = "1.0.0" near-plugins = { git = "https://github.com/aurora-is-near/near-plugins", tag = "v0.4.1" } -omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "8362aacb90fd1b50ca34be28a1e8377e116874bb" } +omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "068950734e6520e311adaaa6c3bd71a42d80e0df" } [patch] [patch.crates-io] From 961a43815cc64aa828dc6d6bd70d6cef64140693 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Thu, 19 Mar 2026 15:58:56 -0400 Subject: [PATCH 14/14] chore: updated `omni-utils` --- contracts/near/Cargo.lock | 4 ++-- contracts/near/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/near/Cargo.lock b/contracts/near/Cargo.lock index dcb540892..23f1674c9 100644 --- a/contracts/near/Cargo.lock +++ b/contracts/near/Cargo.lock @@ -3382,7 +3382,7 @@ dependencies = [ [[package]] name = "omni-utils" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=068950734e6520e311adaaa6c3bd71a42d80e0df#068950734e6520e311adaaa6c3bd71a42d80e0df" +source = "git+https://github.com/near-one/omni-utils?rev=077d09daf7a7b32ad237f0530033c7db804f2c67#077d09daf7a7b32ad237f0530033c7db804f2c67" dependencies = [ "near-sdk", "omni-utils-derive", @@ -3393,7 +3393,7 @@ dependencies = [ [[package]] name = "omni-utils-derive" version = "0.1.0" -source = "git+https://github.com/near-one/omni-utils?rev=068950734e6520e311adaaa6c3bd71a42d80e0df#068950734e6520e311adaaa6c3bd71a42d80e0df" +source = "git+https://github.com/near-one/omni-utils?rev=077d09daf7a7b32ad237f0530033c7db804f2c67#077d09daf7a7b32ad237f0530033c7db804f2c67" dependencies = [ "proc-macro2", "quote", diff --git a/contracts/near/Cargo.toml b/contracts/near/Cargo.toml index 0723f0769..e822df996 100644 --- a/contracts/near/Cargo.toml +++ b/contracts/near/Cargo.toml @@ -35,7 +35,7 @@ derive_more = "^0.99.2" hex = "0.4.2" bitvec = "1.0.0" near-plugins = { git = "https://github.com/aurora-is-near/near-plugins", tag = "v0.4.1" } -omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "068950734e6520e311adaaa6c3bd71a42d80e0df" } +omni-utils = { git = "https://github.com/near-one/omni-utils", rev = "077d09daf7a7b32ad237f0530033c7db804f2c67" } [patch] [patch.crates-io]