From 6a9a646720e1def63d466368c6dc6a2edd3996da Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Sat, 18 Jan 2025 22:46:02 -0500 Subject: [PATCH 1/9] feat: handle gas estimation error --- omni-relayer/Cargo.lock | 222 ++++++++++++++++---------------- omni-relayer/Cargo.toml | 22 ++-- omni-relayer/src/workers/evm.rs | 13 +- 3 files changed, 137 insertions(+), 120 deletions(-) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 00f4bd7c..dca33946 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -108,9 +108,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" +checksum = "bbcc41e8a11a4975b18ec6afba2cc48d591fa63336a4c526dacb50479a8d6b35" dependencies = [ "alloy-consensus", "alloy-contract", @@ -144,9 +144,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" +checksum = "f4138dc275554afa6f18c4217262ac9388790b2fc393c2dfe03c51d357abf013" dependencies = [ "alloy-eips", "alloy-primitives", @@ -161,9 +161,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +checksum = "0fa04e1882c31288ce1028fdf31b6ea94cfa9eafa2e497f903ded631c8c6a42c" dependencies = [ "alloy-consensus", "alloy-eips", @@ -175,9 +175,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" +checksum = "5f21886c1fea0626f755a49b2ac653b396fb345233f6170db2da3d0ada31560c" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -237,9 +237,9 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" +checksum = "cabf647eb4650c91a9d38cb6f972bb320009e7e9d61765fb688a86f1563b33e8" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -249,9 +249,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" +checksum = "52dd5869ed09e399003e0e0ec6903d981b2a92e74c5d37e6b40890bad2517526" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -267,10 +267,11 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" +checksum = "e7d2a7fe5c1a9bd6793829ea21a636f30fc2b3f5d2e7418ba86d96e41dd1f460" dependencies = [ + "alloy-eips", "alloy-primitives", "alloy-serde", "alloy-trie", @@ -291,9 +292,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" +checksum = "2008bedb8159a255b46b7c8614516eda06679ea82f620913679afbd8031fea72" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -305,9 +306,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" +checksum = "4556f01fe41d0677495df10a648ddcf7ce118b0e8aa9642a0e2b6dd1fb7259de" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -330,9 +331,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" +checksum = "f31c3c6b71340a1d076831823f09cb6e02de01de5c6630a9631bdb36f947ff80" dependencies = [ "alloy-consensus", "alloy-eips", @@ -343,9 +344,9 @@ dependencies = [ [[package]] name = "alloy-node-bindings" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aef9849fb8bbb28f69f2cbdb4b0dac2f0e35c04f6078a00dfb8486469aed02de" +checksum = "4520cd4bc5cec20c32c98e4bc38914c7fb96bf4a712105e44da186a54e65e3ba" dependencies = [ "alloy-genesis", "alloy-primitives", @@ -387,9 +388,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" +checksum = "5a22c4441b3ebe2d77fa9cf629ba68c3f713eb91779cff84275393db97eddd82" dependencies = [ "alloy-chains", "alloy-consensus", @@ -430,9 +431,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "695809e743628d54510c294ad17a4645bd9f465aeb0d20ee9ce9877c9712dc9c" +checksum = "2269fd635f7b505f27c63a3cb293148cd02301efce4c8bdd9ff54fbfc4a20e23" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -471,9 +472,9 @@ dependencies = [ [[package]] name = "alloy-rpc-client" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" +checksum = "d06a292b37e182e514903ede6e623b9de96420e8109ce300da288a96d88b7e4b" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -496,9 +497,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" +checksum = "9383845dd924939e7ab0298bbfe231505e20928907d7905aa3bf112287305e06" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -508,9 +509,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-anvil" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed06bd8a5fc57b352a6cbac24eec52a4760f08ae2c1eb56ac49c8ed4b02c351" +checksum = "11495cb8c8d3141fc27556a4c9188b81531ad5ec3076a0394c61a6dcfbce9f34" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -520,9 +521,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +checksum = "ca445cef0eb6c2cf51cfb4e214fbf1ebd00893ae2e6f3b944c8101b07990f988" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -531,9 +532,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" +checksum = "0938bc615c02421bd86c1733ca7205cc3d99a122d9f9bff05726bd604b76a5c2" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -543,17 +544,17 @@ dependencies = [ "alloy-rlp", "alloy-serde", "alloy-sol-types", - "derive_more 1.0.0", "itertools 0.13.0", "serde", "serde_json", + "thiserror 2.0.11", ] [[package]] name = "alloy-serde" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" +checksum = "ae0465c71d4dced7525f408d84873aeebb71faf807d22d74c4a426430ccd9b55" dependencies = [ "alloy-primitives", "serde", @@ -562,9 +563,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" +checksum = "9bfa395ad5cc952c82358d31e4c68b27bf4a89a5456d9b27e226e77dac50e4ff" dependencies = [ "alloy-primitives", "async-trait", @@ -576,9 +577,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" +checksum = "fbdc63ce9eda1283fcbaca66ba4a414b841c0e3edbeef9c86a71242fc9e84ccc" dependencies = [ "alloy-consensus", "alloy-network", @@ -662,9 +663,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" +checksum = "d17722a198f33bbd25337660787aea8b8f57814febb7c746bc30407bdfc39448" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -682,9 +683,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" +checksum = "6e1509599021330a31c4a6816b655e34bf67acb1cc03c564e09fd8754ff6c5de" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -697,9 +698,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "0.8.3" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fba0e39d181d13c266dbb8ca54ed584a2c66d6e9279afca89c7a6b1825e98abb" +checksum = "58011745b2f17b334db40df9077d75b181f78360a5bc5c35519e15d4bfce15e2" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -1755,11 +1756,11 @@ dependencies = [ [[package]] name = "borsh" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb65153674e51d3a42c8f27b05b9508cea85edfaade8aa46bc8fc18cecdfef3" +checksum = "5430e3be710b68d984d1391c854eb431a9d548640711faa54eecb1df93db91cc" dependencies = [ - "borsh-derive 1.5.4", + "borsh-derive 1.5.5", "cfg_aliases", ] @@ -1778,9 +1779,9 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.4" +version = "1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a396e17ad94059c650db3d253bb6e25927f1eb462eede7e7a153bb6e75dce0a7" +checksum = "f8b668d39970baad5356d7c83a86fee3a539e6f93bf6764c97368243e17a0487" dependencies = [ "once_cell", "proc-macro-crate 3.2.0", @@ -1814,13 +1815,15 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ "eth-proof", "ethers", "near-light-client-on-eth", "near-rpc-client", "serde_json", + "solana-bridge-client", + "solana-client", "thiserror 2.0.11", ] @@ -3180,9 +3183,9 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "cita_trie", "ethereum-types 0.14.1", "hasher", @@ -3549,9 +3552,9 @@ dependencies = [ [[package]] name = "evm-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "bridge-connector-common", "derive_builder 0.20.2", "eth-proof", @@ -5053,16 +5056,16 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35cbb989542587b47205e608324ddd391f0cee1c22b4b64ae49f458334b95907" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "serde", ] [[package]] name = "near-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "bridge-connector-common", "derive_builder 0.20.2", "near-contract-standards", @@ -5141,7 +5144,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43b17944c8d0f274c684227d79fcd46d583b1e36064b597c53a9ebec187a86f3" dependencies = [ "blake2", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.4.0", "curve25519-dalek 4.1.3", "derive_more 0.99.18", @@ -5166,7 +5169,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4374804fdd45ac84c9e7cc3183312c98560c5518d81e6d8e2d92b77587e5a9f3" dependencies = [ "blake2", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.4.0", "curve25519-dalek 4.1.3", "derive_more 0.99.18", @@ -5209,7 +5212,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180edcc7dc2fac41f93570d0c7b759c1b6d492f6ad093d749d644a40b4310a97" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "serde", ] @@ -5230,7 +5233,7 @@ version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e66a0c4c47f2fbbfa11ea8317fce2288d70d4aa8231e77fd213721ffcc1c334f" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "lazy_static", "log", "near-chain-configs", @@ -5289,7 +5292,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5303,7 +5306,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d4b4d014ac9f46baf0eeac7214567a08db97d5fd26157ea13edfbb8ffc5fd8c" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "enum-map", "near-account-id", "near-primitives-core 0.27.0", @@ -5322,7 +5325,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1279baa276725971d5e2b80c524d1aa42d5ad8bccf8901466fd579374cf58a14" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "enum-map", "near-account-id", "near-primitives-core 0.28.0", @@ -5344,7 +5347,7 @@ dependencies = [ "arbitrary", "base64 0.21.7", "bitvec", - "borsh 1.5.4", + "borsh 1.5.5", "bytes", "bytesize", "cfg-if 1.0.0", @@ -5383,7 +5386,7 @@ dependencies = [ "arbitrary", "base64 0.21.7", "bitvec", - "borsh 1.5.4", + "borsh 1.5.5", "bytes", "bytesize", "cfg-if 1.0.0", @@ -5424,7 +5427,7 @@ checksum = "0de2c9da5de096b5cd4786a270900ff32a49d267e442a2e7f271fb23eb925c87" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.4.0", "derive_more 0.99.18", "enum-map", @@ -5445,7 +5448,7 @@ checksum = "d597af103bb7881d1fb9031fb126cfe6c1acb9c9a6c8296dca45b5b3beb0893d" dependencies = [ "arbitrary", "base64 0.21.7", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.4.0", "derive_more 0.99.18", "enum-map", @@ -5461,9 +5464,9 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "lazy_static", "near-crypto 0.28.0", "near-jsonrpc-client", @@ -5526,7 +5529,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "befb9df6da1a6a0b6656388c0db76084867062a87f1cbc066c188a8e360b6463" dependencies = [ "base64 0.22.1", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.5.1", "near-account-id", "near-gas", @@ -5600,7 +5603,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd3e60aa26a74dc514b1b6408fdd06cefe2eb0ff029020956c1c6517594048fd" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "serde", ] @@ -5854,9 +5857,9 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "bridge-connector-common", "derive_builder 0.20.2", "eth-proof", @@ -5885,7 +5888,8 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", - "borsh 1.5.4", + "borsh 1.5.5", + "bridge-connector-common", "chrono", "clap", "dotenv", @@ -5927,7 +5931,7 @@ dependencies = [ "alloy-rlp", "alloy-sol-macro", "alloy-sol-types", - "borsh 1.5.4", + "borsh 1.5.5", "ethereum-types 0.15.1", "hex", "near-contract-standards", @@ -6041,7 +6045,7 @@ version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7bb71e1b3fa6ca1c61f383464aaf2bb0e2f8e772a1f01d486832464de363b951" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "num-traits", "rand 0.8.5", "serde", @@ -7448,9 +7452,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.135" +version = "1.0.136" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b0d7ba2887406110130a978386c4e1befb98c674b4fba677954e4db976630d9" +checksum = "336a0c23cf42a38d9eaa7cd22c7040d04e1228a19a933890805ffd00a16437d2" dependencies = [ "itoa", "memchr", @@ -7803,15 +7807,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81d1d3a9cd527faf389b47736e48580585d4f216705197c09b36affa1f5afdb1" dependencies = [ "borsh 0.10.4", - "borsh 1.5.4", + "borsh 1.5.5", ] [[package]] name = "solana-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "derive_builder 0.20.2", "mpl-token-metadata", "sha2 0.10.8", @@ -8008,7 +8012,7 @@ version = "2.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3831f21dfc426f7da989712ee52372584967452fd299f700a7615670a4203b3" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -8047,7 +8051,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "211353fe5133e13d0772520b410311d52b68de0482c7e8643095b90174df3f57" dependencies = [ "bincode", - "borsh 1.5.4", + "borsh 1.5.5", "getrandom 0.2.15", "js-sys", "num-traits", @@ -8196,7 +8200,7 @@ dependencies = [ "bitflags 2.8.0", "blake3", "borsh 0.10.4", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.5.1", "bv", "bytemuck", @@ -8276,7 +8280,7 @@ version = "2.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "776a7291be6ed77d34c6e637e8efdaf70315bde371532428d8b17da78b1a60aa" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "num-traits", "serde", "serde_derive", @@ -8348,7 +8352,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbc62c030963895f98b50bfbea6fe443200596be1b3009103e59d815248666f0" dependencies = [ "borsh 0.10.4", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -8517,7 +8521,7 @@ checksum = "2862fdadb9c6035bb7f8c74e5631064df36ee499bd10aae6146394ad218b5ebf" dependencies = [ "bincode", "bitflags 2.8.0", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.5.1", "bytemuck", "bytemuck_derive", @@ -8591,7 +8595,7 @@ version = "2.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e7a3642a378c45f5d6110048ef88848c1835ad079affc4804b833f9692906f24" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "libsecp256k1", "solana-define-syscall", "thiserror 1.0.69", @@ -8839,7 +8843,7 @@ dependencies = [ "Inflector", "base64 0.22.1", "bincode", - "borsh 1.5.4", + "borsh 1.5.5", "bs58 0.5.1", "lazy_static", "log", @@ -9093,7 +9097,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68034596cf4804880d265f834af1ff2f821ad5293e41fa0f8f59086c181fc38e" dependencies = [ "assert_matches", - "borsh 1.5.4", + "borsh 1.5.5", "num-derive 0.4.2", "num-traits", "solana-program", @@ -9108,7 +9112,7 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76fee7d65013667032d499adc3c895e286197a35a0d3a4643c80e7fd3e9969e3" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "num-derive 0.4.2", "num-traits", "solana-program", @@ -9177,9 +9181,9 @@ dependencies = [ [[package]] name = "spl-elgamal-registry" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a157622a63a4d12fbd8b347fd75ee442cb913137fa98647824c992fb049a15b" +checksum = "ce0f668975d2b0536e8a8fd60e56a05c467f06021dae037f1d0cfed0de2e231d" dependencies = [ "bytemuck", "solana-program", @@ -9217,7 +9221,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "bytemuck", "bytemuck_derive", "solana-program", @@ -9231,7 +9235,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41a7d5950993e1ff2680bd989df298eeb169367fb2f9deeef1f132de6e4e8016" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "bytemuck", "bytemuck_derive", "num-derive 0.4.2", @@ -9403,9 +9407,9 @@ dependencies = [ [[package]] name = "spl-token-confidential-transfer-ciphertext-arithmetic" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f1bf731fc65546330a7929a9735679add70f828dd076a4e69b59d3afb5423c" +checksum = "170378693c5516090f6d37ae9bad2b9b6125069be68d9acd4865bbe9fc8499fd" dependencies = [ "base64 0.22.1", "bytemuck", @@ -9415,16 +9419,16 @@ dependencies = [ [[package]] name = "spl-token-confidential-transfer-proof-extraction" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "383937e637ccbe546f736d5115344351ebd4d2a076907582335261da58236816" +checksum = "eff2d6a445a147c9d6dd77b8301b1e116c8299601794b558eafa409b342faf96" dependencies = [ "bytemuck", "solana-curve25519", "solana-program", "solana-zk-sdk", "spl-pod 0.5.0", - "thiserror 1.0.69", + "thiserror 2.0.11", ] [[package]] @@ -9476,7 +9480,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "solana-program", "spl-discriminator 0.3.0", "spl-pod 0.3.1", @@ -9490,7 +9494,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfb9c89dbc877abd735f05547dcf9e6e12c00c11d6d74d8817506cab4c99fdbb" dependencies = [ - "borsh 1.5.4", + "borsh 1.5.5", "num-derive 0.4.2", "num-traits", "solana-borsh", @@ -10865,7 +10869,7 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/rainbow-bridge-sdk-rs#a55de6b675fe8f9d198df3c94f0dc9c3b84d2c25" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" dependencies = [ "bridge-connector-common", "derive_builder 0.20.2", diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 90bac622..6ed6226b 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -22,9 +22,9 @@ borsh = "1.5.1" tokio = { version = "1", features = ["sync", "time", "macros", "rt-multi-thread"] } tokio-stream = { version = "0.1" } -solana-sdk = "2.1.5" -solana-client = "2.1.5" -solana-transaction-status = "2.1.5" +solana-sdk = "2.1.9" +solana-client = "2.1.9" +solana-transaction-status = "2.1.9" ethereum-types = "0.14.1" omni-types = { git = "https://github.com/near-one/omni-bridge", package = "omni-types", rev = "b0ca4e1fb6a34086076511d1162747b154fa8a55" } @@ -36,19 +36,21 @@ near-primitives = "0.28.0" near-crypto = "0.28.0" hex = "0.4.3" -alloy = { version = "0.8", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } +alloy = { version = "0.9", features = ["node-bindings", "providers", "rpc-types", "sol-types", "provider-ws", "signers", "signer-local"] } redis = { version = "0.28.1", features = ["aio", "tokio-comp"] } reqwest = "0.12" -eth-proof = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "eth-proof" } +eth-proof = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "eth-proof", branch = "feat/added-gas-estimation" } -near-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "near-bridge-client" } -evm-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "evm-bridge-client" } -solana-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "solana-bridge-client" } -wormhole-bridge-client = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "wormhole-bridge-client" } +bridge-connector-common = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "bridge-connector-common", branch = "feat/added-gas-estimation" } -omni-connector = { git = "https://github.com/Near-One/rainbow-bridge-sdk-rs", package = "omni-connector" } +near-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-bridge-client", branch = "feat/added-gas-estimation" } +evm-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "evm-bridge-client", branch = "feat/added-gas-estimation" } +solana-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "solana-bridge-client", branch = "feat/added-gas-estimation" } +wormhole-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "wormhole-bridge-client", branch = "feat/added-gas-estimation" } + +omni-connector = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "omni-connector", branch = "feat/added-gas-estimation" } [features] disable_fee_check = [] diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 1a9608f7..e8d966d3 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use anyhow::Result; +use bridge_connector_common::result::BridgeSdkError; use futures::future::join_all; use log::{info, warn}; @@ -269,7 +270,17 @@ async fn handle_init_transfer_event( ) .await; } - Err(err) => warn!("Failed to finalize InitTransfer: {}", err), + Err(err) => { + if let BridgeSdkError::EvmGasEstimateError(_) = err { + utils::redis::remove_event( + &mut redis_connection, + utils::redis::EVM_INIT_TRANSFER_EVENTS, + &key, + ) + .await; + } + warn!("Failed to finalize InitTransfer: {}", err); + } } if current_timestamp - init_transfer_with_timestamp.creation_timestamp From 08b896fea288e4301b7ace51b61db97e9c42d5ad Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Mon, 20 Jan 2025 20:26:25 -0500 Subject: [PATCH 2/9] fix: estimate gas in a correct place --- omni-relayer/Cargo.lock | 402 +++++++++++++++---------------- omni-relayer/src/workers/evm.rs | 9 - omni-relayer/src/workers/near.rs | 10 + 3 files changed, 211 insertions(+), 210 deletions(-) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index dca33946..fc71b4aa 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -372,7 +372,7 @@ dependencies = [ "derive_more 1.0.0", "foldhash", "hashbrown 0.15.2", - "indexmap 2.7.0", + "indexmap 2.7.1", "itoa", "k256", "keccak-asm", @@ -614,7 +614,7 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.7.0", + "indexmap 2.7.1", "proc-macro-error2", "proc-macro2", "quote", @@ -1815,7 +1815,7 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "eth-proof", "ethers", @@ -2012,7 +2012,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_json", "thiserror 1.0.69", @@ -2026,7 +2026,7 @@ checksum = "3fce8dd7fcfcbf3a0a87d8f515194b49d6135acab73e18bd380d1d93bb1a15eb" dependencies = [ "clap", "heck 0.4.1", - "indexmap 2.7.0", + "indexmap 2.7.1", "log", "proc-macro2", "quote", @@ -2121,9 +2121,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8eb5e908ef3a6efbe1ed62520fb7287959888c88485abe072543190ecc66783" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -2131,9 +2131,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.26" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b01801b5fc6a0a232407abc821660c9c6d25a1cafc0d4f85f29fb8d9afc121" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -3183,7 +3183,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "borsh 1.5.5", "cita_trie", @@ -3400,7 +3400,7 @@ dependencies = [ "chrono", "ethers-core", "reqwest 0.11.27", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_json", "thiserror 1.0.69", @@ -3509,7 +3509,7 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_json", "solang-parser", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "evm-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -3984,7 +3984,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -4003,7 +4003,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.2.0", - "indexmap 2.7.0", + "indexmap 2.7.1", "slab", "tokio", "tokio-util", @@ -4577,9 +4577,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "8c9c992b02b5b4c94ea26e32fe5bccb7aa7d9f390ab5c1221ff895bc7ea8b652" dependencies = [ "equivalent", "hashbrown 0.15.2", @@ -4619,9 +4619,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" @@ -5063,7 +5063,7 @@ dependencies = [ [[package]] name = "near-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "borsh 1.5.5", "lazy_static", @@ -5857,7 +5857,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -6210,7 +6210,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", - "indexmap 2.7.0", + "indexmap 2.7.1", ] [[package]] @@ -7040,7 +7040,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.24", + "semver 1.0.25", ] [[package]] @@ -7393,9 +7393,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cb6eb87a131f756572d7fb904f6e7b68633f09cca868c5df1c4b8d1a694bbba" +checksum = "f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03" dependencies = [ "serde", ] @@ -7452,9 +7452,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.136" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336a0c23cf42a38d9eaa7cd22c7040d04e1228a19a933890805ffd00a16437d2" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" dependencies = [ "itoa", "memchr", @@ -7504,7 +7504,7 @@ dependencies = [ "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_derive", "serde_json", @@ -7530,7 +7530,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "itoa", "ryu", "serde", @@ -7698,9 +7698,9 @@ dependencies = [ [[package]] name = "solana-account" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e5bfd02090b1a054b907dc21853789008c11f104ab06a5b671a2e25cca785c" +checksum = "8557558040a6bf34101ea0ded1647bafc21c2a9ea0913034fa6794a304ba6791" dependencies = [ "bincode", "serde", @@ -7712,9 +7712,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe596e5bc809e6a0788612fd7e25d6c1dcdfc71c45e1e3d2d54ff8286101b710" +checksum = "2353887223851d07071e790a6508d8df61032a5e01bb6f990d7abe7f58dde3aa" dependencies = [ "Inflector", "base64 0.22.1", @@ -7738,9 +7738,9 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380d316c01b4ecadcd4df39f00e4ad69cd88b93baad776aa4a74f0ec533079c" +checksum = "435bb722c456f78dd3ac33a1b4641c46d5d41de5b072422ae5b0dc9f486c0928" dependencies = [ "base64 0.22.1", "bs58 0.5.1", @@ -7754,9 +7754,9 @@ dependencies = [ [[package]] name = "solana-account-info" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9a5a802bc6ab2ba6a9d77580b038e7c2409932074f14fe35eaa64894a53c1e" +checksum = "abeb32e8dbead1f920a919d8c781fe058cf657313aa237566fa812d2288f2aab" dependencies = [ "bincode", "serde", @@ -7767,18 +7767,18 @@ dependencies = [ [[package]] name = "solana-atomic-u64" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bd7099cc7b9450feee5cefa9481af12b2671eceb09218738e242bdb6c25e4d" +checksum = "70ceb7242711300b8d67933a3cd1c9b2cd7c4e98de529356ecddf340c98c457d" dependencies = [ "parking_lot", ] [[package]] name = "solana-bincode" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ed7814b4f749c62973781a3d490af7b42b496b2b725cacb0a5477931cb27ef3" +checksum = "e154567b6846f4721c713afdd14c56892800fb940793ef529a68d6db6cf1beef" dependencies = [ "bincode", "serde", @@ -7787,9 +7787,9 @@ dependencies = [ [[package]] name = "solana-bn254" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418ef1dd3ae61a70543d2487d029e7bac2ff4fd2684bfb8e0350356808bac81c" +checksum = "44c42ad3282999ef7df859e7ed03a6e6a4187ff4931f9814ddcd0477dba2be15" dependencies = [ "ark-bn254", "ark-ec", @@ -7802,9 +7802,9 @@ dependencies = [ [[package]] name = "solana-borsh" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81d1d3a9cd527faf389b47736e48580585d4f216705197c09b36affa1f5afdb1" +checksum = "5b2428671e99134c97990d2b466c33779f785376b7934e6bddb635929c54208f" dependencies = [ "borsh 0.10.4", "borsh 1.5.5", @@ -7813,7 +7813,7 @@ dependencies = [ [[package]] name = "solana-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "borsh 1.5.5", "derive_builder 0.20.2", @@ -7828,16 +7828,16 @@ dependencies = [ [[package]] name = "solana-client" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c6c973380a8970007f85795131c32b770213213fa48b5f37d1bb6d60e1f0480" +checksum = "73d3a06371c4b63efa8d2dde9890b658891943807c529144eac6d2345538077d" dependencies = [ "async-trait", "bincode", "dashmap 5.5.3", "futures", "futures-util", - "indexmap 2.7.0", + "indexmap 2.7.1", "indicatif", "log", "quinn", @@ -7860,9 +7860,9 @@ dependencies = [ [[package]] name = "solana-clock" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f3beb4770cd15cdc4793cf10cb4ec502c51d944b64e32e34a116051dcbf5c2" +checksum = "1d639043cefcd061c31a342364adcb204406ebbd91ef86dfde88b74352b688cf" dependencies = [ "serde", "serde_derive", @@ -7872,18 +7872,18 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed7781a28477ec2269de84c96b77360db5c140c274549da54bf3dce2457ad07c" +checksum = "a6c885192c0afe6f7beac13e1c8eb51ce36bc60e8f0b7631f9cbf72d8ca6aa03" dependencies = [ "solana-sdk", ] [[package]] name = "solana-config-program" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc7b003aac6c1b2d9b71ba50482557eab5dc01c498be80ca08fe1f806d0cea1" +checksum = "056ce3a28f5e22677e0db1fc976294041571c4d471a752bfc9f1b06f8828c488" dependencies = [ "bincode", "chrono", @@ -7897,15 +7897,15 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "175181cb7cb0d100beb8d23891b77c73bca9f68ad454a95ae76e0069a5539fa8" +checksum = "52912ec1eb7b40af2a81269d0bb2cefba01f303383cba32067d0dc5020556e38" dependencies = [ "async-trait", "bincode", "crossbeam-channel", "futures-util", - "indexmap 2.7.0", + "indexmap 2.7.1", "log", "rand 0.8.5", "rayon", @@ -7918,9 +7918,9 @@ dependencies = [ [[package]] name = "solana-cpi" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b66925890e4108d10df357940da32ae01eea68d07b8da816eec4b93519db9d" +checksum = "5b87b387931f41422be3d82190e29c8414bbb4e8517dd94afb838012260d7a60" dependencies = [ "solana-account-info", "solana-define-syscall", @@ -7932,9 +7932,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73bc9e6fa982335c964ca18bc6721b26a604a993ceb7ad434d78548b2244c343" +checksum = "71b91a6c7db7874ab0721ba2ad49c34614c6af5bfa1a02f18ee471d28416b1fc" dependencies = [ "bytemuck", "bytemuck_derive", @@ -7945,24 +7945,24 @@ dependencies = [ [[package]] name = "solana-decode-error" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "925822f929d56870b2cbee5e00548de65043a1b5dc1021a2a0f6ca663227e96c" +checksum = "64b93163519c0b7419d3ac206207594d4b43e00267496996b898345ff3b31ed1" dependencies = [ "num-traits", ] [[package]] name = "solana-define-syscall" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d145184b5a9ada39c4cf1f5610cb33d342767c58f7fc87bd3b5ea51f183c2937" +checksum = "88d1b215d56d29f71782df6880d71b5a46cf9a4035046414488c7de6906899ba" [[package]] name = "solana-derivation-path" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d914fc833a4345226bb8a87b2ed898117c74f141c854369b1defa36f39896b7b" +checksum = "a31edf5d285689b469471a1a0200f0c9196be7df155860bd83dfd735439172bd" dependencies = [ "derivation-path", "qstring", @@ -7971,9 +7971,9 @@ dependencies = [ [[package]] name = "solana-epoch-schedule" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cf1615ea23ac98ffcec061c05f59b295913fa7b96de63c9cbb9a5800697b65" +checksum = "88aa6588f178c32258eb616ef1428f2c86beae370d6486843313f6320e055190" dependencies = [ "serde", "serde_derive", @@ -7983,9 +7983,9 @@ dependencies = [ [[package]] name = "solana-feature-set" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fe1cc20d938b4eb12ae8704c771ce8badd934a90bb7885f949a66084d659790" +checksum = "1736c5f6cb5d65e684a1daf425dd1479849e0793ffe877feedb602642ee5deb0" dependencies = [ "lazy_static", "solana-clock", @@ -7997,9 +7997,9 @@ dependencies = [ [[package]] name = "solana-fee-calculator" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8bfb0e586a88e566cf76425e04e0fe4cb1a268ac318ccc64417751a5fa96145" +checksum = "d2ef28a47c3fcfd4ef8b19468531e32a431f6589f359cdbb927fc5e7fb859413" dependencies = [ "log", "serde", @@ -8008,9 +8008,9 @@ dependencies = [ [[package]] name = "solana-hash" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3831f21dfc426f7da989712ee52372584967452fd299f700a7615670a4203b3" +checksum = "ad865143587f6173d0bd15ec66b749fd2682c865467ffd2bb725705e33f0c8fa" dependencies = [ "borsh 1.5.5", "bs58 0.5.1", @@ -8026,9 +8026,9 @@ dependencies = [ [[package]] name = "solana-inflation" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "500b21d44ebc7437392d821eb04e7ca6e175b6a397c91ec67634528ee5bace38" +checksum = "a205cb59db7fa1afc89ad5d960ac5afb997ba231cdc943451811746c84b7776d" dependencies = [ "serde", "serde_derive", @@ -8036,9 +8036,9 @@ dependencies = [ [[package]] name = "solana-inline-spl" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c4919a0297f62759609ded57516071cebb4ce25c34ba896708fcc94eda336c" +checksum = "a47d825ad3f7d3eede036d2c3b11eb385912eb3e01872bc98901802f942eab8a" dependencies = [ "bytemuck", "solana-pubkey", @@ -8046,9 +8046,9 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "211353fe5133e13d0772520b410311d52b68de0482c7e8643095b90174df3f57" +checksum = "af795f16bef3ae76e97978e35724ea88d2b9eba67a9e233adf48ccefeaa6e6b8" dependencies = [ "bincode", "borsh 1.5.5", @@ -8064,9 +8064,9 @@ dependencies = [ [[package]] name = "solana-last-restart-slot" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2aadfa60fa22080d7abb7fac2c5c172e9e4a3b4525164866e2b521a4eb81e450" +checksum = "f88c8171167f1fd4ef1e5a083fd0e8f35ac60aacd1ffe163a1ef7053a28524be" dependencies = [ "serde", "serde_derive", @@ -8076,24 +8076,24 @@ dependencies = [ [[package]] name = "solana-log-collector" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a6923b6b68c36f4f0c082a7f633cc94a2d209837a5af017c47fd3ac9eb8ea03" +checksum = "7922b879e4c03e00bf6ed21b1f8579ac71f6743d95c22306bd1ba8994e4f90e8" dependencies = [ "log", ] [[package]] name = "solana-measure" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19b1784996736f7786ed65a675c4b820c31e5e8c49a53bb16e6fde9a75bff5c" +checksum = "13208871c6d000a0c7b7546ae605934f5eda3745f80f6926da1b6097c08f2de2" [[package]] name = "solana-metrics" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd21ab7eb1c984cee70df89587a57f19cd925fe73baad4304d2c3081085d987e" +checksum = "555986e126fe32ad94217c5d87c94f79b7f13abf96ef9d8de20dacbcf1c407e5" dependencies = [ "crossbeam-channel", "gethostname", @@ -8106,24 +8106,24 @@ dependencies = [ [[package]] name = "solana-msg" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4818fcc8b1fa46f1d0c698a0645e0cf693baf4ab5654001fcaff4623187016cf" +checksum = "5aefec09cb47fb67b8f8c448e03491d4148c1749f27dcb74d1cfae6337695f94" dependencies = [ "solana-define-syscall", ] [[package]] name = "solana-native-token" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f974b363f72ce60a0ea1015592b6494b9e61f1692355f2536fb0202eb667bf" +checksum = "81520eff9f776e62faa36a07250fcc467e54ca31ca9c87ab566a88b2f2691c05" [[package]] name = "solana-net-utils" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71f808e6720ef8928f8aa44241b1832e57bdeb0ed77f7450318d536a99f282fc" +checksum = "6b409b10fee2d0cbb2a721fa3ce7d7f6f32e0d3ae1f5807b1d6bc91d75970c72" dependencies = [ "bincode", "crossbeam-channel", @@ -8140,9 +8140,9 @@ dependencies = [ [[package]] name = "solana-packet" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d850d00ae006f165509d64b4506e1906071711d5ef11cc4231a1eae84fe2a8ae" +checksum = "a1f8c6e8a2cb0839ef49d8c6e34e89a5bc5ed97da855bf49528bae8c57eb39ed" dependencies = [ "bincode", "bitflags 2.8.0", @@ -8154,9 +8154,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2deaf151dff638b700c814904cacea319de3f44db95d4d62ecaa889b84d7243" +checksum = "7fa10dd492bee710d0e231a3ff48c52d6e24f5339d97decaf1f0ddbde996f834" dependencies = [ "ahash", "bincode", @@ -8181,9 +8181,9 @@ dependencies = [ [[package]] name = "solana-precompile-error" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36924a10546f27619e0fbbcf6167376f4ea3a0dd9ec57a2727a4f4e5a6a7e8e0" +checksum = "83c01aefc15c451b4f573c1e4552f34ee8af53db285ee2f7ece17ef8b70d6c0a" dependencies = [ "num-traits", "solana-decode-error", @@ -8191,9 +8191,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ac6b4fe091557c72625c32a4f5e52999bd4065c5d994bb5bb7109cc491744d" +checksum = "4d3a72c5eafd348bc5e5b731b40ad8dfde3023632e34e5ca9e52a655266ffae7" dependencies = [ "base64 0.22.1", "bincode", @@ -8264,9 +8264,9 @@ dependencies = [ [[package]] name = "solana-program-entrypoint" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f296f87584dbc684ed1fb00f849803358d97f663ec2829165052d50c2d30de3" +checksum = "269ccabf1f3aff504a97aca0f8b72e6d3e1b7fb621cc18a2d21a28b17d52e112" dependencies = [ "solana-account-info", "solana-msg", @@ -8276,9 +8276,9 @@ dependencies = [ [[package]] name = "solana-program-error" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776a7291be6ed77d34c6e637e8efdaf70315bde371532428d8b17da78b1a60aa" +checksum = "02f7a81eeb5c3d44b2953c46215af390ca2951a0b8069836ffbf3d368b012b35" dependencies = [ "borsh 1.5.5", "num-traits", @@ -8292,9 +8292,9 @@ dependencies = [ [[package]] name = "solana-program-memory" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247aba89bb78002423229ac0c78d954f82ac02f493dbdecacaf94627fa18bdd1" +checksum = "1debcdd14cee4dbc2761c1e267e8888188fb469956df0e2144cd6e2962c2532a" dependencies = [ "num-traits", "solana-define-syscall", @@ -8302,24 +8302,24 @@ dependencies = [ [[package]] name = "solana-program-option" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5245d595c64114a5c973aede3ab03e14d5ad74f471c755251977e9d3591e7ad6" +checksum = "78b49ce216cce72eb0607610d2040b1979d999fe204f73ae2a669c2f4480d3c0" [[package]] name = "solana-program-pack" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a1acbe8f1e2895659b06440f036cf3dd9949dbef0a123cefb3394a6d4192b2" +checksum = "88ff47a5dd9881187e85a45641405d9d1c57e9ebdc813e2ff74a1aa1f1ec9042" dependencies = [ "solana-program-error", ] [[package]] name = "solana-program-runtime" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3893e28738a678954a51dd986bbe8b6f63eaaa6e43d9b5c0222d3b729033881" +checksum = "6d4647f4dfed31aaa307d8c4924fec3fc981e88dd340eec45273afa84f3d01a4" dependencies = [ "base64 0.22.1", "bincode", @@ -8347,9 +8347,9 @@ dependencies = [ [[package]] name = "solana-pubkey" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbc62c030963895f98b50bfbea6fe443200596be1b3009103e59d815248666f0" +checksum = "02016ff5f98314c886e219c023bffba188ad8d70dec007247bd7a9da50423ac0" dependencies = [ "borsh 0.10.4", "borsh 1.5.5", @@ -8374,15 +8374,15 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fad1f43c3f4c5bc92c392eefe1dc7f40e766477c9888c81810ef517270b6e2d" +checksum = "af610bc169985b016e1f66bc9f0cc19559c9da5fb6ee0b8984ea69b1302e6619" dependencies = [ "crossbeam-channel", "futures-util", "log", "reqwest 0.11.27", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_derive", "serde_json", @@ -8399,9 +8399,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df2c0258dafa383000bbceb45f69159cd90920382cbe151c48c82a90d27f70" +checksum = "5fa9aed25872d9af165499a9a2167d489ceb832d5e6eaa1aafa982286f62e06d" dependencies = [ "async-lock", "async-trait", @@ -8425,9 +8425,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "706679793106ab0c114427e03208645a130fc05e33cafae4f5a7cec9c88cfcde" +checksum = "7d0ea6818ea3ae2067b18ba8f82577de19094d7abbb918ffb5cf5d7b0a6ffe88" dependencies = [ "lazy_static", "num_cpus", @@ -8435,9 +8435,9 @@ dependencies = [ [[package]] name = "solana-rent" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d8893f797f09049e9c798dbc0aa58e489c42c51e553de7d1fa2504987b8a23" +checksum = "544fab48aacd3b9c740ef5206f30e8a44ef8bfe5676a9d7b1eed385265ec1265" dependencies = [ "serde", "serde_derive", @@ -8447,9 +8447,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6dcb6fa914bc6fdda7506ec699553ead8b38a70ea32bf722c68b7fdaade1de9" +checksum = "1ff2d4562f555ed4ca406d88483f2b8ad0248e41ea19721227ffb5c64529bff2" dependencies = [ "async-trait", "base64 0.22.1", @@ -8459,7 +8459,7 @@ dependencies = [ "log", "reqwest 0.11.27", "reqwest-middleware", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_derive", "serde_json", @@ -8474,9 +8474,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a2fb795a984724988d01e16ed9b20fa41be0d52896bb56192ad46483f34bf2" +checksum = "6a50f6a180457400c9843980f1dd5db32b1153c295005ca85edb84bb7625acae" dependencies = [ "anyhow", "base64 0.22.1", @@ -8484,7 +8484,7 @@ dependencies = [ "jsonrpc-core", "reqwest 0.11.27", "reqwest-middleware", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_derive", "serde_json", @@ -8498,9 +8498,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb8c63357d884f4d606f844d2bf6703774eacd5d1cfe6ee2c87941aab4a6960" +checksum = "5fa3be2840d3b8ebbdab96f62f59e0a9e6f9ba10f27b96a7d80d6897b15ff21a" dependencies = [ "solana-rpc-client", "solana-sdk", @@ -8509,15 +8509,15 @@ dependencies = [ [[package]] name = "solana-sanitize" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf852dfabddab832d6268fe69b5112a359a0085e1bebde0d4b97ff235bc31ae7" +checksum = "9677531dd4098d078515c66d69a04bfa0389d364a5c768561c719030b368a9db" [[package]] name = "solana-sdk" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2862fdadb9c6035bb7f8c74e5631064df36ee499bd10aae6146394ad218b5ebf" +checksum = "bf93cfd5f5af23b59789eba96b6a6afd92a3a18a3fc6652259bfa1f32743caf4" dependencies = [ "bincode", "bitflags 2.8.0", @@ -8579,9 +8579,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ec1a8efb928767da37e058ffcedce0e78b4c4fb865d99b713fabb1430e11bf0" +checksum = "3bded40f70accbe97030e5f7163017605e51a2631425229ec2b0a4339bd1163a" dependencies = [ "bs58 0.5.1", "proc-macro2", @@ -8591,9 +8591,9 @@ dependencies = [ [[package]] name = "solana-secp256k1-recover" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a3642a378c45f5d6110048ef88848c1835ad079affc4804b833f9692906f24" +checksum = "ee25b962814dec3c141e8182474046bae231f0521ed62c9bfdfb6722999ddc18" dependencies = [ "borsh 1.5.5", "libsecp256k1", @@ -8603,9 +8603,9 @@ dependencies = [ [[package]] name = "solana-secp256r1-program" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5af36984053fd8bfaae93721bf6b66b2de287b30570a705c9dbf8f2c3adf25a9" +checksum = "3ec53eff8861ab398b9ca4da7ef8c8da5d4170f8ea26557fc1581638b56326c1" dependencies = [ "bytemuck", "openssl", @@ -8623,18 +8623,18 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-serde-varint" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0a7f5a744d43c5377b59eff9ec8b356dc2a2b716d442efc06ef10f92002c4d3" +checksum = "4ff77c37cb995cc53ce1a4b78e5e9961957098677de6fdc6a4783ed37a8b0fcd" dependencies = [ "serde", ] [[package]] name = "solana-serialize-utils" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af95bad9c4cff358d959a8c210d5b7599e0c0b5f423c1510d086539438d77ad" +checksum = "57a10eb6e3177828145beaba85d352a4dbc47798fd95c5f86145e1a732684d6d" dependencies = [ "solana-instruction", "solana-pubkey", @@ -8643,9 +8643,9 @@ dependencies = [ [[package]] name = "solana-sha256-hasher" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "700bb300ed088d6c216fa32a2f383d290a9981b52620f7a39b37963a78d0fedb" +checksum = "98c4229293979bf8bda7db2243ae75e13695341375577a4c44b07e4f0b7a5d9e" dependencies = [ "sha2 0.10.8", "solana-define-syscall", @@ -8654,18 +8654,18 @@ dependencies = [ [[package]] name = "solana-short-vec" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7cebf9572316822eb5aa18a0b80d38b1019a8d50e95e1c3de1d9cba9525635e" +checksum = "fc6a2a88d56e6771329970059bcab0fde9a719c8edae173fb26b2c08e427495a" dependencies = [ "serde", ] [[package]] name = "solana-signature" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b4b471b990a124e49241e451f01bcdbdfb9402614e8305cd5434d92d4703a7" +checksum = "f1e8a078879d8430cdfbee8e3c1cdf17da74c19d304662580fc463dc91e17699" dependencies = [ "bs58 0.5.1", "ed25519-dalek 1.0.1", @@ -8678,9 +8678,9 @@ dependencies = [ [[package]] name = "solana-slot-hashes" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a25b7a24f410863eb9d2e69c19e412204c44cbaa338f45848a10111e0e100c94" +checksum = "88fa2a6e60f2d7016cf95429e0f60cf4a04d4eed167abd1a5f8b08cbda695893" dependencies = [ "serde", "serde_derive", @@ -8690,9 +8690,9 @@ dependencies = [ [[package]] name = "solana-slot-history" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86af3c9471bded9a0d495e57f731fe98f888c69ce38486e10376b150435e99f3" +checksum = "c0fa66272c308c39a3ce1ca2a9c422de4bdedc28cfe706d6f2c68727bb626eb7" dependencies = [ "bv", "serde", @@ -8702,9 +8702,9 @@ dependencies = [ [[package]] name = "solana-stable-layout" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b30fdf9ed421722d929b391e002a62006e87551befadd22c10affcc9a5056e3" +checksum = "2243571ebf8c0c9915c7e71b17469e173c6755fa58af8eb529db3dda84e3e19a" dependencies = [ "solana-instruction", "solana-pubkey", @@ -8712,9 +8712,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464652b6e4b9be1212c0c67b4b3310257d7858a074587e35ec9a06851fb58794" +checksum = "fddc2b38975c25199456ff46307c484affb459b84aedefe9618aece2a92326a9" dependencies = [ "async-channel", "bytes", @@ -8724,7 +8724,7 @@ dependencies = [ "futures-util", "governor", "histogram", - "indexmap 2.7.0", + "indexmap 2.7.1", "itertools 0.12.1", "libc", "log", @@ -8750,18 +8750,18 @@ dependencies = [ [[package]] name = "solana-sysvar-id" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7bc21f82be2eedceb3e97ce80013ddb377b95ee14fbb6f76310757f5515af" +checksum = "5822b63dd59f124e4920df8d87640a288bb40f4016fd275d028fee0b94a5a51e" dependencies = [ "solana-pubkey", ] [[package]] name = "solana-thin-client" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfb191062bc8b2b1634092ef358cb5a8bbd3b17650565f823fda7050fda44c1" +checksum = "1915dcb44dd5763a30aa32a687057e6a3b16781eb9f5db2800548990560272c3" dependencies = [ "bincode", "log", @@ -8774,9 +8774,9 @@ dependencies = [ [[package]] name = "solana-timings" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434a264d3062a5f95caeb3cc7930bfb93fef96ded85d4ff25632081369b7cc74" +checksum = "088c4507c8fd4f81c4039d78baf1ea7d68c8b80b2a973ba60838d33d2f7e752d" dependencies = [ "eager", "enum-iterator", @@ -8785,14 +8785,14 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88bb24a851403e2f7c2c1492b2c0a0893f53c398debaaed1037856d0d21a6b08" +checksum = "3f944cd29eb540ca7e8df03c4e6043d5b8042eadab29b1848245c847a7c7c555" dependencies = [ "async-trait", "bincode", "futures-util", - "indexmap 2.7.0", + "indexmap 2.7.1", "indicatif", "log", "rayon", @@ -8808,9 +8808,9 @@ dependencies = [ [[package]] name = "solana-transaction-error" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "961d75c50c2343ed9b609deac4e7e0fd25c76291a57b2760e3ce025a487b69b8" +checksum = "7bd92caae17b4b828864b85cecf6dba6a87ad0ac433606b8bbd58334c74d0251" dependencies = [ "serde", "serde_derive", @@ -8820,9 +8820,9 @@ dependencies = [ [[package]] name = "solana-transaction-metrics-tracker" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b383d4534287bd61e3546ef1cb97a43e011068a69a74137ca621bf96ae6fec4" +checksum = "551dc5dad276919d24287e14e410759e93b801f2ca47dd9ad6c75eb49af26607" dependencies = [ "base64 0.22.1", "bincode", @@ -8836,9 +8836,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d43b7e564dd4ff391f8b639aa9538bf0a346aecccb978760ec3a4166d7576065" +checksum = "f73cd35a23e9d6e289a9bf7bf32c1e972bb88bbb5ec434f43b445286b6ea3079" dependencies = [ "Inflector", "base64 0.22.1", @@ -8864,9 +8864,9 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4506c41e5026fd98e803dfd4ab020c6f080c580e22b3fd932d96b8f882b089b2" +checksum = "897c0015c246cb9b98cfaee15921c89cd7c1503bd368e9a3fd9336c17cd6be25" dependencies = [ "base64 0.22.1", "bincode", @@ -8882,9 +8882,9 @@ dependencies = [ [[package]] name = "solana-type-overrides" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b12afd31af03e5e9320880b3b9c27618f44d4049e86ae8edf2ab53c3c2aed7e" +checksum = "1f8e0b8916e7d78678428ca5d669950f6259ac332eab953ed0c8c2c88eebd3d2" dependencies = [ "lazy_static", "rand 0.8.5", @@ -8892,9 +8892,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42c0713df61e50a4ee2e98eb16d73af1d236ed812b176227c5b372ae3a601f2c" +checksum = "6f5c6096b155fb1fb73d03fec2264a9671cbe208f71c4c32521ee9c979d91c75" dependencies = [ "async-trait", "solana-connection-cache", @@ -8907,11 +8907,11 @@ dependencies = [ [[package]] name = "solana-version" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455bfe6c86895ff8d2d092e201fcaf05e639d56e055cfaac913c87d557f1bee5" +checksum = "ae093290bf86006e323e883b9df845e4bdf84f23c37067cfa9837918ed04c87d" dependencies = [ - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_derive", "solana-feature-set", @@ -8921,9 +8921,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "270f1a92ac92bbbcd687bbe97dfe44d80ffaeaaa44ead99eaa3907598ce16825" +checksum = "8421891f95fe3b8291205e37043396c0fb26c2896cc94d53b153e1ba180992fa" dependencies = [ "itertools 0.12.1", "log", @@ -8935,9 +8935,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f5c7ba6e55a88c0438c9e89603dd2488a3281de832326efaccaf4d68f2c2ba" +checksum = "fcf72a022dbb24dcfe1588aa09679042866eb7c0796ea479500ebe9355a7017f" dependencies = [ "bincode", "log", @@ -8955,9 +8955,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42f1c4eb9c2a15ac382f6ef2561e98bf9e06deb27a8c9d7f2176069a6920d5" +checksum = "9c19f36d9e5227b4d94e651501a1ab15d58480d93e03d8340cc8593758e50530" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -8987,9 +8987,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "2.1.9" +version = "2.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9960a7af4243d493559f12849477b30bb9671c8f895268ee2f48a791df6c607b" +checksum = "3b8cc94d7eddf6606c22504889b6528734db56ed3c2f651641453d13c9b233d7" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -9679,7 +9679,7 @@ dependencies = [ "hex", "once_cell", "reqwest 0.11.27", - "semver 1.0.24", + "semver 1.0.25", "serde", "serde_json", "sha2 0.10.8", @@ -10116,7 +10116,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.7.1", "serde", "serde_spanned", "toml_datetime", @@ -10869,7 +10869,7 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#baf7a60f4c2df6b64d24681fbef5dc22280425a0" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" dependencies = [ "bridge-connector-common", "derive_builder 0.20.2", diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index e8d966d3..b8f72dc7 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -1,7 +1,6 @@ use std::sync::Arc; use anyhow::Result; -use bridge_connector_common::result::BridgeSdkError; use futures::future::join_all; use log::{info, warn}; @@ -271,14 +270,6 @@ async fn handle_init_transfer_event( .await; } Err(err) => { - if let BridgeSdkError::EvmGasEstimateError(_) = err { - utils::redis::remove_event( - &mut redis_connection, - utils::redis::EVM_INIT_TRANSFER_EVENTS, - &key, - ) - .await; - } warn!("Failed to finalize InitTransfer: {}", err); } } diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index eeebfd00..f4d07f5f 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use anyhow::Result; +use bridge_connector_common::result::BridgeSdkError; use futures::future::join_all; use log::{error, info, warn}; @@ -269,6 +270,15 @@ pub async fn finalize_transfer( .await; } Err(err) => { + if let BridgeSdkError::EvmGasEstimateError(_) = err { + utils::redis::remove_event( + &mut redis_connection, + utils::redis::NEAR_SIGN_TRANSFER_EVENTS, + &key, + ) + .await; + } + warn!("Failed to finalize deposit: {}", err); } } From 039a20d725475054afb39f39498ac9e6d34f3c70 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Mon, 20 Jan 2025 21:05:05 -0500 Subject: [PATCH 3/9] chore: fmt --- omni-relayer/src/workers/evm.rs | 4 +--- omni-relayer/src/workers/near.rs | 9 ++++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index b8f72dc7..1a9608f7 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -269,9 +269,7 @@ async fn handle_init_transfer_event( ) .await; } - Err(err) => { - warn!("Failed to finalize InitTransfer: {}", err); - } + Err(err) => warn!("Failed to finalize InitTransfer: {}", err), } if current_timestamp - init_transfer_with_timestamp.creation_timestamp diff --git a/omni-relayer/src/workers/near.rs b/omni-relayer/src/workers/near.rs index f4d07f5f..7dfe0845 100644 --- a/omni-relayer/src/workers/near.rs +++ b/omni-relayer/src/workers/near.rs @@ -12,9 +12,8 @@ use solana_sdk::pubkey::Pubkey; use omni_connector::OmniConnector; use omni_types::{ - locker_args::ClaimFeeArgs, near_events::OmniBridgeEvent, - prover_args::WormholeVerifyProofArgs, prover_result::ProofKind, ChainKind, OmniAddress, - TransferId, + locker_args::ClaimFeeArgs, near_events::OmniBridgeEvent, prover_args::WormholeVerifyProofArgs, + prover_result::ProofKind, ChainKind, OmniAddress, TransferId, }; use crate::{config, utils}; @@ -95,9 +94,9 @@ pub async fn sign_transfer( #[cfg(not(feature = "disable_fee_check"))] match utils::fee::is_fee_sufficient( &config, - transfer_message.fee.clone(), + transfer_message.fee.clone(), &transfer_message.sender, - &transfer_message.recipient, + &transfer_message.recipient, &transfer_message.token ).await { Ok(true) => {} From 2dad93467aafd10216b95843c28a92cf43dfeba8 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Tue, 21 Jan 2025 01:42:13 -0500 Subject: [PATCH 4/9] feat: adapted according to new structure in sdk --- omni-relayer/Cargo.lock | 24 ++++++++++---------- omni-relayer/Cargo.toml | 14 ++++++------ omni-relayer/src/workers/evm.rs | 36 +++++++++++------------------- omni-relayer/src/workers/solana.rs | 17 +++----------- 4 files changed, 35 insertions(+), 56 deletions(-) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index fc71b4aa..e9f6de2c 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -1236,7 +1236,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "tracing", - "uuid 1.12.0", + "uuid 1.12.1", ] [[package]] @@ -1815,7 +1815,7 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "eth-proof", "ethers", @@ -3183,7 +3183,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "borsh 1.5.5", "cita_trie", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "evm-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -5063,7 +5063,7 @@ dependencies = [ [[package]] name = "near-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "borsh 1.5.5", "lazy_static", @@ -5857,7 +5857,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -7813,7 +7813,7 @@ dependencies = [ [[package]] name = "solana-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "borsh 1.5.5", "derive_builder 0.20.2", @@ -10405,9 +10405,9 @@ dependencies = [ [[package]] name = "uuid" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "744018581f9a3454a9e15beb8a33b017183f1e7c0cd170232a2d1453b23a51c4" +checksum = "b3758f5e68192bb96cc8f9b7e2c2cfdabb435499a28499a42f8f984092adad4b" [[package]] name = "valuable" @@ -10869,7 +10869,7 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fadded-gas-estimation#bfffa661b94b0f59de3ddd8bceaf67f26f4c673f" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" dependencies = [ "bridge-connector-common", "derive_builder 0.20.2", diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 6ed6226b..153c58b4 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -41,16 +41,16 @@ alloy = { version = "0.9", features = ["node-bindings", "providers", "rpc-types" redis = { version = "0.28.1", features = ["aio", "tokio-comp"] } reqwest = "0.12" -eth-proof = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "eth-proof", branch = "feat/added-gas-estimation" } +eth-proof = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "eth-proof", branch = "feat/near-fin-transfer-with-evm-proof" } -bridge-connector-common = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "bridge-connector-common", branch = "feat/added-gas-estimation" } +bridge-connector-common = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "bridge-connector-common", branch = "feat/near-fin-transfer-with-evm-proof" } -near-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-bridge-client", branch = "feat/added-gas-estimation" } -evm-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "evm-bridge-client", branch = "feat/added-gas-estimation" } -solana-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "solana-bridge-client", branch = "feat/added-gas-estimation" } -wormhole-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "wormhole-bridge-client", branch = "feat/added-gas-estimation" } +near-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } +evm-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "evm-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } +solana-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "solana-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } +wormhole-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "wormhole-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } -omni-connector = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "omni-connector", branch = "feat/added-gas-estimation" } +omni-connector = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "omni-connector", branch = "feat/near-fin-transfer-with-evm-proof" } [features] disable_fee_check = [] diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 1a9608f7..9f994b89 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -9,7 +9,7 @@ use ethereum_types::H256; use omni_connector::OmniConnector; #[cfg(not(feature = "disable_fee_check"))] use omni_types::Fee; -use omni_types::{prover_result::ProofKind, ChainKind, OmniAddress}; +use omni_types::{ChainKind, OmniAddress}; use crate::{config, utils}; @@ -216,26 +216,8 @@ async fn handle_init_transfer_event( } } - let Some(topic) = init_transfer_with_timestamp.log.topic0() else { - warn!("No topic0 in log: {:?}", init_transfer_with_timestamp.log); - return; - }; - let tx_hash = H256::from_slice(tx_hash.as_slice()); - let Some(prover_args) = utils::evm::construct_prover_args( - &config, - vaa, - tx_hash, - H256::from_slice(topic.as_slice()), - ProofKind::InitTransfer, - ) - .await - else { - warn!("Failed to construct prover args"); - return; - }; - let storage_deposit_actions = match utils::storage::get_storage_deposit_actions( &connector, init_transfer_with_timestamp.chain_kind, @@ -253,10 +235,18 @@ async fn handle_init_transfer_event( } }; - let fin_transfer_args = omni_connector::FinTransferArgs::NearFinTransfer { - chain_kind: init_transfer_with_timestamp.chain_kind, - storage_deposit_actions, - prover_args, + let fin_transfer_args = if let Some(vaa) = vaa { + omni_connector::FinTransferArgs::NearFinTransferWithVaa { + chain_kind: init_transfer_with_timestamp.chain_kind, + storage_deposit_actions, + vaa, + } + } else { + omni_connector::FinTransferArgs::NearFinTransferWithEvmProof { + chain_kind: init_transfer_with_timestamp.chain_kind, + near_tx_hash: tx_hash, + storage_deposit_actions, + } }; match connector.fin_transfer(fin_transfer_args).await { diff --git a/omni-relayer/src/workers/solana.rs b/omni-relayer/src/workers/solana.rs index 463f2965..8370bcd2 100644 --- a/omni-relayer/src/workers/solana.rs +++ b/omni-relayer/src/workers/solana.rs @@ -7,9 +7,7 @@ use log::{info, warn}; use omni_connector::OmniConnector; #[cfg(not(feature = "disable_fee_check"))] use omni_types::Fee; -use omni_types::{ - prover_args::WormholeVerifyProofArgs, prover_result::ProofKind, ChainKind, OmniAddress, -}; +use omni_types::{ChainKind, OmniAddress}; use solana_client::nonblocking::rpc_client::RpcClient; #[cfg(not(feature = "disable_fee_check"))] use solana_sdk::pubkey::Pubkey; @@ -280,15 +278,6 @@ async fn handle_init_transfer_event( return; }; - let wormhole_proof_args = WormholeVerifyProofArgs { - proof_kind: ProofKind::InitTransfer, - vaa, - }; - let Ok(prover_args) = borsh::to_vec(&wormhole_proof_args) else { - warn!("Failed to serialize WormholeVerifyProofArgs"); - return; - }; - let storage_deposit_actions = match utils::storage::get_storage_deposit_actions( &connector, ChainKind::Sol, @@ -306,10 +295,10 @@ async fn handle_init_transfer_event( } }; - let fin_transfer_args = omni_connector::FinTransferArgs::NearFinTransfer { + let fin_transfer_args = omni_connector::FinTransferArgs::NearFinTransferWithVaa { chain_kind: ChainKind::Sol, storage_deposit_actions, - prover_args, + vaa, }; match connector.fin_transfer(fin_transfer_args).await { From 1cddc04ed0b9254e04a9a053c2836b303cff8211 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Tue, 21 Jan 2025 03:01:28 -0500 Subject: [PATCH 5/9] chore: renamed `near_tx_hash` to `tx_hash` --- omni-relayer/Cargo.lock | 22 +++++++++++----------- omni-relayer/src/workers/evm.rs | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index e9f6de2c..4351581f 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -1815,7 +1815,7 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "eth-proof", "ethers", @@ -1840,9 +1840,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "4.0.1" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "74fa05ad7d803d413eb8380983b092cbbaf9a85f151b871360e7b00cd7060b37" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -3183,7 +3183,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "borsh 1.5.5", "cita_trie", @@ -3552,7 +3552,7 @@ dependencies = [ [[package]] name = "evm-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -5063,7 +5063,7 @@ dependencies = [ [[package]] name = "near-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -5292,7 +5292,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5464,7 +5464,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "borsh 1.5.5", "lazy_static", @@ -5857,7 +5857,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -7813,7 +7813,7 @@ dependencies = [ [[package]] name = "solana-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "borsh 1.5.5", "derive_builder 0.20.2", @@ -10869,7 +10869,7 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#41d1387fdba336bcca2de83fa4f31ae59c6375ca" +source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" dependencies = [ "bridge-connector-common", "derive_builder 0.20.2", diff --git a/omni-relayer/src/workers/evm.rs b/omni-relayer/src/workers/evm.rs index 9f994b89..0468ff71 100644 --- a/omni-relayer/src/workers/evm.rs +++ b/omni-relayer/src/workers/evm.rs @@ -244,7 +244,7 @@ async fn handle_init_transfer_event( } else { omni_connector::FinTransferArgs::NearFinTransferWithEvmProof { chain_kind: init_transfer_with_timestamp.chain_kind, - near_tx_hash: tx_hash, + tx_hash, storage_deposit_actions, } }; From 8176e62523585cf64f5b2fffa827516041d5b1d4 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Wed, 22 Jan 2025 15:00:48 -0500 Subject: [PATCH 6/9] chore: added redis to config --- omni-relayer/example-mainnet-config.toml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/omni-relayer/example-mainnet-config.toml b/omni-relayer/example-mainnet-config.toml index cee551b7..949272ea 100644 --- a/omni-relayer/example-mainnet-config.toml +++ b/omni-relayer/example-mainnet-config.toml @@ -1,3 +1,6 @@ +[redis] +url = "redis://127.0.0.1/" + [bridge_indexer] api_url = "http://127.0.0.1:8080" From 62e8018b733ad3f6027a6e270ff815a13ca78169 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Thu, 23 Jan 2025 21:46:23 -0500 Subject: [PATCH 7/9] feat: added script that simplifies communication with redis --- omni-relayer/redis-utility.sh | 94 +++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100755 omni-relayer/redis-utility.sh diff --git a/omni-relayer/redis-utility.sh b/omni-relayer/redis-utility.sh new file mode 100755 index 00000000..4a1cd3f6 --- /dev/null +++ b/omni-relayer/redis-utility.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +REDIS_HOST="127.0.0.1" +REDIS_PORT="6379" + +get_last_processed() { + local chain=$1 + local key=$2 + local value=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" get "$key") + + if [[ -n "$value" ]]; then + echo "Last processed block on $chain: $value" + else + echo "No data found for $chain ($key)" + fi +} + +case "$1" in + get_last_processed) + get_last_processed "Near" "Near_LAST_PROCESSED_BLOCK" + get_last_processed "Ethereum" "Eth_LAST_PROCESSED_BLOCK" + get_last_processed "Base" "Base_LAST_PROCESSED_BLOCK" + get_last_processed "Arbitrum" "Arb_LAST_PROCESSED_BLOCK" + get_last_processed "Solana" "SOLANA_LAST_PROCESSED_SIGNATURE" + ;; + get_near_last_processed_block) + get_last_processed "Near" "Near_LAST_PROCESSED_BLOCK" + ;; + get_eth_last_processed_block) + get_last_processed "Ethereum" "Eth_LAST_PROCESSED_BLOCK" + ;; + get_base_last_processed_block) + get_last_processed "Base" "Base_LAST_PROCESSED_BLOCK" + ;; + get_arb_last_processed_block) + get_last_processed "Arbitrum" "Arb_LAST_PROCESSED_BLOCK" + ;; + get_evm_last_processed_block) + get_last_processed "Ethereum" "Eth_LAST_PROCESSED_BLOCK" + get_last_processed "Base" "Base_LAST_PROCESSED_BLOCK" + get_last_processed "Arbitrum" "Arb_LAST_PROCESSED_BLOCK" + ;; + get_solana_last_processed_signature) + get_last_processed "Solana" "SOLANA_LAST_PROCESSED_SIGNATURE" + ;; + get_solana_events) + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "solana_events" | sed -n '1~2p' + ;; + get_init_transfers) + echo "Init transfers on Near:" + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "near_init_transfer_queue" | sed -n 'n;p' | sed G + echo "Init transfers on Evm:" + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "evm_init_tranfer_events" | sed -n 'n;p' | sed G + echo "Init transfers on Solana:" + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "solana_init_transfer_events" | sed -n 'n;p' | sed G + ;; + get_near_init_transfer_events) + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "near_init_transfer_queue" | sed -n 'n;p' | sed G + ;; + get_evm_init_transfer_events) + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "evm_init_tranfer_events" | sed -n 'n;p' | sed G + ;; + get_solana_init_transfer_events) + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "solana_init_transfer_events" | sed -n 'n;p' | sed G + ;; + get_sign_events) + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "near_sign_transfer_events" | sed -n 'n;p' | sed G + ;; + get_finalized_transfers) + redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" hgetall "finalized_transfers" | sed -n 'n;p' | sed G + ;; + *) + echo "Unknown command: $1" + echo + echo "Usage: $0 " + echo + echo "Available commands:" + echo " get_last_processed - Retrieve last processed blocks/signatures for all chains" + echo " get_near_last_processed_block - Retrieve the last processed block for Near" + echo " get_eth_last_processed_block - Retrieve the last processed block for Ethereum" + echo " get_base_last_processed_block - Retrieve the last processed block for Base" + echo " get_arb_last_processed_block - Retrieve the last processed block for Arbitrum" + echo " get_evm_last_processed_block - Retrieve the last processed blocks for all EVM chains" + echo " get_solana_last_processed_signature - Retrieve the last processed signature for Solana" + echo " get_solana_events - Retrieve all event keys for Solana" + echo " get_init_transfers - Retrieve all init transfer events for all chains" + echo " get_near_init_transfer_events - Retrieve init transfer events for Near" + echo " get_evm_init_transfer_events - Retrieve init transfer events for EVM" + echo " get_solana_init_transfer_events - Retrieve init transfer events for Solana" + echo " get_sign_events - Retrieve all sign events for Near" + echo " get_finalized_transfers - Retrieve finalized transfer events" + exit 1 + ;; +esac From db983e55cd0bd0b86700460d967fb9b2e0d0b637 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Thu, 23 Jan 2025 21:49:45 -0500 Subject: [PATCH 8/9] fix: changed key to origin_nonce Destination nonce may have a duplicate value, while origin nonce will be unique for every event found on Near --- omni-relayer/src/utils/near.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/omni-relayer/src/utils/near.rs b/omni-relayer/src/utils/near.rs index f1d56196..ae23e487 100644 --- a/omni-relayer/src/utils/near.rs +++ b/omni-relayer/src/utils/near.rs @@ -110,7 +110,7 @@ pub async fn handle_streamer_message( utils::redis::add_event( redis_connection, utils::redis::NEAR_SIGN_TRANSFER_EVENTS, - message_payload.destination_nonce.to_string(), + message_payload.transfer_id.origin_nonce.to_string(), log, ) .await; From e88f0098ad13c5c936784b4a52cb7605ad39afa6 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Mon, 27 Jan 2025 10:14:23 -0500 Subject: [PATCH 9/9] chore: synced with main --- .github/workflows/e2e-test.yml | 17 + e2e-testing/.gitignore | 8 + e2e-testing/Makefile | 251 +++------- e2e-testing/README.md | 143 ++++-- e2e-testing/bridge-sdk-config.example.json | 25 + e2e-testing/evm_scripts/hardhat.config.ts | 20 - e2e-testing/makefiles/common.mk | 52 +++ e2e-testing/makefiles/evm.mk | 117 +++++ e2e-testing/makefiles/near.mk | 125 +++++ .../pipelines/bridge_token_near_to_evm.mk | 136 ++++++ e2e-testing/makefiles/solana.mk | 42 ++ e2e-testing/near_init_params.json | 47 ++ e2e-testing/scripts/call-near-contract.sh | 87 ++++ e2e-testing/scripts/create-near-account.sh | 19 + e2e-testing/scripts/deploy-near-contract.sh | 75 ++- near/res/evm_prover.wasm | Bin 232531 -> 232515 bytes near/res/omni_bridge.wasm | Bin 577334 -> 577370 bytes near/res/wormhole_omni_prover_proxy.wasm | Bin 169593 -> 169593 bytes omni-relayer/Cargo.lock | 432 +++++++++--------- omni-relayer/Cargo.toml | 14 +- 20 files changed, 1140 insertions(+), 470 deletions(-) create mode 100644 .github/workflows/e2e-test.yml create mode 100644 e2e-testing/bridge-sdk-config.example.json create mode 100644 e2e-testing/makefiles/common.mk create mode 100644 e2e-testing/makefiles/evm.mk create mode 100644 e2e-testing/makefiles/near.mk create mode 100644 e2e-testing/makefiles/pipelines/bridge_token_near_to_evm.mk create mode 100644 e2e-testing/makefiles/solana.mk create mode 100644 e2e-testing/near_init_params.json create mode 100755 e2e-testing/scripts/call-near-contract.sh create mode 100755 e2e-testing/scripts/create-near-account.sh diff --git a/.github/workflows/e2e-test.yml b/.github/workflows/e2e-test.yml new file mode 100644 index 00000000..b82d6d93 --- /dev/null +++ b/.github/workflows/e2e-test.yml @@ -0,0 +1,17 @@ +name: E2E Tests + +on: + workflow_dispatch: + inputs: + selected_pipelines: + description: "Space-separated list of pipelines to run (e.g. 'bridge_token_near_to_evm another_pipeline')" + required: false + default: "bridge_token_near_to_evm" + +jobs: + e2e-tests: + name: E2E Tests + runs-on: ubuntu-latest + steps: + - name: Check out repository + uses: actions/checkout@v3 diff --git a/e2e-testing/.gitignore b/e2e-testing/.gitignore index 2b245ce0..c5f502f7 100644 --- a/e2e-testing/.gitignore +++ b/e2e-testing/.gitignore @@ -4,6 +4,14 @@ solana_artifacts/ evm_deploy_results/ near_deploy_results/ solana_deploy_results/ +bridge-token-near-to-evm/ + +.evm-compile.stamp +.near-token-deployment-prepare.stamp +.solana-build.stamp +*dyn_init_args.json +bridge-sdk-config.json +bridge_token_factory-keypair.json evm_scripts/build/ diff --git a/e2e-testing/Makefile b/e2e-testing/Makefile index f808e61d..4fef8259 100644 --- a/e2e-testing/Makefile +++ b/e2e-testing/Makefile @@ -1,190 +1,69 @@ -.PHONY: evm-compile evm-scripts-build - -.DELETE_ON_ERROR: - -TESTING_ROOT := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) - -TIMESTAMP := $(shell date -u +%Y%m%d-%H%M%S) - -EVM_DIR := $(TESTING_ROOT)/../evm -EVM_SCRIPT_DIR := $(TESTING_ROOT)/evm_scripts -ETHEREUM_DEPLOY_RESULTS_DIR := $(TESTING_ROOT)/ethereum_deploy_results - -NEAR_DIR := $(TESTING_ROOT)/../near -NEAR_DEPLOY_RESULTS_DIR := $(TESTING_ROOT)/near_deploy_results - -SOLANA_DIR := $(TESTING_ROOT)/../solana -SOLANA_DEPLOY_RESULTS_DIR := $(TESTING_ROOT)/solana_deploy_results - -NEAR_BRIDGE_ID_FILE := $(NEAR_DEPLOY_RESULTS_DIR)/omni_bridge.json - ########################################################## -# EVM +# Makefile prologue ########################################################## -EVM_COMPILE_STAMP := $(TESTING_ROOT)/.evm-compile.stamp -EVM_ARTIFACTS_DIR := $(TESTING_ROOT)/evm_artifacts -EVM_SCRIPT_COMPILE_STAMP := $(TESTING_ROOT)/.evm-scripts-compile.stamp - -EVM_NETWORKS := sepolia arbitrumSepolia baseSepolia - -EVM_DEPLOY_RESULTS_DIR := $(TESTING_ROOT)/evm_deploy_results - -DEPLOY_EVM_TOKEN_IMPL = yarn --silent --cwd $(EVM_DIR) hardhat deploy-token-impl --network $(1) -DEPLOY_EVM_OMNI_BRIDGE_CONTRACT = yarn --silent --cwd $(EVM_DIR) hardhat deploy-bridge-token-factory --network $(1) --bridge-token-impl $(2) --near-bridge-account-id $(3) -DEPLOY_EVM_FAKE_PROVER = yarn --silent --cwd $(EVM_DIR) hardhat deploy-fake-prover --network $(1) -DEPLOY_EVM_ENEAR_PROXY = yarn --silent --cwd $(EVM_DIR) hardhat deploy-e-near-proxy --network $(1) --enear $(2) - -DEPLOY_EVM_BYTECODE = yarn --silent --cwd $(EVM_SCRIPT_DIR) hardhat deploy-bytecode --network $(1) --bytecode $(2) -DEPLOY_EVM_TEST_TOKEN = yarn --silent --cwd $(EVM_SCRIPT_DIR) hardhat deploy-test-token --network $(1) --name $(2) --symbol $(3) - -ENEAR_CREATION_TEMPLATE_FILE := $(TESTING_ROOT)/bin/eNear_creation.template - -$(EVM_DEPLOY_RESULTS_DIR): - mkdir -p $@ - -evm-build: $(EVM_COMPILE_STAMP) -$(EVM_COMPILE_STAMP): - @echo "Compiling EVM contracts" - mkdir -p $(EVM_ARTIFACTS_DIR) && \ - yarn --cwd $(EVM_DIR) install --frozen-lockfile && \ - yarn --cwd $(EVM_DIR) hardhat compile && \ - cp -r $(EVM_DIR)/build/* $(EVM_ARTIFACTS_DIR) - touch $@ - -evm-scripts-build: $(EVM_SCRIPT_COMPILE_STAMP) -$(EVM_SCRIPT_COMPILE_STAMP): - @echo "Compiling EVM scripts" - yarn --cwd $(EVM_SCRIPT_DIR) install && \ - yarn --cwd $(EVM_SCRIPT_DIR) hardhat compile - touch $@ - -# Arguments: -# $(1) - the network name -define generate_evm_deploy_rules - -.PHONY: $(1)-deploy-fake-prover $(1)-deploy-enear $(1)-deploy-enear-proxy $(1)-deploy-bridge $(1)-deploy-token-impl $(1)-deploy-test-token - -$(1)_DEPLOY_RESULTS_DIR := $(EVM_DEPLOY_RESULTS_DIR)/$(1) - -$$($(1)_DEPLOY_RESULTS_DIR): | $(EVM_DEPLOY_RESULTS_DIR) - mkdir -p $$@ - -$(1)-deploy: $(1)-deploy-bridge $(1)-deploy-enear-proxy $(1)-deploy-test-token - -$(1)_BRIDGE_CONTRACT_ADDRESS_FILE := $$($(1)_DEPLOY_RESULTS_DIR)/omni_bridge.json -$(1)_TOKEN_IMPL_ADDRESS_FILE := $$($(1)_DEPLOY_RESULTS_DIR)/token_factory.json -$(1)_FAKE_PROVER_ADDRESS_FILE := $$($(1)_DEPLOY_RESULTS_DIR)/fake_prover.json - -$(1)_ENEAR_ADDRESS_FILE := $$($(1)_DEPLOY_RESULTS_DIR)/eNear.json -$(1)_ENEAR_PROXY_ADDRESS_FILE := $$($(1)_DEPLOY_RESULTS_DIR)/eNearProxy.json -$(1)_ENEAR_CREATION_FILE := $$($(1)_DEPLOY_RESULTS_DIR)/eNear_creation - -$(1)_TEST_TOKEN_ADDRESS_FILE := $$($(1)_DEPLOY_RESULTS_DIR)/test_token.json - -$(1)-deploy-fake-prover: $$($(1)_FAKE_PROVER_ADDRESS_FILE) -$$($(1)_FAKE_PROVER_ADDRESS_FILE): $(EVM_COMPILE_STAMP) | $$($(1)_DEPLOY_RESULTS_DIR) - $$(call DEPLOY_EVM_FAKE_PROVER,$(1)) 2>/dev/stderr 1> $$@ - -$(1)-deploy-enear: $$($(1)_ENEAR_ADDRESS_FILE) -$$($(1)_ENEAR_ADDRESS_FILE): $$($(1)_ENEAR_CREATION_FILE) $(EVM_SCRIPT_COMPILE_STAMP) | $$($(1)_DEPLOY_RESULTS_DIR) - $$(call DEPLOY_EVM_BYTECODE,$(1),$$($(1)_ENEAR_CREATION_FILE)) 2>/dev/stderr 1> $$@ - -$(1)-deploy-enear-proxy: $$($(1)_ENEAR_PROXY_ADDRESS_FILE) -$$($(1)_ENEAR_PROXY_ADDRESS_FILE): $$($(1)_ENEAR_ADDRESS_FILE) $(EVM_COMPILE_STAMP) | $$($(1)_DEPLOY_RESULTS_DIR) - $$(call DEPLOY_EVM_ENEAR_PROXY,$(1),$$(shell cat $$($(1)_ENEAR_ADDRESS_FILE) | jq -r .contractAddress)) 2>/dev/stderr 1> $$@ - -$(1)-deploy-bridge: $$($(1)_BRIDGE_CONTRACT_ADDRESS_FILE) -$$($(1)_BRIDGE_CONTRACT_ADDRESS_FILE): $$($(1)_TOKEN_IMPL_ADDRESS_FILE) $(NEAR_BRIDGE_ID_FILE) $(EVM_COMPILE_STAMP) | $$($(1)_DEPLOY_RESULTS_DIR) - $$(call DEPLOY_EVM_OMNI_BRIDGE_CONTRACT,$(1),$$(shell cat $$($(1)_TOKEN_IMPL_ADDRESS_FILE) | jq -r .tokenImplAddress),$$(shell cat $(NEAR_BRIDGE_ID_FILE) | jq -r .contract_id)) 2>/dev/stderr 1> $$@ - -$(1)-deploy-token-impl: $$($(1)_TOKEN_IMPL_ADDRESS_FILE) -$$($(1)_TOKEN_IMPL_ADDRESS_FILE): $(EVM_COMPILE_STAMP) | $$($(1)_DEPLOY_RESULTS_DIR) - $$(call DEPLOY_EVM_TOKEN_IMPL,$(1)) 2>/dev/stderr 1> $$@ - -$$($(1)_ENEAR_CREATION_FILE): $(ENEAR_CREATION_TEMPLATE_FILE) $$($(1)_FAKE_PROVER_ADDRESS_FILE) | $$($(1)_DEPLOY_RESULTS_DIR) - cat $$< | \ - sed "s//$$(shell cat $$($(1)_FAKE_PROVER_ADDRESS_FILE) | jq -r .fakeProverAddress | sed 's/^0x//')/" > $$@ - - -$(1)-deploy-test-token: $$($(1)_TEST_TOKEN_ADDRESS_FILE) -$$($(1)_TEST_TOKEN_ADDRESS_FILE): $(EVM_SCRIPT_COMPILE_STAMP) | $$($(1)_DEPLOY_RESULTS_DIR) - $$(call DEPLOY_EVM_TEST_TOKEN,$(1),E2ETestToken-$(TIMESTAMP),E2ETT-$(TIMESTAMP)) 2>/dev/stderr 1> $$@ - -endef - -$(foreach network,$(EVM_NETWORKS),$(eval $(call generate_evm_deploy_rules,$(network)))) - -########################################################## -# NEAR -########################################################## - -NEAR_BINARY_DIR := $(TESTING_ROOT)/near_artifacts - -.PHONY: near-build near-deploy - -# List all expected WASM binaries -NEAR_BINARIES := evm_prover.wasm omni_bridge.wasm omni_prover.wasm omni_token.wasm token_deployer.wasm wormhole_omni_prover_proxy.wasm mock_token.wasm -NEAR_BINARY_PATHS := $(addprefix $(NEAR_BINARY_DIR)/,$(NEAR_BINARIES)) - -NEAR_BUILD_STAMP := $(TESTING_ROOT)/.near-build.stamp - -DEPLOY_RESULTS := $(patsubst $(NEAR_BINARY_DIR)/%.wasm,$(NEAR_DEPLOY_RESULTS_DIR)/%.json,$(NEAR_BINARY_PATHS)) - -near-deploy: $(DEPLOY_RESULTS) - -$(NEAR_DEPLOY_RESULTS_DIR): - mkdir -p $@ - -near-build: $(NEAR_BUILD_STAMP) -$(NEAR_BUILD_STAMP): - $(NEAR_DIR)/build.sh --output-dir $(NEAR_BINARY_DIR) - touch $@ - -# Arguments: -# $(1) - the path to the binary file -define generate_near_deploy_rules - -$(NEAR_DEPLOY_RESULTS_DIR)/$(basename $(notdir $(1))).json: $(1) | $(NEAR_DEPLOY_RESULTS_DIR) - ./scripts/deploy-near-contract.sh $(1) $$@ $$(basename $$(notdir $(1)))-$(TIMESTAMP).testnet - -$(1): $(NEAR_BUILD_STAMP) - -endef - -$(foreach binary,$(NEAR_BINARY_PATHS),$(eval $(call generate_near_deploy_rules,$(binary)))) - - -######################################## -# Solana -######################################## - -SOLANA_BUILD_STAMP := $(TESTING_ROOT)/.solana-build.stamp -SOLANA_ARTIFACTS_DIR := $(TESTING_ROOT)/solana_artifacts - -SOLANA_PROGRAMS := bridge_token_factory -SOLANA_PROGRAMS_KEYPAIRS := $(foreach program,$(SOLANA_PROGRAMS),$(SOLANA_DIR)/$(program)/target/deploy/$(program)-keypair.json) -SOLANA_PROGRAMS_BINARIES := $(foreach program,$(SOLANA_PROGRAMS),$(SOLANA_ARTIFACTS_DIR)/$(program)/target/deploy/$(program).so) - -solana-build: $(SOLANA_BUILD_STAMP) -$(SOLANA_BUILD_STAMP): $(SOLANA_PROGRAMS_KEYPAIRS) $(SOLANA_PROGRAMS_BINARIES) - touch $@ - -# Arguments: -# $(1) - the program name -define generate_solana_build_rules - -$(SOLANA_DIR)/$(1)/target/deploy/$(1)-keypair.json: $(TESTING_ROOT)/$(1)-keypair.json - mkdir -p $$(dir $$@) && \ - cp $$< $$@ - -$(SOLANA_ARTIFACTS_DIR)/$(1)/target/deploy/$(1).so: $(SOLANA_DIR)/$(1)/target/deploy/$(1)-keypair.json - mkdir -p $(SOLANA_ARTIFACTS_DIR)/$(1) && \ - cd $(SOLANA_DIR)/$(1) && \ - anchor build && \ - cp -r $(SOLANA_DIR)/$(1)/target/* $(SOLANA_ARTIFACTS_DIR)/$(1) - -endef - -$(foreach program,$(SOLANA_PROGRAMS),$(eval $(call generate_solana_build_rules,$(program)))) +MAKEFLAGS += --no-builtin-rules --no-builtin-variables --warn-undefined-variables --silent +unexport MAKEFLAGS +.DELETE_ON_ERROR: +.SUFFIXES: +SHELL := bash +.SHELLFLAGS := -eu -o pipefail -c +.DEFAULT_GOAL := help + +# Master clean target +.PHONY: clean +clean: clean-deploy-results clean-evm clean-near clean-solana clean-bridge-token-near-to-evm + $(call description,Cleaning all build artifacts and deploy results) + +# Include common module +include makefiles/common.mk + +# Include chain-specific modules +include makefiles/evm.mk +include makefiles/near.mk +include makefiles/solana.mk + +# Include test pipelines +include makefiles/pipelines/bridge_token_near_to_evm.mk + +# Help target +.PHONY: help +help: + $(call description,Available targets) + @echo "Build targets:" + @echo " evm-build Build EVM contracts" + @echo " evm-scripts-build Build EVM deployment scripts" + @echo " near-build Build NEAR contracts" + @echo " solana-build Build Solana programs" + @echo + @echo "Clean targets:" + @echo " clean Clean all build artifacts and deploy results" + @echo " clean-deploy-results Clean deploy results directories" + @echo " clean-evm Clean all EVM build artifacts" + @echo " clean-evm-{network} Clean specific network deploy results" + @echo " Available networks: $(evm_networks)" + @echo " clean-near Clean NEAR build artifacts" + @echo " clean-solana Clean Solana build artifacts" + @echo " clean-bridge-token-near-to-evm Clean bridge pipeline artifacts" + @echo + @echo "Account creation:" + @echo " create-near-init-account Create NEAR initialization account" + @echo " create-near-sender Create NEAR sender account" + @echo " create-near-relayer Create NEAR relayer account" + @echo " create-dao-account Create NEAR DAO account" + @echo + @echo "Deployment targets:" + @echo " near-deploy Deploy all NEAR contracts" + @echo " {network}-deploy Deploy all contracts to specific EVM network" + @echo " Available networks: $(evm_networks)" + @echo " {network}-deploy-bridge Deploy bridge contract to specific network" + @echo " {network}-deploy-enear Deploy eNEAR token to specific network" + @echo " {network}-deploy-test-token Deploy test token to specific network" + @echo + @echo "Bridge pipeline:" + @echo " bridge-token-near-to-evm Run complete NEAR to ETH bridge test" + @echo " prepare-token-deployment Prepare token deployment (Step 0)" + @echo " near-log-metadata-call Log token metadata (Step 1)" + @echo " ethereum-deploy-token Deploy token on Ethereum (Step 2)" + @echo " near-bind-token Bind token on NEAR (Step 3)" diff --git a/e2e-testing/README.md b/e2e-testing/README.md index b9b54414..3e8cac18 100644 --- a/e2e-testing/README.md +++ b/e2e-testing/README.md @@ -1,63 +1,128 @@ -# End-to-end testing +# Omni Bridge End-to-End Tests + +## General description + +The E2E tests cover an entire workflow involving multiple blockchain components (NEAR, EVM-based chains, Solana) and cross-chain communication. These tests ensure that all parts (smart contracts, scripts, etc.) integrate correctly. The Makefiles in this project orchestrate each step in the workflow, from compiling and deploying contracts on various chains to executing and verifying cross-chain transactions. ## Prerequisites -- yarn -- cargo -- [NEAR CLI RS](https://github.com/near/near-cli-rs) -- docker -- [Solana CLI and Anchor](https://solana.com/docs/intro/installation) -- Bridge SDK CLI: `cargo install --git https://github.com/Near-One/bridge-sdk-rs/ bridge-cli` +You will need the following tools installed on your environment before proceeding: +- **Yarn**. Used for installing TypeScript dependencies for EVM contracts and scripts. +- **Cargo**. The Rust package manager, required for building Rust-based components. +- **NEAR CLI RS**. A command-line interface for interacting with NEAR protocols. +- **Docker**. Required to build NEAR contracts in consistent environment. +- **Solana CLI and Anchor**. For compiling and deploying Solana programs. +- **Bridge SDK CLI**. Install with: +`cargo install --git https://github.com/Near-One/bridge-sdk-rs/ --rev e2c86d5 bridge-cli` +Enables bridging functionality for various blockchain environments. +- **jq**. A command-line JSON processor used by many scripts in this project. + +## User guide + +### How to Run Builds and Pipelines + +This repository contains multiple Makefiles, each focusing on a particular chain or pipeline. + +You can explore all the available targets by running: +``` +make help +``` + +Typical usage involves calling a specific pipeline target, for example: + +``` +make bridge-token-near-to-evm +``` + +This command triggers a multi-step process that compiles, deploys, and binds tokens across NEAR and an EVM-based network. + +### Environment variables and configuration + +You need to create a `.env` files from: +- `./evm-scripts/.env.example` +- `../evm/.env.example` (`INFURA_API_KEY` and `EVM_PRIVATE_KEY` only) -## Using the Makefile +Also you need to copy or rename the provided `bridge-sdk-config.example.json` to `bridge-sdk-config.json`. And update it with your `ETH_PRIVATE_KEY` and your `ETH_RPC` endpoint. -The `Makefile` in this project is designed to automate the deployment and compilation processes for both EVM and NEAR environments. It provides a set of predefined rules that can be executed to perform specific tasks, such as compiling contracts, deploying them to various networks, and setting up necessary infrastructure. +For Solana bulding and deployment, ensure that for every program you have a keypair in `.e2e-testing/` directory in the format of `-keypair.json`. However, this key pair is secret and should not be shared. -### Common Tasks +### Result artifacts -- **Compile EVM Contracts**: To compile the EVM contracts, run: - ```bash - make evm-compile - ``` +Throughout the pipelines, you will see JSON files containing addresses, transaction hashes, and other relevant data. +These files serve as evidence that each step or deployment was successfully executed. They are automatically generated and stored in dedicated directories such as `evm_deploy_results` or `near_deploy_results`. -- **Deploy to EVM Networks**: To deploy contracts to a specific EVM network, use the following pattern: - ```bash - make -deploy - ``` - Replace `` with the desired network name, such as `sepolia` or `arbitrumSepolia`. +### Handling Pipeline Failures -- **Build NEAR Contracts**: To build the NEAR contracts, execute: - ```bash +If a pipeline fails at a certain step, fix the underlying issue and rerun the same target. Make will pick up from the point of failure if the previous steps have created their artifact files or “stamp” files. + +### Rebuilding Binaries + +Each build step depends on “stamp” files that mark the completion of the step. Simply calling the relevant build target again will skip the build if the stamp file exists. + +To perform a clean rebuild, run the corresponding clean target. For example: +``` + make clean-near make near-build - ``` +``` + +This removes the old artifacts and stamps, forcing a complete recompile. + +## Developer Guide + +### Introduction to Make + +- If you are new to Make, the [[GNU Make Manual](https://www.gnu.org/software/make/manual/make.html)] is an excellent place to start. +- Make allows us to define rules that specify how to build or process files and manage dependencies. + + +### Structure of the Makefiles + +- Makefiles here are split into modules for different chains (e.g., `near.mk`, `evm.mk`, `solana.mk`) and pipelines (e.g., `pipelines/bridge_token_near_to_evm.mk`). +- Each of these is included into a master Makefile. +- Variables are in a global namespace. Therefore, every variable should be prefixed to avoid naming collisions, such as `evm_compile_stamp`, `solana_build_stamp`, etc. + +### Pipelines Organization -- **Deploy NEAR Contracts**: To deploy NEAR contracts, run: - ```bash - make near-deploy - ``` +- Each pipeline typically has a prefix, such as pipeline1, pipeline2, and so on. +- Consider adding new pipelines in separate `.mk` files. +- Number the generated files for clarity (e.g., `01_step.json`, `02_step.json`) to keep track of the pipeline steps. -These tasks automate the process of setting up the testing environment, ensuring that all necessary components are compiled and deployed correctly. +### Targets and Phony Targets -### Additional Requirements +Most steps have two targets: -- **Private Key Requirement**: For Ethereum deployment, ensure that you add your `EVM_PRIVATE_KEY` to the `./evm/.env` file. This key is necessary for authenticating transactions on the Ethereum network. +1. A “file” target (e.g., a JSON artifact) or a “stamp” file target to indicate completion. +2. A `.PHONY` target to run that step directly. -- **Solana Keypair Requirement**: For Solana bulding and deployment, ensure that for every program you have a keypair in `.e2e-testing/` directory in the format of `-keypair.json`. However, this key pair is secret and should not be shared. +The phony target typically depends on the file target, ensuring that the command is performed when necessary. -### Deployment Results +Each step usually prints a brief description before execution using a helper function like `description`, so you know what is happening. -- **Storage of Results**: The addresses of deployed contracts are stored in JSON files in their corresponding locations. For example, the token factory deployed on the `arbitrumSepolia` network will be stored in `evm_deploy_results/arbitrumSepolia/token_factory.json`. This is done to reuse these addresses across different runs of the tests. +### Order of prerequsites -### General Working Principles +In certain cases, the order in which prerequisites are listed (and thus passed to scripts) can matter. Pay special attention to the scripts that rely on positional arguments. -- **Phony Targets**: The `Makefile` uses `.PHONY` targets to define tasks that do not correspond to actual files. This ensures that these tasks are always executed when called, regardless of the presence of files with the same name. +### Special targets -- **Variables**: The `Makefile` defines several variables to manage paths and configurations, such as `TESTING_ROOT`, `EVM_DIR`, and `NEAR_DIR`. These variables help in organizing the file structure and making the `Makefile` adaptable to different environments. +- Every module or feature should provide a custom `clean-{custom-name}` target that removes the artifacts and stamp files it generates. +- Remember to add that clean target to the help target or a consolidated list of “clean” targets so that users can discover and run it easily. +- After adding module, don't forget to add it to the `help` target. -- **Rule Expansion**: The `Makefile` uses a combination of static and dynamic rule definitions. Dynamic rules are generated using the `define` directive, which allows for the creation of rules based on the networks specified in the `EVM_NETWORKS` variable. This approach reduces redundancy and makes it easy to add support for additional networks. +### Debugging -- **Dependencies**: Each target in the `Makefile` specifies its dependencies, ensuring that all necessary steps are completed before executing a task. For example, deploying a contract requires that it is compiled first. +- Run `make --dry-run` to print the commands that would be executed without actually running them. +- Use `make -d` for a more verbose explanation of why each command runs (or doesn’t run). It could be used with `make --dry-run` in order not to run the commands. -- **Command Execution**: The `Makefile` uses shell commands to execute tasks, such as running `yarn` for EVM contract compilation and deployment, and custom scripts for NEAR contract deployment. +## General recommendations for Makefiles in this project -In order to see which commands will be executed without actually executing them, you can add `--dry-run` to the command. \ No newline at end of file +Below are some guidelines to maintain consistency and clarity: +1. Internal variables (not environment or inherited from parent Makefile) should use lowercase. +2. Prefer `:=` (immediate assignment) over `=` (delayed assignment) for most variable definitions. +3. Use `.INTERMEDIATE` and `.PHONY` to define targets properly. +4. Make each phony target a prerequisite of `.PHONY` right before declaring the target. +5. Avoid using phony targets as prerequisites for file targets. +6. When a Makefile grows large, consider splitting it into multiple files, each handling a distinct set of tasks or a single pipeline. +7. Use automatic variables like `$^`, `$@`, `$<`, and `$(word n,$^)` wisely to simplify commands. +8. Directories often work best as order-only prerequisites (using the pipe symbol `|`) to avoid rebuilding them unnecessarily. +9. Try to avoid recursive Make patterns; a single dependency graph is often clearer. +10. Control verbosity to suit the needs of the project, for example by hiding command echoes and only printing the essential logs. diff --git a/e2e-testing/bridge-sdk-config.example.json b/e2e-testing/bridge-sdk-config.example.json new file mode 100644 index 00000000..7df84713 --- /dev/null +++ b/e2e-testing/bridge-sdk-config.example.json @@ -0,0 +1,25 @@ +{ + "near_rpc": "https://rpc.testnet.near.org/", + "near_token_locker_id": "omni-locker.testnet", + "near_light_client_eth_address": "0x202cdf10bfa45a3d2190901373edd864f071d707", + "near_signer": "omni-sender.testnet", + "near_private_key": "0x0000000000000000000000000000000000000000000000000000000000000000", + "eth_chain_id": 11155111, + "eth_bridge_token_factory_address": "0xa9108f7F83Fb661e611991116D526fCa1a9585ab", + "eth_connector_account_id": "aurora", + "eth_custodian_address": "0xe0320b199863D7f6D5bBa62741aACB312110DEf7", + "base_rpc": "https://base-sepolia.blockpi.network/v1/rpc/public", + "base_chain_id": 84532, + "base_bridge_token_factory_address": "0x0C981337fFe39a555d3A40dbb32f21aD0eF33FFA", + "arb_rpc": "https://arbitrum-sepolia.blockpi.network/v1/rpc/public", + "arb_chain_id": 421614, + "arb_bridge_token_factory_address": "0xd565f7CcE0FA1bB8DBe73FCDA281390d545f6200", + "solana_rpc": "https://api.devnet.solana.com", + "solana_bridge_address": "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5", + "solana_wormhole_address": "3u8hJUVTA4jH1wYAyUur7FFZVQ8H635K3tSHHF4ssjQ5", + "solana_keypair": "6Tyktf6mEqUMEKm2ZpLn3srEwk9zsT5jiE54EgPgToikMFYww1LGFUXgwgr6hvc9CikpaNaBH2vmkmqN3Usrxpd", + "fast_bridge_account_id": "fastbridge.testnet", + "fast_bridge_address": "0x0B2C4871C9bAD795746C05c1539A8B1f26c26357", + "eth_private_key": "", + "eth_rpc": "" +} \ No newline at end of file diff --git a/e2e-testing/evm_scripts/hardhat.config.ts b/e2e-testing/evm_scripts/hardhat.config.ts index c63937da..af14f2f3 100644 --- a/e2e-testing/evm_scripts/hardhat.config.ts +++ b/e2e-testing/evm_scripts/hardhat.config.ts @@ -108,26 +108,6 @@ const config: HardhatUserConfig = { interval: 0, }, }, - mainnet: { - omniChainId: 0, - chainId: 1, - url: `https://mainnet.infura.io/v3/${INFURA_API_KEY}`, - accounts: [`${EVM_PRIVATE_KEY}`], - }, - arbitrumMainnet: { - wormholeAddress: "0xa5f208e072434bC67592E4C49C1B991BA79BCA46", - omniChainId: 3, - chainId: 42161, - url: `https://arbitrum-mainnet.infura.io/v3/${INFURA_API_KEY}`, - accounts: [`${EVM_PRIVATE_KEY}`], - }, - baseMainnet: { - wormholeAddress: "0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6", - omniChainId: 4, - chainId: 8453, - url: `https://base-mainnet.infura.io/v3/${INFURA_API_KEY}`, - accounts: [`${EVM_PRIVATE_KEY}`], - }, sepolia: { omniChainId: 0, chainId: 11155111, diff --git a/e2e-testing/makefiles/common.mk b/e2e-testing/makefiles/common.mk new file mode 100644 index 00000000..ec68bfc2 --- /dev/null +++ b/e2e-testing/makefiles/common.mk @@ -0,0 +1,52 @@ +# Common variables and settings +common_testing_root := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))/.. +common_timestamp := $(shell date -u +%Y%m%d-%H%M%S) + +# ASCII box formatting for step descriptions +define description + @echo "|──────────────────────────────────────────────────────────────" + @echo "│ $(1)" + @echo "|──────────────────────────────────────────────────────────────" +endef + +# Progress bar for waiting operations +define progress_wait + @tput civis; \ + for i in $$(seq 1 $(1)); do \ + printf "\033[2K\rWaiting: ["; \ + p=$$((i * 100 / $(1))); \ + for j in $$(seq 1 $$p); do printf "="; done; \ + if [ $$p -lt 100 ]; then printf ">"; fi; \ + for j in $$(seq $$(($$p + 1)) 100); do printf " "; done; \ + printf "] $$p%% ($$i/$(1) seconds)"; \ + sleep 1; \ + done; \ + printf "\n"; \ + tput cnorm +endef + +# Common directories +common_near_deploy_results_dir := $(common_testing_root)/near_deploy_results +common_evm_deploy_results_dir := $(common_testing_root)/evm_deploy_results +common_solana_deploy_results_dir := $(common_testing_root)/solana_deploy_results + +# Common files +common_near_bridge_id_file := $(common_near_deploy_results_dir)/omni_bridge.json +common_bridge_sdk_config_file := $(common_testing_root)/bridge-sdk-config.json + +# Chain identifiers +COMMON_SEPOLIA_CHAIN_ID := 0 +COMMON_SEPOLIA_CHAIN_STR := Eth + +# Create required directories +$(common_near_deploy_results_dir) $(common_evm_deploy_results_dir) $(common_solana_deploy_results_dir): + $(call description,Creating directory to store deploy results: $@) + mkdir -p $@ + +# Clean targets +.PHONY: clean-deploy-results +clean-deploy-results: + $(call description,Cleaning deploy results directories) + rm -rf $(common_near_deploy_results_dir) + rm -rf $(common_evm_deploy_results_dir) + rm -rf $(common_solana_deploy_results_dir) \ No newline at end of file diff --git a/e2e-testing/makefiles/evm.mk b/e2e-testing/makefiles/evm.mk new file mode 100644 index 00000000..c745c4b0 --- /dev/null +++ b/e2e-testing/makefiles/evm.mk @@ -0,0 +1,117 @@ +# EVM-specific variables and rules +evm_dir := $(common_testing_root)/../evm +evm_script_dir := $(common_testing_root)/evm_scripts + +evm_compile_stamp := $(common_testing_root)/.evm-compile.stamp +evm_artifacts_dir := $(common_testing_root)/evm_artifacts +evm_script_compile_stamp := $(common_testing_root)/.evm-scripts-compile.stamp + +evm_networks := sepolia arbitrumSepolia baseSepolia + +# EVM deployment commands +EVM_DEPLOY_TOKEN_IMPL = yarn --silent --cwd $(evm_dir) hardhat deploy-token-impl --network $(1) +EVM_DEPLOY_OMNI_BRIDGE_CONTRACT = yarn --silent --cwd $(evm_dir) hardhat deploy-bridge-token-factory --network $(1) --bridge-token-impl $(2) --near-bridge-account-id $(3) +EVM_DEPLOY_FAKE_PROVER = yarn --silent --cwd $(evm_dir) hardhat deploy-fake-prover --network $(1) +EVM_DEPLOY_ENEAR_PROXY = yarn --silent --cwd $(evm_dir) hardhat deploy-e-near-proxy --network $(1) --enear $(2) + +EVM_DEPLOY_BYTECODE = yarn --silent --cwd $(evm_script_dir) hardhat deploy-bytecode --network $(1) --bytecode $(2) +EVM_DEPLOY_TEST_TOKEN = yarn --silent --cwd $(evm_script_dir) hardhat deploy-test-token --network $(1) --name $(2) --symbol $(3) + +evm_enear_creation_template_file := $(common_testing_root)/bin/eNear_creation.template + +# Clean targets +.PHONY: clean-evm +clean-evm: + $(call description,Cleaning EVM build artifacts) + rm -rf $(evm_artifacts_dir) + rm -f $(evm_compile_stamp) + rm -f $(evm_script_compile_stamp) + +# Build rules +.PHONY: evm-build +evm-build: $(evm_compile_stamp) +$(evm_compile_stamp): + $(call description,Building EVM contracts) + mkdir -p $(evm_artifacts_dir) && \ + yarn --cwd $(evm_dir) install --frozen-lockfile && \ + yarn --cwd $(evm_dir) hardhat compile && \ + cp -r $(evm_dir)/build/* $(evm_artifacts_dir) + touch $@ + +.PHONY: evm-scripts-build +evm-scripts-build: $(evm_script_compile_stamp) +$(evm_script_compile_stamp): + $(call description,Building EVM scripts) + yarn --cwd $(evm_script_dir) install && \ + yarn --cwd $(evm_script_dir) hardhat compile + touch $@ + +# Network-specific deployment rules +define generate_evm_deploy_rules + +$(1)_deploy_results_dir := $(common_evm_deploy_results_dir)/$(1) + +.PHONY: clean-evm-$(1) +clean-evm-$(1): + $(call description,Cleaning EVM deploy results for $(1)) + rm -rf $$($(1)_deploy_results_dir) + +$$($(1)_deploy_results_dir): | $(common_evm_deploy_results_dir) + $(call description,Creating deploy results directory for $(1)) + mkdir -p $$@ + +$(1)_bridge_contract_address_file := $$($(1)_deploy_results_dir)/omni_bridge.json +$(1)_token_impl_address_file := $$($(1)_deploy_results_dir)/token_impl.json +$(1)_fake_prover_address_file := $$($(1)_deploy_results_dir)/fake_prover.json +$(1)_enear_address_file := $$($(1)_deploy_results_dir)/eNear.json +$(1)_enear_proxy_address_file := $$($(1)_deploy_results_dir)/eNearProxy.json +$(1)_enear_creation_file := $$($(1)_deploy_results_dir)/eNear_creation +$(1)_test_token_address_file := $$($(1)_deploy_results_dir)/test_token.json + +.PHONY: $(1)-deploy-fake-prover +$(1)-deploy-fake-prover: $$($(1)_fake_prover_address_file) +$$($(1)_fake_prover_address_file): $(evm_compile_stamp) | $$($(1)_deploy_results_dir) + $(call description,Deploying fake prover to $(1)) + $$(call EVM_DEPLOY_FAKE_PROVER,$(1)) 2>/dev/stderr 1> $$@ + +$$($(1)_enear_creation_file): $$($(1)_fake_prover_address_file) $(evm_enear_creation_template_file) | $$($(1)_deploy_results_dir) + $(call description,Creating eNear creation file for $(1)) + cat $(evm_enear_creation_template_file) | \ + sed "s//$$(shell cat $$($(1)_fake_prover_address_file) | jq -r .fakeProverAddress | sed 's/^0x//')/" > $$@ + +.PHONY: $(1)-deploy-enear +$(1)-deploy-enear: $$($(1)_enear_address_file) +$$($(1)_enear_address_file): $$($(1)_enear_creation_file) $(evm_script_compile_stamp) | $$($(1)_deploy_results_dir) + $(call description,Deploying eNear to $(1)) + $$(call EVM_DEPLOY_BYTECODE,$(1),$$<) 2>/dev/stderr 1> $$@ + +.PHONY: $(1)-deploy-enear-proxy +$(1)-deploy-enear-proxy: $$($(1)_enear_proxy_address_file) +$$($(1)_enear_proxy_address_file): $$($(1)_enear_address_file) $(evm_compile_stamp) | $$($(1)_deploy_results_dir) + $(call description,Deploying eNear proxy to $(1)) + $$(call EVM_DEPLOY_ENEAR_PROXY,$(1),$$(shell cat $$< | jq -r .contractAddress)) 2>/dev/stderr 1> $$@ + +.PHONY: $(1)-deploy-token-impl +$(1)-deploy-token-impl: $$($(1)_token_impl_address_file) +$$($(1)_token_impl_address_file): $(evm_compile_stamp) | $$($(1)_deploy_results_dir) + $(call description,Deploying token implementation to $(1)) + $$(call EVM_DEPLOY_TOKEN_IMPL,$(1)) 2>/dev/stderr 1> $$@ + +.PHONY: $(1)-deploy-bridge +$(1)-deploy-bridge: $$($(1)_bridge_contract_address_file) +$$($(1)_bridge_contract_address_file): $$($(1)_token_impl_address_file) $(common_near_bridge_id_file) $(evm_compile_stamp) | $$($(1)_deploy_results_dir) + $(call description,Deploying bridge contract to $(1)) + $$(call EVM_DEPLOY_OMNI_BRIDGE_CONTRACT,$(1),$$(shell cat $$< | jq -r .tokenImplAddress),$$(shell cat $(common_near_bridge_id_file) | jq -r .contract_id)) 2>/dev/stderr 1> $$@ + +.PHONY: $(1)-deploy-test-token +$(1)-deploy-test-token: $$($(1)_test_token_address_file) +$$($(1)_test_token_address_file): $(evm_script_compile_stamp) | $$($(1)_deploy_results_dir) + $(call description,Deploying test token to $(1)) + $$(call EVM_DEPLOY_TEST_TOKEN,$(1),E2ETestToken-$(common_timestamp),E2ETT-$(common_timestamp)) 2>/dev/stderr 1> $$@ + +.PHONY: $(1)-deploy +$(1)-deploy: $(1)-deploy-bridge $(1)-deploy-enear-proxy $(1)-deploy-test-token + +endef + +$(foreach network,$(evm_networks),$(eval $(call generate_evm_deploy_rules,$(network)))) \ No newline at end of file diff --git a/e2e-testing/makefiles/near.mk b/e2e-testing/makefiles/near.mk new file mode 100644 index 00000000..75bfa9ab --- /dev/null +++ b/e2e-testing/makefiles/near.mk @@ -0,0 +1,125 @@ +# NEAR-specific variables and rules +near_dir := $(common_testing_root)/../near +near_binary_dir := $(common_testing_root)/near_artifacts + +near_init_params_file := $(common_testing_root)/near_init_params.json + +# List all expected WASM binaries +near_binaries := evm_prover.wasm omni_bridge.wasm omni_prover.wasm token_deployer.wasm wormhole_omni_prover_proxy.wasm mock_token.wasm +near_binary_paths := $(addprefix $(near_binary_dir)/,$(near_binaries)) + +# List of binaries that require dynamic init args +near_binaries_with_dynamic_args := token_deployer mock_token omni_bridge + +near_deploy_results := $(patsubst $(near_binary_dir)/%.wasm,$(common_near_deploy_results_dir)/%.json,$(near_binary_paths)) + +near_init_account_credentials_file := $(common_near_deploy_results_dir)/omni-init-account.json +near_dao_account_credentials_file := $(common_near_deploy_results_dir)/omni-dao-account.json + +near_prover_dau_grant_call_file := $(common_near_deploy_results_dir)/omni-prover-dau-grant-call.json + +near_evm_prover_setup_call_file := $(common_near_deploy_results_dir)/evm-prover-setup-call.json + +# Clean targets +.PHONY: clean-near +clean-near: + $(call description,Cleaning NEAR build artifacts) + rm -rf $(near_binary_dir) + rm -f $(common_testing_root)/*_dyn_init_args.json + +# Main deployment targets +.PHONY: near-deploy +near-deploy: $(near_deploy_results) + +.PHONY: near-build +near-build: $(near_binary_paths) + +$(near_binary_paths) &: + $(call description,Building NEAR contracts) + $(near_dir)/build.sh --output-dir $(near_binary_dir) + +# Account creation rules +.PHONY: create-near-init-account +create-near-init-account: $(near_init_account_credentials_file) +$(near_init_account_credentials_file): | $(common_near_deploy_results_dir) + $(call description,Creating NEAR init account) + ./scripts/create-near-account.sh omni-init-$(common_timestamp).testnet $@ + +.PHONY: create-dao-account +create-dao-account: $(near_dao_account_credentials_file) +$(near_dao_account_credentials_file): | $(common_near_deploy_results_dir) + $(call description,Creating NEAR DAO account) + ./scripts/create-near-account.sh omni-dao-$(common_timestamp).testnet $@ + +# Contract deployment rules +define generate_near_deploy_rules + +$(1)_name := $$(basename $$(notdir $(1))) + +# Check if the binary requires dynamic init args +ifeq ($$(filter $$($(1)_name),$(near_binaries_with_dynamic_args)),) + +# Rule for binaries without dynamic init args +$(common_near_deploy_results_dir)/$$($(1)_name).json: $(near_init_params_file) $(near_init_account_credentials_file) $(1) | $(common_near_deploy_results_dir) + $(call description,Deploying $$($(1)_name) contract) + ./scripts/deploy-near-contract.sh $$^ $$($(1)_name)-$(common_timestamp).testnet $$@ + +else + +# Rule for binaries with dynamic init args +$(common_near_deploy_results_dir)/$$($(1)_name).json: $(near_init_params_file) $(near_init_account_credentials_file) $(common_testing_root)/$$($(1)_name)_dyn_init_args.json $(1) | $(common_near_deploy_results_dir) + $(call description,Deploying $$($(1)_name) contract with dynamic init args) + ./scripts/deploy-near-contract.sh $$^ $$($(1)_name)-$(common_timestamp).testnet $$@ + +endif + +endef + +$(foreach binary,$(near_binary_paths),$(eval $(call generate_near_deploy_rules,$(binary)))) + +# Dynamic init args generation +$(common_testing_root)/token_deployer_dyn_init_args.json: $(common_near_deploy_results_dir)/omni_bridge.json $(near_init_account_credentials_file) + $(call description,Generating token deployer init args) + CONTROLLER_ADDRESS=$$(jq -r .contract_id $(common_near_deploy_results_dir)/omni_bridge.json) && \ + DAO_ADDRESS=$$(jq -r .account_id $(near_init_account_credentials_file)) && \ + echo "{\"controller\": \"$$CONTROLLER_ADDRESS\", \"dao\": \"$$DAO_ADDRESS\"}" > $@ + +$(common_testing_root)/mock_token_dyn_init_args.json: $(near_init_account_credentials_file) + $(call description,Generating mock token init args) + OWNER_ADDRESS=$$(jq -r .account_id $<) && \ + echo "{\"owner_id\": \"$$OWNER_ADDRESS\"}" > $@ + +$(common_testing_root)/omni_bridge_dyn_init_args.json: $(common_near_deploy_results_dir)/omni_prover.json + $(call description,Generating omni bridge init args) + PROVER_ADDRESS=$$(jq -r .contract_id $<) && \ + echo "{\"prover_account\": \"$$PROVER_ADDRESS\"}" > $@ + + +.PHONY: omni-prover-dau-grant +omni-prover-dau-grant: $(near_prover_dau_grant_call_file) +$(near_prover_dau_grant_call_file): $(near_init_account_credentials_file) $(near_dao_account_credentials_file) $(common_near_deploy_results_dir)/omni_prover.json + $(call description,Granting DAO role to omni prover) + OMNI_PROVER_ACCOUNT_ID=$$(jq -r .contract_id $(common_near_deploy_results_dir)/omni_prover.json) && \ + DAO_ACCOUNT_ID=$$(jq -r .account_id $(near_dao_account_credentials_file)) && \ + ./scripts/call-near-contract.sh -c $$OMNI_PROVER_ACCOUNT_ID \ + -m acl_grant_role \ + -a "{\"role\": \"DAO\", \"account_id\": \"$$DAO_ACCOUNT_ID\"}" \ + -f $(near_init_account_credentials_file) \ + -n testnet 2>&1 | tee $@ && \ + TX_HASH=$$(grep -o 'Transaction ID: [^ ]*' $@ | cut -d' ' -f3) && \ + echo "{\"tx_hash\": \"$$TX_HASH\"}" > $@ + + +.PHONY: evm-prover-setup +evm-prover-setup: $(near_evm_prover_setup_call_file) +$(near_evm_prover_setup_call_file): $(common_near_deploy_results_dir)/omni_prover.json $(common_near_deploy_results_dir)/evm_prover.json $(near_prover_dau_grant_call_file) + $(call description,Setting up EVM prover) + OMNI_PROVER_ACCOUNT_ID=$$(jq -r .contract_id $(common_near_deploy_results_dir)/omni_prover.json) && \ + EVM_PROVER_ACCOUNT_ID=$$(jq -r .contract_id $(common_near_deploy_results_dir)/evm_prover.json) && \ + ./scripts/call-near-contract.sh -c $$OMNI_PROVER_ACCOUNT_ID \ + -m add_prover \ + -a "{\"account_id\": \"$$EVM_PROVER_ACCOUNT_ID\", \"prover_id\": \"$(COMMON_SEPOLIA_CHAIN_STR)\"}" \ + -f $(near_dao_account_credentials_file) \ + -n testnet 2>&1 | tee $@ && \ + TX_HASH=$$(grep -o 'Transaction ID: [^ ]*' $@ | cut -d' ' -f3) && \ + echo "{\"tx_hash\": \"$$TX_HASH\"}" > $@ \ No newline at end of file diff --git a/e2e-testing/makefiles/pipelines/bridge_token_near_to_evm.mk b/e2e-testing/makefiles/pipelines/bridge_token_near_to_evm.mk new file mode 100644 index 00000000..b0f10ae0 --- /dev/null +++ b/e2e-testing/makefiles/pipelines/bridge_token_near_to_evm.mk @@ -0,0 +1,136 @@ +# Pipeline: Bridge NEAR Token to Ethereum +pipeline1_call_dir := $(common_testing_root)/bridge-token-near-to-evm + +# Clean target +.PHONY: clean-bridge-token-near-to-evm +clean-bridge-token-near-to-evm: + $(call description,Cleaning bridge pipeline artifacts) + rm -rf $(pipeline1_call_dir) + +# Account and contract ID files +pipeline1_sender_account_file := $(common_near_deploy_results_dir)/omni-sender.json +pipeline1_bridge_contract_file := $(common_near_deploy_results_dir)/omni_bridge.json +pipeline1_test_token_file := $(common_near_deploy_results_dir)/mock_token.json +pipeline1_relayer_account_file := $(common_near_deploy_results_dir)/omni-relayer.json +pipeline1_token_deployer_file := $(common_near_deploy_results_dir)/token_deployer.json + +# Call files +pipeline1_add_deployer_file := $(pipeline1_call_dir)/00-1_add-deployer-to-locker-call.json +pipeline1_add_factory_file := $(pipeline1_call_dir)/00-2_add-factory-to-locker-call.json +pipeline1_log_metadata_file := $(pipeline1_call_dir)/01_omni-log-metadata-call.json +pipeline1_evm_deploy_token_file := $(pipeline1_call_dir)/02_evm-deploy-token-call.json +pipeline1_near_bind_token_file := $(pipeline1_call_dir)/03_near-bind-token-call.json + +pipeline1_prepare_stamp := $(pipeline1_call_dir)/.prepare.stamp + +$(pipeline1_call_dir): + mkdir -p $@ + +# Account creation rules +.PHONY: create-near-sender +create-near-sender: $(pipeline1_sender_account_file) +$(pipeline1_sender_account_file): | $(common_near_deploy_results_dir) + $(call description,Creating NEAR sender account) + ./scripts/create-near-account.sh omni-sender-$(common_timestamp).testnet $@ + +.PHONY: create-near-relayer +create-near-relayer: $(pipeline1_relayer_account_file) +$(pipeline1_relayer_account_file): | $(common_near_deploy_results_dir) + $(call description,Creating NEAR relayer account) + ./scripts/create-near-account.sh omni-relayer-$(common_timestamp).testnet $@ + +# Main pipeline target +.PHONY: bridge-token-near-to-evm +bridge-token-near-to-evm: near-bind-token + +# Step 0: Prepare token deployment +.PHONY: prepare-token-deployment +prepare-token-deployment: $(pipeline1_prepare_stamp) +$(pipeline1_prepare_stamp): $(pipeline1_add_deployer_file) $(pipeline1_add_factory_file) $(near_evm_prover_setup_call_file) | $(pipeline1_call_dir) + $(call description,Token deployment preparation complete) + touch $@ + +# Step 0.1: Add deployer to locker +.PHONY: add-deployer-to-locker +add-deployer-to-locker: $(pipeline1_add_deployer_file) +$(pipeline1_add_deployer_file): $(pipeline1_token_deployer_file) $(pipeline1_bridge_contract_file) $(near_init_account_credentials_file) | $(pipeline1_call_dir) + $(call description,Bridge NEAR Token to Ethereum. Step 0.1: Adding token deployer to locker) + TOKEN_DEPLOYER_ID=$$(jq -r .contract_id $(pipeline1_token_deployer_file)) && \ + TOKEN_LOCKER_ID=$$(jq -r .contract_id $(pipeline1_bridge_contract_file)) && \ + ./scripts/call-near-contract.sh -c $$TOKEN_LOCKER_ID \ + -m add_token_deployer \ + -a "{\"chain\": \"$(COMMON_SEPOLIA_CHAIN_STR)\", \"account_id\": \"$$TOKEN_DEPLOYER_ID\"}" \ + -f $(near_init_account_credentials_file) \ + -n testnet 2>&1 | tee $@ && \ + TX_HASH=$$(grep -o 'Transaction ID: [^ ]*' $@ | cut -d' ' -f3) && \ + echo "{\"tx_hash\": \"$$TX_HASH\"}" > $@ + +# Step 0.2: Add Ethereum factory to locker +.PHONY: add-ethereum-factory-to-locker +add-ethereum-factory-to-locker: $(pipeline1_add_factory_file) +$(pipeline1_add_factory_file): $(pipeline1_bridge_contract_file) $(near_init_account_credentials_file) $(sepolia_bridge_contract_address_file) | $(pipeline1_call_dir) + $(call description,Bridge NEAR Token to Ethereum. Step 0.2: Adding Ethereum factory to locker) + FACTORY_ADDRESS=$$(jq -r .bridgeAddress $(sepolia_bridge_contract_address_file)) && \ + TOKEN_LOCKER_ID=$$(jq -r .contract_id $(pipeline1_bridge_contract_file)) && \ + ./scripts/call-near-contract.sh -c $$TOKEN_LOCKER_ID \ + -m add_factory \ + -a "{\"address\": \"$$FACTORY_ADDRESS\"}" \ + -f $(near_init_account_credentials_file) \ + -n testnet 2>&1 | tee $@ && \ + TX_HASH=$$(grep -o 'Transaction ID: [^ ]*' $@ | cut -d' ' -f3) && \ + echo "{\"tx_hash\": \"$$TX_HASH\"}" > $@ + +# Step 1: Log metadata +.PHONY: near-log-metadata-call +near-log-metadata-call: $(pipeline1_log_metadata_file) +$(pipeline1_log_metadata_file): $(pipeline1_sender_account_file) $(pipeline1_bridge_contract_file) $(pipeline1_test_token_file) $(pipeline1_prepare_stamp) | $(pipeline1_call_dir) + $(call description,Bridge NEAR Token to Ethereum. Step 1: Logging token metadata) + TOKEN_ID=$$(jq -r .contract_id $(pipeline1_test_token_file)) && \ + SENDER_ACCOUNT_ID=$$(jq -r .account_id $(pipeline1_sender_account_file)) && \ + SENDER_PRIVATE_KEY=$$(jq -r .private_key $(pipeline1_sender_account_file)) && \ + TOKEN_LOCKER_ID=$$(jq -r .contract_id $(pipeline1_bridge_contract_file)) && \ + bridge-cli testnet omni-connector log-metadata \ + --token near:$$TOKEN_ID \ + --near-signer $$SENDER_ACCOUNT_ID \ + --near-private-key $$SENDER_PRIVATE_KEY \ + --near-token-locker-id $$TOKEN_LOCKER_ID \ + --config-file $(common_bridge_sdk_config_file) > $@ && \ + TX_HASH=$$(grep -o 'tx_hash="[^"]*"' $@ | cut -d'"' -f2) && \ + echo "{\"tx_hash\": \"$$TX_HASH\"}" > $@ + +# Step 2: Deploy token on Ethereum +.PHONY: ethereum-deploy-token +ethereum-deploy-token: $(pipeline1_evm_deploy_token_file) +$(pipeline1_evm_deploy_token_file): $(pipeline1_log_metadata_file) $(sepolia_bridge_contract_address_file) | $(pipeline1_call_dir) + $(call description,Bridge NEAR Token to Ethereum. Step 2: Deploying token on Ethereum) + TX_HASH=$$(jq -r .tx_hash $(pipeline1_log_metadata_file)) && \ + ETH_BRIDGE_TOKEN_FACTORY_ADDRESS=$$(jq -r .bridgeAddress $(sepolia_bridge_contract_address_file)) && \ + bridge-cli testnet omni-connector evm-deploy-token \ + --chain $(COMMON_SEPOLIA_CHAIN_STR) \ + --tx-hash $$TX_HASH \ + --eth-bridge-token-factory-address $$ETH_BRIDGE_TOKEN_FACTORY_ADDRESS \ + --config-file $(common_bridge_sdk_config_file) > $@ && \ + TX_HASH=$$(grep -o 'tx_hash="[^"]*"' $@ | cut -d'"' -f2) && \ + echo "{\"tx_hash\": \"$$TX_HASH\"}" > $@ + + +# Step 3: Bind token on NEAR +.PHONY: near-bind-token +near-bind-token: $(pipeline1_near_bind_token_file) +$(pipeline1_near_bind_token_file): $(pipeline1_evm_deploy_token_file) $(pipeline1_relayer_account_file) | $(pipeline1_call_dir) + $(call description,Waiting for Ethereum transaction being captured by relayer) + $(call progress_wait,1300) + $(call description,Bridge NEAR Token to Ethereum. Step 3: Binding token on NEAR) + TX_HASH=$$(jq -r .tx_hash $(pipeline1_evm_deploy_token_file)) && \ + RELAYER_ACCOUNT_ID=$$(jq -r .account_id $(pipeline1_relayer_account_file)) && \ + RELAYER_PRIVATE_KEY=$$(jq -r .private_key $(pipeline1_relayer_account_file)) && \ + TOKEN_LOCKER_ID=$$(jq -r .contract_id $(pipeline1_bridge_contract_file)) && \ + bridge-cli testnet omni-connector near-bind-token \ + --chain $(COMMON_SEPOLIA_CHAIN_STR) \ + --tx-hash $$TX_HASH \ + --near-signer $$RELAYER_ACCOUNT_ID \ + --near-private-key $$RELAYER_PRIVATE_KEY \ + --near-token-locker-id $$TOKEN_LOCKER_ID \ + --config-file $(common_bridge_sdk_config_file) > $@ && \ + TX_HASH=$$(grep -o 'tx_hash="[^"]*"' $@ | cut -d'"' -f2) && \ + echo "{\"tx_hash\": \"$$TX_HASH\"}" > $@ \ No newline at end of file diff --git a/e2e-testing/makefiles/solana.mk b/e2e-testing/makefiles/solana.mk new file mode 100644 index 00000000..f568aa9f --- /dev/null +++ b/e2e-testing/makefiles/solana.mk @@ -0,0 +1,42 @@ +# Solana-specific variables and rules +solana_dir := $(common_testing_root)/../solana + +solana_build_stamp := $(common_testing_root)/.solana-build.stamp +solana_artifacts_dir := $(common_testing_root)/solana_artifacts + +solana_programs := bridge_token_factory +solana_programs_keypairs := $(foreach program,$(solana_programs),$(solana_dir)/$(program)/target/deploy/$(program)-keypair.json) +solana_programs_binaries := $(foreach program,$(solana_programs),$(solana_artifacts_dir)/$(program)/target/deploy/$(program).so) + +# Clean targets +.PHONY: clean-solana +clean-solana: + $(call description,Cleaning Solana build artifacts) + rm -rf $(solana_artifacts_dir) + rm -f $(solana_build_stamp) + +# Main build target +.PHONY: solana-build +solana-build: $(solana_build_stamp) +$(solana_build_stamp): $(solana_programs_keypairs) $(solana_programs_binaries) + $(call description,Solana build complete) + touch $@ + +# Program-specific build rules +define generate_solana_build_rules + +$(solana_dir)/$(1)/target/deploy/$(1)-keypair.json: $(common_testing_root)/$(1)-keypair.json + $(call description,Setting up keypair for $(1)) + mkdir -p $$(dir $$@) && \ + cp $$< $$@ + +$(solana_artifacts_dir)/$(1)/target/deploy/$(1).so: $(solana_dir)/$(1)/target/deploy/$(1)-keypair.json + $(call description,Building Solana program $(1)) + mkdir -p $(solana_artifacts_dir)/$(1) && \ + cd $(solana_dir)/$(1) && \ + anchor build && \ + cp -r $(solana_dir)/$(1)/target/* $(solana_artifacts_dir)/$(1) + +endef + +$(foreach program,$(solana_programs),$(eval $(call generate_solana_build_rules,$(program)))) \ No newline at end of file diff --git a/e2e-testing/near_init_params.json b/e2e-testing/near_init_params.json new file mode 100644 index 00000000..54e1a08b --- /dev/null +++ b/e2e-testing/near_init_params.json @@ -0,0 +1,47 @@ +{ + "evm_prover": { + "init_function": "init", + "init_args": { + "light_client": "client-eth2.sepolia.testnet", + "chain_kind": "Eth" + } + }, + "wormhole_omni_prover_proxy": { + "init_function": "init", + "init_args": { + "prover_account": "prover.sepolia.testnet" + } + }, + "omni_prover": { + "init_function": "init", + "init_args": {} + }, + "omni_bridge": { + "init_function": "new", + "init_args": { + "mpc_signer": "v1.signer-prod.testnet", + "wnear_account_id": "wrap.testnet" + } + }, + "omni_token": { + "init_function": "new", + "init_args": { + "controller": "e2e-dev.testnet", + "metadata": { + "name": "TestE2E", + "symbol": "te2e", + "decimals": 24 + } + } + }, + "token_deployer": { + "init_function": "new", + "init_args": {} + }, + "mock_token": { + "init_function": "new_default_meta", + "init_args": { + "total_supply": "1000000000" + } + } +} \ No newline at end of file diff --git a/e2e-testing/scripts/call-near-contract.sh b/e2e-testing/scripts/call-near-contract.sh new file mode 100755 index 00000000..1ddc9cdc --- /dev/null +++ b/e2e-testing/scripts/call-near-contract.sh @@ -0,0 +1,87 @@ +#!/usr/bin/env bash + +set -eu -o pipefail + +usage() { + echo "Usage: $0 [options]" + echo "Options:" + echo " -c CONTRACT_ID Contract ID (required)" + echo " -m METHOD_NAME Method name to call (required)" + echo " -a METHOD_ARGS Method arguments in JSON format (default: {})" + echo " -g GAS Gas amount (default: 100.0 Tgas)" + echo " -d DEPOSIT Deposit amount (default: 0 NEAR)" + echo " -f CREDENTIALS Credentials JSON file with account_id, public_key, and private_key (required)" + echo " -n NETWORK Network to use (default: testnet)" + echo " -h Show this help message" + exit 1 +} + +# Default values +METHOD_ARGS="{}" +GAS="100.0 Tgas" +DEPOSIT="0 NEAR" +NETWORK="testnet" + +# Parse command line arguments +while getopts "c:m:a:g:d:f:n:h" opt; do + case $opt in + c) CONTRACT_ID="$OPTARG" ;; + m) METHOD_NAME="$OPTARG" ;; + a) METHOD_ARGS="$OPTARG" ;; + g) GAS="$OPTARG" ;; + d) DEPOSIT="$OPTARG" ;; + f) CREDENTIALS_FILE="$OPTARG" ;; + n) NETWORK="$OPTARG" ;; + h) usage ;; + ?) usage ;; + esac +done + +# Validate required parameters +if [ -z "$CONTRACT_ID" ]; then + echo "Error: CONTRACT_ID (-c) is required" + usage +fi + +if [ -z "$METHOD_NAME" ]; then + echo "Error: METHOD_NAME (-m) is required" + usage +fi + +if [ -z "$CREDENTIALS_FILE" ]; then + echo "Error: CREDENTIALS_FILE (-f) is required" + usage +fi + +if [ ! -f "$CREDENTIALS_FILE" ]; then + echo "Error: Credentials file $CREDENTIALS_FILE does not exist" + exit 1 +fi + +# Read credentials from file +SIGNER_ACCOUNT_ID=$(jq -r .account_id "$CREDENTIALS_FILE") +SIGNER_PUBLIC_KEY=$(jq -r .public_key "$CREDENTIALS_FILE") +SIGNER_PRIVATE_KEY=$(jq -r .private_key "$CREDENTIALS_FILE") + +if [ -z "$SIGNER_ACCOUNT_ID" ] || [ "$SIGNER_ACCOUNT_ID" = "null" ]; then + echo "Error: account_id not found in credentials file" + exit 1 +fi + +if [ -z "$SIGNER_PUBLIC_KEY" ] || [ "$SIGNER_PUBLIC_KEY" = "null" ] || [ -z "$SIGNER_PRIVATE_KEY" ] || [ "$SIGNER_PRIVATE_KEY" = "null" ]; then + echo "Error: public_key or private_key not found in credentials file" + exit 1 +fi + +echo "Calling contract method: $METHOD_NAME" +if ! near contract call-function as-transaction "$CONTRACT_ID" \ + "$METHOD_NAME" \ + json-args "$METHOD_ARGS" \ + prepaid-gas "$GAS" attached-deposit "$DEPOSIT" \ + sign-as "$SIGNER_ACCOUNT_ID" \ + network-config "$NETWORK" \ + sign-with-plaintext-private-key --signer-public-key "$SIGNER_PUBLIC_KEY" --signer-private-key "$SIGNER_PRIVATE_KEY" \ + send; then + echo "Failed to call method ${METHOD_NAME} on contract ${CONTRACT_ID}" + exit 1 +fi \ No newline at end of file diff --git a/e2e-testing/scripts/create-near-account.sh b/e2e-testing/scripts/create-near-account.sh new file mode 100755 index 00000000..f3f60ae5 --- /dev/null +++ b/e2e-testing/scripts/create-near-account.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail + +ACCOUNT_ID="$1" +OUTPUT_JSON="$2" + +echo "Creating account for ${ACCOUNT_ID}" + +if ! near account create-account sponsor-by-faucet-service "$ACCOUNT_ID" \ + autogenerate-new-keypair save-to-legacy-keychain network-config testnet create; then + echo "Failed to create account for ${ACCOUNT_ID}" + exit 1 +fi + +# Extract private key from credentials +CREDENTIALS_FILE="$HOME/.near-credentials/testnet/$ACCOUNT_ID.json" +jq -c --arg account_id "$ACCOUNT_ID" '. + {account_id: $account_id}' "$CREDENTIALS_FILE" > "$OUTPUT_JSON" + +echo "Account created successfully, saved to $OUTPUT_JSON" diff --git a/e2e-testing/scripts/deploy-near-contract.sh b/e2e-testing/scripts/deploy-near-contract.sh index dfc89423..6b307c57 100755 --- a/e2e-testing/scripts/deploy-near-contract.sh +++ b/e2e-testing/scripts/deploy-near-contract.sh @@ -1,38 +1,87 @@ #!/usr/bin/env bash set -euo pipefail -# Usage: ./deploy-near-contract.sh -# Example: ./deploy-near-contract.sh ./near_binary/omni_bridge.wasm ./near_deploy_results/omni_bridge.json omni-bridge-20240318-123456.testnet +# Usage: ./deploy-near-contract.sh [] - -if [ "$#" -ne 3 ]; then - echo "Usage: $0 " +if [ "$#" -ne 5 ] && [ "$#" -ne 6 ]; then + echo "Error: Invalid number of arguments" + echo "Usage: $0 [] " exit 1 fi -WASM_PATH="$1" -OUTPUT_JSON="$2" -CONTRACT_ID="$3" -BINARY_NAME=$(basename "$WASM_PATH" .wasm) +if [ "$#" -eq 5 ]; then + NEAR_INIT_PARAMS_FILE="$1" + INIT_ACCOUNT_CREDENTIALS_FILE="$2" + WASM_PATH="$3" + CONTRACT_ID="$4" + OUTPUT_JSON="$5" + DYN_INIT_ARGS_FILE="" +else + NEAR_INIT_PARAMS_FILE="$1" + INIT_ACCOUNT_CREDENTIALS_FILE="$2" + DYN_INIT_ARGS_FILE="$3" + WASM_PATH="$4" + CONTRACT_ID="$5" + OUTPUT_JSON="$6" +fi + +INIT_ACCOUNT_ID=$(jq -r .account_id "$INIT_ACCOUNT_CREDENTIALS_FILE") +INIT_ACCOUNT_PUBLIC_KEY=$(jq -r .public_key "$INIT_ACCOUNT_CREDENTIALS_FILE") +INIT_ACCOUNT_PRIVATE_KEY=$(jq -r .private_key "$INIT_ACCOUNT_CREDENTIALS_FILE") -echo "Deploying ${BINARY_NAME} to ${CONTRACT_ID}" +CONTRACT_NAME=$(basename "$OUTPUT_JSON" .json) + +# Extract init function and merge init args +INIT_FUNCTION=$(jq -rc ".$CONTRACT_NAME.init_function // \"\"" "$NEAR_INIT_PARAMS_FILE") +STATIC_INIT_ARGS=$(jq -rc ".$CONTRACT_NAME.init_args // {}" "$NEAR_INIT_PARAMS_FILE") + +if [ -f "$DYN_INIT_ARGS_FILE" ]; then + DYN_INIT_ARGS=$(cat "$DYN_INIT_ARGS_FILE") +else + DYN_INIT_ARGS="{}" +fi +INIT_ARGS=$(echo "$STATIC_INIT_ARGS $DYN_INIT_ARGS" | jq -s add) + +echo "Creating the contract account" # Create the contract account if ! near account create-account sponsor-by-faucet-service "$CONTRACT_ID" \ autogenerate-new-keypair save-to-keychain network-config testnet create; then - echo "Failed to create account for ${BINARY_NAME}" + echo "Failed to create account for ${CONTRACT_NAME}" exit 1 fi # Delay to allow the account to be created sleep 3 -# Deploy the contract +# Deploy the contract +echo "Deploying the contract" if ! near contract deploy "$CONTRACT_ID" use-file "$WASM_PATH" \ without-init-call network-config testnet sign-with-keychain send; then - echo "Failed to deploy ${BINARY_NAME}" + echo "Failed to deploy ${CONTRACT_NAME}" exit 1 fi +# Delay to allow the account to be deployed +sleep 3 + +# Init the contract only if init function is specified +if [ -n "$INIT_FUNCTION" ]; then + echo "Init the contract" + if ! near contract call-function as-transaction "$CONTRACT_ID" \ + "$INIT_FUNCTION" \ + json-args "$INIT_ARGS" \ + prepaid-gas '100.0 Tgas' attached-deposit '0 NEAR' \ + sign-as "$INIT_ACCOUNT_ID" \ + network-config testnet \ + sign-with-plaintext-private-key --signer-public-key "$INIT_ACCOUNT_PUBLIC_KEY" --signer-private-key "$INIT_ACCOUNT_PRIVATE_KEY" \ + send; then + echo "Failed to init ${CONTRACT_NAME}" + exit 1 + fi +else + echo "No init function specified, skipping contract initialization" +fi + echo "{\"contract_id\": \"$CONTRACT_ID\"}" > "$OUTPUT_JSON" echo "Deployment successful, saved to $OUTPUT_JSON" \ No newline at end of file diff --git a/near/res/evm_prover.wasm b/near/res/evm_prover.wasm index f408fa8a6ffa2ec630227e8125e2738308f03dde..d62777b9af5b25e277c7d86f19b5090813f48eee 100755 GIT binary patch delta 23968 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 IC@(4h2f;|;$N&HU diff --git a/near/res/omni_bridge.wasm b/near/res/omni_bridge.wasm index f97774a313b937bc69b92038e1952be2d11c1b5e..3501964828297b720393ffb539a0d518d893a234 100755 GIT binary patch delta 129418 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 diff --git a/near/res/wormhole_omni_prover_proxy.wasm b/near/res/wormhole_omni_prover_proxy.wasm index 1193a26619f3b01dc25e9782e054a762ecc9342d..12f0dd48668af49854a7a1c5c055138ba6c5f45c 100755 GIT binary patch delta 5189 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 delta 5226 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 XS&&$kW!`L2%}D#Qtdp0qo4)@85j5D4 diff --git a/omni-relayer/Cargo.lock b/omni-relayer/Cargo.lock index 4351581f..44fa7c49 100644 --- a/omni-relayer/Cargo.lock +++ b/omni-relayer/Cargo.lock @@ -133,9 +133,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.1.56" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a725039ef382d1b6b4e2ebcb15b1efff6cde9af48c47a1bdce6fb67b9456c34b" +checksum = "4ab9d1367c6ffb90c93fb4a9a4989530aa85112438c6f73a734067255d348469" dependencies = [ "alloy-primitives", "num_enum", @@ -1173,9 +1173,9 @@ checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "aws-config" -version = "1.5.14" +version = "1.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f40e82e858e02445402906e454a73e244c7f501fcae198977585946c48e8697" +checksum = "dc47e70fc35d054c8fcd296d47a61711f043ac80534a10b4f741904f81e73a90" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1241,9 +1241,9 @@ dependencies = [ [[package]] name = "aws-sdk-s3" -version = "1.69.0" +version = "1.71.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a88f1c30e4ffa2464f910297c24736ff68cca9e8d2b7d52596b54efd99b9c1e" +checksum = "705cb534fb7b620f540d2fac268d378918dc67d25b173f67edcab3851fe19392" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1275,9 +1275,9 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.54.0" +version = "1.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "921a13ed6aabe2d1258f65ef7804946255c799224440774c30e1a2c65cdf983a" +checksum = "12e057fdcb8842de9b83592a70f5b4da0ee10bc0ad278247da1425a742a444d7" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1297,9 +1297,9 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.55.0" +version = "1.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196c952738b05dfc917d82a3e9b5ba850822a6d6a86d677afda2a156cc172ceb" +checksum = "a120ade4a44691b3c5c2ff2fa61b14ed331fdc218397f61ab48d66593012ae2a" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1319,9 +1319,9 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.55.0" +version = "1.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ef5b73a927ed80b44096f8c20fb4abae65469af15198367e179ae267256e9d" +checksum = "115fd4fb663817ed595a5ee4f1649d7aacd861d47462323cb37576ce89271b93" dependencies = [ "aws-credential-types", "aws-runtime", @@ -1815,7 +1815,7 @@ dependencies = [ [[package]] name = "bridge-connector-common" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "eth-proof", "ethers", @@ -2305,6 +2305,26 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -2341,9 +2361,9 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", ] @@ -2427,9 +2447,9 @@ checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" [[package]] name = "crypto-bigint" @@ -3183,7 +3203,7 @@ dependencies = [ [[package]] name = "eth-proof" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "borsh 1.5.5", "cita_trie", @@ -3552,7 +3572,7 @@ dependencies = [ [[package]] name = "evm-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -4625,13 +4645,13 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] name = "is-terminal" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "e19b23d53f35ce9f56aebc7d1bb4e6ac1e9c0db7ac85c8d1760c04379edced37" dependencies = [ "hermit-abi 0.4.0", "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -5035,9 +5055,9 @@ dependencies = [ [[package]] name = "native-tls" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" +checksum = "0dab59f8e050d5df8e4dd87d9206fb6f65a483e20ac9fda365ade4fab353196c" dependencies = [ "libc", "log", @@ -5063,7 +5083,7 @@ dependencies = [ [[package]] name = "near-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -5292,7 +5312,7 @@ dependencies = [ [[package]] name = "near-light-client-on-eth" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "ethereum-types 0.14.1", "ethers", @@ -5464,7 +5484,7 @@ dependencies = [ [[package]] name = "near-rpc-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "borsh 1.5.5", "lazy_static", @@ -5857,7 +5877,7 @@ dependencies = [ [[package]] name = "omni-connector" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "borsh 1.5.5", "bridge-connector-common", @@ -5981,9 +6001,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "f5e534d133a060a3c19daec1eb3e98ec6f4685978834f2dbadfe2ec215bab64e" dependencies = [ "bitflags 2.8.0", "cfg-if 1.0.0", @@ -6007,9 +6027,9 @@ dependencies = [ [[package]] name = "openssl-probe" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-src" @@ -6070,28 +6090,30 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "7e5fdb66425c73b3f87565b2c8bd70c27afdd41b5e14ab46f303873a7c50294e" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", + "const_format", "impl-trait-for-tuples", "parity-scale-codec-derive", + "rustversion", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "40e3e3dbdd7e7f6a58a4bdb105f88a85ba6d52bac9c98c69276bce153abe9ab5" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.96", ] [[package]] @@ -6707,9 +6729,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.28.1" +version = "0.28.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f89727cba9cec05cc579942321ff6dd09fe57a8b3217f52f952301efa010da5" +checksum = "e37ec3fd44bea2ec947ba6cc7634d7999a6590aca7c35827c250bc0de502bda6" dependencies = [ "arc-swap", "bytes", @@ -7054,9 +7076,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.43" +version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a78891ee6bf2340288408954ac787aa063d8e8817e9f53abb37c695c6d834ef6" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ "bitflags 2.8.0", "errno", @@ -7136,9 +7158,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2bf47e6ff922db3825eb750c4e2ff784c6ff8fb9e13046ef6a1d1c5401b0b37" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ "web-time", ] @@ -7698,9 +7720,9 @@ dependencies = [ [[package]] name = "solana-account" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8557558040a6bf34101ea0ded1647bafc21c2a9ea0913034fa6794a304ba6791" +checksum = "d2af97266ee346ef1cd1649ba462d08bd3d254e50c06c45d3e70a21871a1da6a" dependencies = [ "bincode", "serde", @@ -7712,9 +7734,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2353887223851d07071e790a6508d8df61032a5e01bb6f990d7abe7f58dde3aa" +checksum = "717a67d421f9ba91a7b845af1d5b0039fcb44b86f4b294b28ae447a0f2bf48c8" dependencies = [ "Inflector", "base64 0.22.1", @@ -7738,9 +7760,9 @@ dependencies = [ [[package]] name = "solana-account-decoder-client-types" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435bb722c456f78dd3ac33a1b4641c46d5d41de5b072422ae5b0dc9f486c0928" +checksum = "e42008241f82751639daee861f1ecaf9c3342d3aa6ce96c063290379a5f9f7c0" dependencies = [ "base64 0.22.1", "bs58 0.5.1", @@ -7754,9 +7776,9 @@ dependencies = [ [[package]] name = "solana-account-info" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abeb32e8dbead1f920a919d8c781fe058cf657313aa237566fa812d2288f2aab" +checksum = "3ed2417317f26f0941dd8e552ac1f9768eb2aa3b7f16ec992a6833f058295bea" dependencies = [ "bincode", "serde", @@ -7767,18 +7789,18 @@ dependencies = [ [[package]] name = "solana-atomic-u64" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ceb7242711300b8d67933a3cd1c9b2cd7c4e98de529356ecddf340c98c457d" +checksum = "f0cd0453d46a62ed36ce234be9153a3c4d433711f1cec6943345d1637d6a0908" dependencies = [ "parking_lot", ] [[package]] name = "solana-bincode" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e154567b6846f4721c713afdd14c56892800fb940793ef529a68d6db6cf1beef" +checksum = "a97957d987dc85bbfa90cb7e919ee0b071206affc0209e7221d7ea4844e7be31" dependencies = [ "bincode", "serde", @@ -7787,9 +7809,9 @@ dependencies = [ [[package]] name = "solana-bn254" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c42ad3282999ef7df859e7ed03a6e6a4187ff4931f9814ddcd0477dba2be15" +checksum = "957ce0d8b021f78f7b3c99d82b21a8dae617cf016377647c4d43a6e3141e8f2f" dependencies = [ "ark-bn254", "ark-ec", @@ -7802,9 +7824,9 @@ dependencies = [ [[package]] name = "solana-borsh" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b2428671e99134c97990d2b466c33779f785376b7934e6bddb635929c54208f" +checksum = "99affe31b10c1cd4a6438d307b92c1b17c89c974aebf2c2aa15cd790d0ba672b" dependencies = [ "borsh 0.10.4", "borsh 1.5.5", @@ -7813,7 +7835,7 @@ dependencies = [ [[package]] name = "solana-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "borsh 1.5.5", "derive_builder 0.20.2", @@ -7828,9 +7850,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73d3a06371c4b63efa8d2dde9890b658891943807c529144eac6d2345538077d" +checksum = "3433292dc183886b1f36ee87e971477556226df2f566fc5a19585a0d740aa8b0" dependencies = [ "async-trait", "bincode", @@ -7860,9 +7882,9 @@ dependencies = [ [[package]] name = "solana-clock" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d639043cefcd061c31a342364adcb204406ebbd91ef86dfde88b74352b688cf" +checksum = "97864f28abd43d03e7ca7242059e340bb6e637e0ce99fd66f6420c43fa359898" dependencies = [ "serde", "serde_derive", @@ -7872,18 +7894,18 @@ dependencies = [ [[package]] name = "solana-compute-budget" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c885192c0afe6f7beac13e1c8eb51ce36bc60e8f0b7631f9cbf72d8ca6aa03" +checksum = "9f92a2ba8c5ed92fc805f8a92a3bfbbaca05da80d87f180aea4e9f28b9e0fa22" dependencies = [ "solana-sdk", ] [[package]] name = "solana-config-program" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056ce3a28f5e22677e0db1fc976294041571c4d471a752bfc9f1b06f8828c488" +checksum = "08a78fbed4792e4cd029a0dd95d14ec42ea602fd7247b40e8fbc4c96b3404da1" dependencies = [ "bincode", "chrono", @@ -7897,9 +7919,9 @@ dependencies = [ [[package]] name = "solana-connection-cache" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52912ec1eb7b40af2a81269d0bb2cefba01f303383cba32067d0dc5020556e38" +checksum = "c7aa1f4cb4c3829357189e6a88624205016b0710f11509f84f772c87c4887159" dependencies = [ "async-trait", "bincode", @@ -7918,9 +7940,9 @@ dependencies = [ [[package]] name = "solana-cpi" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b87b387931f41422be3d82190e29c8414bbb4e8517dd94afb838012260d7a60" +checksum = "d54c3b096dc77222b9c19ffe9cf6c1c32bd1e9882ceb955d213be4315bbe3b95" dependencies = [ "solana-account-info", "solana-define-syscall", @@ -7932,9 +7954,9 @@ dependencies = [ [[package]] name = "solana-curve25519" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b91a6c7db7874ab0721ba2ad49c34614c6af5bfa1a02f18ee471d28416b1fc" +checksum = "4b2ed697e82c44b0833550501e3fab428c07cc2865c788307fad4c98a64d27d0" dependencies = [ "bytemuck", "bytemuck_derive", @@ -7945,24 +7967,24 @@ dependencies = [ [[package]] name = "solana-decode-error" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64b93163519c0b7419d3ac206207594d4b43e00267496996b898345ff3b31ed1" +checksum = "6c92852914fe0cfec234576a30b1de4b11516dd729226d5de04e4c67d80447a7" dependencies = [ "num-traits", ] [[package]] name = "solana-define-syscall" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d1b215d56d29f71782df6880d71b5a46cf9a4035046414488c7de6906899ba" +checksum = "44015e77f6f321bf526f7d026b08d8f34b57b1ea6e46038fd13e59f43a53a475" [[package]] name = "solana-derivation-path" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31edf5d285689b469471a1a0200f0c9196be7df155860bd83dfd735439172bd" +checksum = "e2cd4b95383d8926cc22d4a33417aa2e38897475f259cff4eb319c8cf0f7ac02" dependencies = [ "derivation-path", "qstring", @@ -7971,9 +7993,9 @@ dependencies = [ [[package]] name = "solana-epoch-schedule" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88aa6588f178c32258eb616ef1428f2c86beae370d6486843313f6320e055190" +checksum = "b3409f250234ec4bbd999de3eac727ca21dfbfd39a831906f6ec112a66d2e1a2" dependencies = [ "serde", "serde_derive", @@ -7983,9 +8005,9 @@ dependencies = [ [[package]] name = "solana-feature-set" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1736c5f6cb5d65e684a1daf425dd1479849e0793ffe877feedb602642ee5deb0" +checksum = "61ddda14ac5f2da82da4df043eabca2f2c00ac0d59f10295b8c8c3404fcc5f67" dependencies = [ "lazy_static", "solana-clock", @@ -7997,9 +8019,9 @@ dependencies = [ [[package]] name = "solana-fee-calculator" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ef28a47c3fcfd4ef8b19468531e32a431f6589f359cdbb927fc5e7fb859413" +checksum = "f8db8c4be5e012215ed1e3394cd3c188e217dd4f0c821045e5d2c1262aac8b4e" dependencies = [ "log", "serde", @@ -8008,9 +8030,9 @@ dependencies = [ [[package]] name = "solana-hash" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad865143587f6173d0bd15ec66b749fd2682c865467ffd2bb725705e33f0c8fa" +checksum = "7c25925816be2f57992c4c5af7dff31713bc95696c2fbc4bca911e290ba2f330" dependencies = [ "borsh 1.5.5", "bs58 0.5.1", @@ -8026,9 +8048,9 @@ dependencies = [ [[package]] name = "solana-inflation" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a205cb59db7fa1afc89ad5d960ac5afb997ba231cdc943451811746c84b7776d" +checksum = "e91a53086a0f0cc093ffce9e5be4399785f05a0d49f0ff2cd6d5f3f4d593e2e9" dependencies = [ "serde", "serde_derive", @@ -8036,9 +8058,9 @@ dependencies = [ [[package]] name = "solana-inline-spl" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47d825ad3f7d3eede036d2c3b11eb385912eb3e01872bc98901802f942eab8a" +checksum = "8a4fa02c553c48a6e189960b5bd3aa854b29c888bd5db4c1ad4bb6a0cc068c78" dependencies = [ "bytemuck", "solana-pubkey", @@ -8046,9 +8068,9 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af795f16bef3ae76e97978e35724ea88d2b9eba67a9e233adf48ccefeaa6e6b8" +checksum = "eab8c46b6f76857222ee1adeb7031b8eb0eb5134920614e9fd1bd710052b96a9" dependencies = [ "bincode", "borsh 1.5.5", @@ -8064,9 +8086,9 @@ dependencies = [ [[package]] name = "solana-last-restart-slot" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f88c8171167f1fd4ef1e5a083fd0e8f35ac60aacd1ffe163a1ef7053a28524be" +checksum = "633f272467f3e1a28dfcfb1a7df55129752524a18938a84fd67086e205f0bd88" dependencies = [ "serde", "serde_derive", @@ -8076,24 +8098,24 @@ dependencies = [ [[package]] name = "solana-log-collector" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7922b879e4c03e00bf6ed21b1f8579ac71f6743d95c22306bd1ba8994e4f90e8" +checksum = "034627f9849eeafcbfa24f0e4ad0da50eb68422ceab5c605b7d87755af77b201" dependencies = [ "log", ] [[package]] name = "solana-measure" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13208871c6d000a0c7b7546ae605934f5eda3745f80f6926da1b6097c08f2de2" +checksum = "24fa953c2b49a131492b5927e714ab60b7b927610c7ed3355b9ad28909622b5e" [[package]] name = "solana-metrics" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555986e126fe32ad94217c5d87c94f79b7f13abf96ef9d8de20dacbcf1c407e5" +checksum = "cce8eeecdde1cfed801d0d8683856e0e0cc731119894a7ae77a966915cf84964" dependencies = [ "crossbeam-channel", "gethostname", @@ -8106,24 +8128,24 @@ dependencies = [ [[package]] name = "solana-msg" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aefec09cb47fb67b8f8c448e03491d4148c1749f27dcb74d1cfae6337695f94" +checksum = "80dde3316c6ee6e8d57bf105139ec93f8c32a42fe3ec42a3cda2ca9efb72c0e6" dependencies = [ "solana-define-syscall", ] [[package]] name = "solana-native-token" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81520eff9f776e62faa36a07250fcc467e54ca31ca9c87ab566a88b2f2691c05" +checksum = "9e0721f46122a2f1837f571d5a6c1478c962ebefd6d65d02694b3a267b58dbf2" [[package]] name = "solana-net-utils" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b409b10fee2d0cbb2a721fa3ce7d7f6f32e0d3ae1f5807b1d6bc91d75970c72" +checksum = "404052690fb907fdda741f662610ac26c785cdff2154204a109b14d3e2f4b6bd" dependencies = [ "bincode", "crossbeam-channel", @@ -8140,9 +8162,9 @@ dependencies = [ [[package]] name = "solana-packet" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8c6e8a2cb0839ef49d8c6e34e89a5bc5ed97da855bf49528bae8c57eb39ed" +checksum = "39fcc5cf0ef0ac6a62dd09fae772672c2d6865ee1d1ba5fbfbcc94b2c37b2be8" dependencies = [ "bincode", "bitflags 2.8.0", @@ -8154,9 +8176,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa10dd492bee710d0e231a3ff48c52d6e24f5339d97decaf1f0ddbde996f834" +checksum = "2fed01176ddc5ade70e0782b3eeea0f5e98f183dc5b225e4e051834e63a288c0" dependencies = [ "ahash", "bincode", @@ -8181,9 +8203,9 @@ dependencies = [ [[package]] name = "solana-precompile-error" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c01aefc15c451b4f573c1e4552f34ee8af53db285ee2f7ece17ef8b70d6c0a" +checksum = "54310052930124b78392b03d802aa465afe6fded96d97f2e6ca6b1dead85d8d9" dependencies = [ "num-traits", "solana-decode-error", @@ -8191,9 +8213,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3a72c5eafd348bc5e5b731b40ad8dfde3023632e34e5ca9e52a655266ffae7" +checksum = "12511916a9658664921ca12dd6214910de655ac9955159c1e9871bd516936cac" dependencies = [ "base64 0.22.1", "bincode", @@ -8264,9 +8286,9 @@ dependencies = [ [[package]] name = "solana-program-entrypoint" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "269ccabf1f3aff504a97aca0f8b72e6d3e1b7fb621cc18a2d21a28b17d52e112" +checksum = "c3422fa98d2ac5b20df9c9feb9f638e1170341b3c4259c26cd91a6a7098f6830" dependencies = [ "solana-account-info", "solana-msg", @@ -8276,9 +8298,9 @@ dependencies = [ [[package]] name = "solana-program-error" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f7a81eeb5c3d44b2953c46215af390ca2951a0b8069836ffbf3d368b012b35" +checksum = "6a2ea6d8e88767586e6d547e5afb00cda08cee79c986443b2d47236aac50a755" dependencies = [ "borsh 1.5.5", "num-traits", @@ -8292,9 +8314,9 @@ dependencies = [ [[package]] name = "solana-program-memory" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1debcdd14cee4dbc2761c1e267e8888188fb469956df0e2144cd6e2962c2532a" +checksum = "716e1c9cbd3c5e9d9147ffb7e74815cfb34ff7a3196127da64aa8d1866beab52" dependencies = [ "num-traits", "solana-define-syscall", @@ -8302,24 +8324,24 @@ dependencies = [ [[package]] name = "solana-program-option" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b49ce216cce72eb0607610d2040b1979d999fe204f73ae2a669c2f4480d3c0" +checksum = "15c8ffad2c86e5de375ae5f0a46f64eb5897a63c514e958e908c1a98059c57d4" [[package]] name = "solana-program-pack" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ff47a5dd9881187e85a45641405d9d1c57e9ebdc813e2ff74a1aa1f1ec9042" +checksum = "4c185f9170ac85a93d5caaaaf5fe7bf0d49febdb329506bd7ea13716e4eb0189" dependencies = [ "solana-program-error", ] [[package]] name = "solana-program-runtime" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d4647f4dfed31aaa307d8c4924fec3fc981e88dd340eec45273afa84f3d01a4" +checksum = "b5cf60b4b2d8d70b082d03973b8e646ca1c65351eb12ab33427c2df40cd178cf" dependencies = [ "base64 0.22.1", "bincode", @@ -8347,9 +8369,9 @@ dependencies = [ [[package]] name = "solana-pubkey" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02016ff5f98314c886e219c023bffba188ad8d70dec007247bd7a9da50423ac0" +checksum = "fdb80787769457f022a39a55cf439d1996aeecc2364c99483c97318d80f15436" dependencies = [ "borsh 0.10.4", "borsh 1.5.5", @@ -8374,9 +8396,9 @@ dependencies = [ [[package]] name = "solana-pubsub-client" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af610bc169985b016e1f66bc9f0cc19559c9da5fb6ee0b8984ea69b1302e6619" +checksum = "d8d5e1c9d387f98d46a675f418f29b73a5555ceddc2800faa38ce2f87feba3b2" dependencies = [ "crossbeam-channel", "futures-util", @@ -8399,9 +8421,9 @@ dependencies = [ [[package]] name = "solana-quic-client" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa9aed25872d9af165499a9a2167d489ceb832d5e6eaa1aafa982286f62e06d" +checksum = "8579061d3a98f3b6b45f675da8b4fdcf435109ef6c6269b95ee0f33a52a5ac4d" dependencies = [ "async-lock", "async-trait", @@ -8425,9 +8447,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d0ea6818ea3ae2067b18ba8f82577de19094d7abbb918ffb5cf5d7b0a6ffe88" +checksum = "5cac659c899faffd06d57164fbdf142d7395e147843031ecd0ec48ee11be3b06" dependencies = [ "lazy_static", "num_cpus", @@ -8435,9 +8457,9 @@ dependencies = [ [[package]] name = "solana-rent" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "544fab48aacd3b9c740ef5206f30e8a44ef8bfe5676a9d7b1eed385265ec1265" +checksum = "88b4cd58602eb0c2250cd83a8cc8287ca6271b99af95d2a33250e6592c04e286" dependencies = [ "serde", "serde_derive", @@ -8447,9 +8469,9 @@ dependencies = [ [[package]] name = "solana-rpc-client" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff2d4562f555ed4ca406d88483f2b8ad0248e41ea19721227ffb5c64529bff2" +checksum = "3102d6dfbadc375f22f7413effafcf2d7d2cb3e8cdf64f366dacd7c5cbae27cb" dependencies = [ "async-trait", "base64 0.22.1", @@ -8474,9 +8496,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-api" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a50f6a180457400c9843980f1dd5db32b1153c295005ca85edb84bb7625acae" +checksum = "3c9ca3a7af9655a401c285f953c22525cad2698913ea4fa28cf217965929f80a" dependencies = [ "anyhow", "base64 0.22.1", @@ -8498,9 +8520,9 @@ dependencies = [ [[package]] name = "solana-rpc-client-nonce-utils" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fa3be2840d3b8ebbdab96f62f59e0a9e6f9ba10f27b96a7d80d6897b15ff21a" +checksum = "551090640700bbb5f2b593a1f6146603cab53fc13a94120d28180f9941dc9ab2" dependencies = [ "solana-rpc-client", "solana-sdk", @@ -8509,15 +8531,15 @@ dependencies = [ [[package]] name = "solana-sanitize" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9677531dd4098d078515c66d69a04bfa0389d364a5c768561c719030b368a9db" +checksum = "74c557ff8937946d24c4f188f3029c1fdba4e23a15ed11cc8b31a72017e911d5" [[package]] name = "solana-sdk" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf93cfd5f5af23b59789eba96b6a6afd92a3a18a3fc6652259bfa1f32743caf4" +checksum = "0d755acdf62b367c1c4ca7ac1069c34a090d281b6425d11dd9410d4a147d99d3" dependencies = [ "bincode", "bitflags 2.8.0", @@ -8579,9 +8601,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bded40f70accbe97030e5f7163017605e51a2631425229ec2b0a4339bd1163a" +checksum = "9055600bc70a91936458b3a43a4173f8b8cd4ee64a0dc83cbb00737cadc519a5" dependencies = [ "bs58 0.5.1", "proc-macro2", @@ -8591,9 +8613,9 @@ dependencies = [ [[package]] name = "solana-secp256k1-recover" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee25b962814dec3c141e8182474046bae231f0521ed62c9bfdfb6722999ddc18" +checksum = "b904576bfc5b72172aed9c133fe54840625ab9d510bd429d453c54bd6e4245c3" dependencies = [ "borsh 1.5.5", "libsecp256k1", @@ -8603,9 +8625,9 @@ dependencies = [ [[package]] name = "solana-secp256r1-program" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec53eff8861ab398b9ca4da7ef8c8da5d4170f8ea26557fc1581638b56326c1" +checksum = "c3c1329b7faa66f80bb3dadcece042589d22881120b6c0d0f712f742ad002f26" dependencies = [ "bytemuck", "openssl", @@ -8623,18 +8645,18 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-serde-varint" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ff77c37cb995cc53ce1a4b78e5e9961957098677de6fdc6a4783ed37a8b0fcd" +checksum = "e741efbc732c2e33fd600d39a5a5e63cbab18fc75fc84a98df68c2aa2b373b64" dependencies = [ "serde", ] [[package]] name = "solana-serialize-utils" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a10eb6e3177828145beaba85d352a4dbc47798fd95c5f86145e1a732684d6d" +checksum = "b2a6511f5147f992239415bd4bb297ad593da57b4ab634ed9bc10f81a560bc90" dependencies = [ "solana-instruction", "solana-pubkey", @@ -8643,9 +8665,9 @@ dependencies = [ [[package]] name = "solana-sha256-hasher" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c4229293979bf8bda7db2243ae75e13695341375577a4c44b07e4f0b7a5d9e" +checksum = "3456f5d3868b9ae8e7bc53529bbbd8bee48b0d9cf3783f918269e71e4ee5268d" dependencies = [ "sha2 0.10.8", "solana-define-syscall", @@ -8654,18 +8676,18 @@ dependencies = [ [[package]] name = "solana-short-vec" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a2a88d56e6771329970059bcab0fde9a719c8edae173fb26b2c08e427495a" +checksum = "01771c84475e25352169e3fc901cae565f75ff8c9b40a4fa858f776211f20cbc" dependencies = [ "serde", ] [[package]] name = "solana-signature" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1e8a078879d8430cdfbee8e3c1cdf17da74c19d304662580fc463dc91e17699" +checksum = "1f89b547c800c3541d4d5d71de8c82f37a0050f361626213a425ad4f767da27b" dependencies = [ "bs58 0.5.1", "ed25519-dalek 1.0.1", @@ -8678,9 +8700,9 @@ dependencies = [ [[package]] name = "solana-slot-hashes" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88fa2a6e60f2d7016cf95429e0f60cf4a04d4eed167abd1a5f8b08cbda695893" +checksum = "3012c024a81d591d02a10648d5f4256d6fc3c9d93bc5421cadba224794940f6c" dependencies = [ "serde", "serde_derive", @@ -8690,9 +8712,9 @@ dependencies = [ [[package]] name = "solana-slot-history" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fa66272c308c39a3ce1ca2a9c422de4bdedc28cfe706d6f2c68727bb626eb7" +checksum = "817a68e2aae8fbcf00adef67eba05c513b0a461b5ed1fd0bd2cb1299a394a650" dependencies = [ "bv", "serde", @@ -8702,9 +8724,9 @@ dependencies = [ [[package]] name = "solana-stable-layout" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2243571ebf8c0c9915c7e71b17469e173c6755fa58af8eb529db3dda84e3e19a" +checksum = "ec316bf731aeb8e9e8a55634efb938eaf5c979d71a9e7d3de54f5848da4994a2" dependencies = [ "solana-instruction", "solana-pubkey", @@ -8712,9 +8734,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fddc2b38975c25199456ff46307c484affb459b84aedefe9618aece2a92326a9" +checksum = "4631cb6e5291e226068e73cf98b4962056eb3c1c32448ce7b8e9f31df522263c" dependencies = [ "async-channel", "bytes", @@ -8750,18 +8772,18 @@ dependencies = [ [[package]] name = "solana-sysvar-id" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5822b63dd59f124e4920df8d87640a288bb40f4016fd275d028fee0b94a5a51e" +checksum = "8a6ca7b6e6bf9f8c0de74e90546426190385a1c0b8e4d4f1975165f2335f9dc0" dependencies = [ "solana-pubkey", ] [[package]] name = "solana-thin-client" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1915dcb44dd5763a30aa32a687057e6a3b16781eb9f5db2800548990560272c3" +checksum = "581ee5cfdd3c509dc7d744970e5e978dab475fff68058a1198bdaf95e9240eaa" dependencies = [ "bincode", "log", @@ -8774,9 +8796,9 @@ dependencies = [ [[package]] name = "solana-timings" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "088c4507c8fd4f81c4039d78baf1ea7d68c8b80b2a973ba60838d33d2f7e752d" +checksum = "39f948e963c99cee7d2a14da5faf864cb4ae298f8cb679fc088ec581d9d76aed" dependencies = [ "eager", "enum-iterator", @@ -8785,9 +8807,9 @@ dependencies = [ [[package]] name = "solana-tpu-client" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f944cd29eb540ca7e8df03c4e6043d5b8042eadab29b1848245c847a7c7c555" +checksum = "b7f832646c0c836f54998c07d34980852837ea30de0f383c8eb0b5ad2a60cc05" dependencies = [ "async-trait", "bincode", @@ -8808,9 +8830,9 @@ dependencies = [ [[package]] name = "solana-transaction-error" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd92caae17b4b828864b85cecf6dba6a87ad0ac433606b8bbd58334c74d0251" +checksum = "ec8a6d17d8de8549df56d64b9af314eec3c4b705372790aa8dde7196e1c5f005" dependencies = [ "serde", "serde_derive", @@ -8820,9 +8842,9 @@ dependencies = [ [[package]] name = "solana-transaction-metrics-tracker" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "551dc5dad276919d24287e14e410759e93b801f2ca47dd9ad6c75eb49af26607" +checksum = "1906692abc629b5a2a76c76f3006dd4a9e96917000b043fd311d7bfbc24607f2" dependencies = [ "base64 0.22.1", "bincode", @@ -8836,9 +8858,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f73cd35a23e9d6e289a9bf7bf32c1e972bb88bbb5ec434f43b445286b6ea3079" +checksum = "eadee373e77a84b180d955847e7f013195b43498e1a8c526c27771e8d0140915" dependencies = [ "Inflector", "base64 0.22.1", @@ -8864,9 +8886,9 @@ dependencies = [ [[package]] name = "solana-transaction-status-client-types" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897c0015c246cb9b98cfaee15921c89cd7c1503bd368e9a3fd9336c17cd6be25" +checksum = "bfc4018fa5363ccf0932b26821abf47c226f52fb865b2944d1f29db83a11774a" dependencies = [ "base64 0.22.1", "bincode", @@ -8882,9 +8904,9 @@ dependencies = [ [[package]] name = "solana-type-overrides" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f8e0b8916e7d78678428ca5d669950f6259ac332eab953ed0c8c2c88eebd3d2" +checksum = "9673b27fb01b5479a25bfdd83d5ea1112433c8cf81a0aa8616c829587b285ecd" dependencies = [ "lazy_static", "rand 0.8.5", @@ -8892,9 +8914,9 @@ dependencies = [ [[package]] name = "solana-udp-client" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f5c6096b155fb1fb73d03fec2264a9671cbe208f71c4c32521ee9c979d91c75" +checksum = "c9a073d7abe99c118378562f2f39037b5f66f926c668cc1162de327b20bbd82c" dependencies = [ "async-trait", "solana-connection-cache", @@ -8907,9 +8929,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae093290bf86006e323e883b9df845e4bdf84f23c37067cfa9837918ed04c87d" +checksum = "9ce3a7b94b3772a3dc66b28f2b6abc7b4b510dbc36387b618398111acc26ec57" dependencies = [ "semver 1.0.25", "serde", @@ -8921,9 +8943,9 @@ dependencies = [ [[package]] name = "solana-vote" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8421891f95fe3b8291205e37043396c0fb26c2896cc94d53b153e1ba180992fa" +checksum = "5b1a73fa59c07095599091dd9f026aceb478109d61d41720883a22ead9c18f8e" dependencies = [ "itertools 0.12.1", "log", @@ -8935,9 +8957,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf72a022dbb24dcfe1588aa09679042866eb7c0796ea479500ebe9355a7017f" +checksum = "573944c767e4908d6ba12151029cb9ac33b49e7082991c6d978d3ab83ac68d6b" dependencies = [ "bincode", "log", @@ -8955,9 +8977,9 @@ dependencies = [ [[package]] name = "solana-zk-sdk" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c19f36d9e5227b4d94e651501a1ab15d58480d93e03d8340cc8593758e50530" +checksum = "0e5f33e61ecb86621dd7b47e164ec09021b0c910a79e3a6b17ae763554ad7138" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -8987,9 +9009,9 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "2.1.10" +version = "2.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b8cc94d7eddf6606c22504889b6528734db56ed3c2f651641453d13c9b233d7" +checksum = "6b9c007da85c5be2273c96647e4070bf69b2fda7ba43cddf5eab84c14b2fad67" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -10289,9 +10311,9 @@ checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "11cd88e12b17c6494200a9c1b683a04fcac9573ed74cd1b62aeb2727c5592243" [[package]] name = "unicode-width" @@ -10869,7 +10891,7 @@ dependencies = [ [[package]] name = "wormhole-bridge-client" version = "0.1.0" -source = "git+https://github.com/Near-One/bridge-sdk-rs?branch=feat%2Fnear-fin-transfer-with-evm-proof#05110e09afae0a05c6416b8a74a735c8f7903b25" +source = "git+https://github.com/Near-One/bridge-sdk-rs#dad70085ca25c28b2438a2fa5e3bf57f1bcd21f3" dependencies = [ "bridge-connector-common", "derive_builder 0.20.2", diff --git a/omni-relayer/Cargo.toml b/omni-relayer/Cargo.toml index 153c58b4..9127aa93 100644 --- a/omni-relayer/Cargo.toml +++ b/omni-relayer/Cargo.toml @@ -41,16 +41,16 @@ alloy = { version = "0.9", features = ["node-bindings", "providers", "rpc-types" redis = { version = "0.28.1", features = ["aio", "tokio-comp"] } reqwest = "0.12" -eth-proof = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "eth-proof", branch = "feat/near-fin-transfer-with-evm-proof" } +eth-proof = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "eth-proof" } -bridge-connector-common = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "bridge-connector-common", branch = "feat/near-fin-transfer-with-evm-proof" } +bridge-connector-common = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "bridge-connector-common" } -near-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } -evm-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "evm-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } -solana-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "solana-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } -wormhole-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "wormhole-bridge-client", branch = "feat/near-fin-transfer-with-evm-proof" } +near-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "near-bridge-client" } +evm-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "evm-bridge-client" } +solana-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "solana-bridge-client" } +wormhole-bridge-client = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "wormhole-bridge-client" } -omni-connector = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "omni-connector", branch = "feat/near-fin-transfer-with-evm-proof" } +omni-connector = { git = "https://github.com/Near-One/bridge-sdk-rs", package = "omni-connector" } [features] disable_fee_check = []